浅析API网关——Ocelot[网关]+Consul[服务发现负载均衡]+Polly[服务熔断]+Ids4[服务认证]
API网关
本文将讲述以下内容:
概念------为什么------如何使用oclet-----内部概念(上游和下游)、路由-----ocelot内部运行原理-----如何做步骤-----ocelot配置文件介绍----路由基本使用----路由负载均衡------路由consul支持-----路由多个服务操作-----路由多个服务聚合----路由限流----路由熔断----路由缓存----路由身份验证。
1.什么是API网关
就是用来限制客户端访问服务端api一到门槛,在图例中已经进行了展示
1.1 什么是API
API是Application Programming Interface缩写,翻译成中文就是应用程序接口。在实际微服务中可以理解一个个功能方法。就比如你一个用户服务的微服务,可以对外提供 API 接口为,查找用户,创建用户等。
1.2 什么是网关
网关, wiki 上定义。
在计算机网络中,网关(英语:Gateway)是转发其他服务器通信数据的服务器,接收从客户端发送来的请求时,它就像自己拥有资源的源服务器一样对请求进行处理
2.为什么要使用微服务网关
2.1 大概有4四种情况
1、聚合微服务增多,导致客户端不好维护
2、聚合微服务进行集群
2.1 增加和修改聚合微服务集群,都要修改客户端,导致客户端不稳定
2.2 服务集群,无法解决复杂均衡的问题
3、客户端访问多个聚合微服务
3.1 如果需要对客户端身份验证和授权,会导致每个服务都进行授权
3.2 如何客户端访问过大,无法限制客户端流量,导致系统宕机
3.3 如果客户端访问微服务系统,每个微服务之间进行调用。会导致耗时操作很难统计。
3.4 如果客户端访问微服务系统,如何统计客户端的调用日志
2.2 总结:
1、聚合微服务增多,导致客户端不好维护
2、聚合微服务进行集群
2.1 增加和删除聚合微服务集群节点,都要去修改客户端
2.2 服务集群,会有负载均衡问题
3、客户端访问聚合微服务
3.1 存在安全问题,
3.2 并发量大问题
3.3 性能调优问题,链路追踪
3.4 微服务访问日志问题
3. 如何在项目中使用API网关
3.1 API网关类型
1、Netflix Zuul +java实现
2、Kong nginx +lua脚本实现
3、Tyk go语言开发,收费版本
4、Ocelot aspnetcore开发的
3.2 如何在项目中使用Ocelot
3.2.1 Ocelot是什么
简单的来说Ocelot是一堆的asp.net core middleware组成的一个管道。当它拿到请求之后会用一个request builder来构造一个HttpRequestMessage发到下游的真实服务器,等下游的服务返回response之后再由一个middleware将它返回的HttpResponseMessage映射到HttpResponse上。
3.2.2 Ocelot内部概念
上游
Ocelot为上游:Upstream
下游
Ocelot下面映射的服务为下游:Downstream
主要功能
1、路由
1.1 接受客户端请求
1.2 奖客户端请求转换成下游地址
1.3 调用下游服务,并返回结果
1.4 将下游服务返回的结果返回到前端
2、认证
3、授权
4、负载均衡
5、链路监控
6、限流
7、熔断降级
8、请求聚合
9、Service Fabric
等其他功能
3.2.3 Ocelot文档地址
中文文档:http://www.jessetalk.cn/2018/03/19/net-core-apigateway-ocelot-docs/
英文文档:https://ocelot.readthedocs.io/en/latest/introduction/gettingstarted.html
3.2.4 Ocelot如何使用
条件
1、aspnetcore3.1
2、Ocelot
3、团队微服务
4、ocelot.json文件
步骤
1、创建一个空的aspnetcore3.1项目
2、通过nuget安装Ocelot
3、创建Ocelot配置文件ocelot.json
{"ReRoutes": [],"GlobalConfiguration": {"BaseUrl": "https://api.mybusiness.com"}
}
要特别注意一下BaseUrl是我们外部暴露的Url,比如我们的Ocelot运行在http://123.111.1.1的一个地址上,但是前面有一个 nginx绑定了域名http://api.jessetalk.cn,那这里我们的BaseUrl就是 http://api.jessetalk.cn。
4、加载ocelot.json配置文件
public static IHostBuilder CreateHostBuilder(string[] args) =>Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder =>{webBuilder.UseStartup<Startup>();webBuilder.ConfigureAppConfiguration((hostingContext, config) =>{// 1、加载ocelot配置文件config.AddJsonFile("ocelot.aggregate.json");});});
5、配置Ocelot依赖注入并加载配置文件
public void ConfigureServices(IServiceCollection services)
{services.AddOcelot()
}
6、配置Ocelot中间件
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{if (env.IsDevelopment())
{app.UseDeveloperExceptionPage();
}
app.UseOcelot().Wait();
}
3.2.5 Ocelot如何使用路由
一个路由完整配置
{"DownstreamPathTemplate": "/","UpstreamPathTemplate": "/","UpstreamHttpMethod": ["Get"],"AddHeadersToRequest": {},"AddClaimsToRequest": {},"RouteClaimsRequirement": {},"AddQueriesToRequest": {},"RequestIdKey": "","FileCacheOptions": {"TtlSeconds": 0,"Region": ""},"ReRouteIsCaseSensitive": false,"ServiceName": "","DownstreamScheme": "http","DownstreamHostAndPorts": [{"Host": "localhost","Port": 51876,}],"QoSOptions": {"ExceptionsAllowedBeforeBreaking": 0,"DurationOfBreak": 0,"TimeoutValue": 0},"LoadBalancer": "","RateLimitOptions": {"ClientWhitelist": [],"EnableRateLimiting": false,"Period": "","PeriodTimespan": 0,"Limit": 0},"AuthenticationOptions": {"AuthenticationProviderKey": "","AllowedScopes": []},"HttpHandlerOptions": {"AllowAutoRedirect": true,"UseCookieContainer": true,"UseTracing": true},"UseServiceDiscovery": false
}
- Downstream是下游服务配置
- UpStream是上游服务配置
- Aggregates 服务聚合配置
- ServiceName, LoadBalancer, UseServiceDiscovery 配置服务发现
- AuthenticationOptions 配置服务认证
- RouteClaimsRequirement 配置Claims鉴权
- RateLimitOptions为限流配置
- FileCacheOptions 缓存配置
- QosOptions 服务质量与熔断
- DownstreamHeaderTransform头信息转发
路由基本使用
{"DownstreamPathTemplate": "/api/post/{postId}",
"DownstreamScheme": "https",
"DownstreamHostAndPorts": [
{"Host": "localhost",
"Port": 80,
}
],
"UpstreamPathTemplate": "/post/{postId}",
"UpstreamHttpMethod": [ "Get"]
}
- DownstreamPathTemplate:下游路径模板
- DownstreamScheme:下游服务http schema
- DownstreamHostAndPorts:下游服务的地址,如果使用LoadBalancer的话这里可以填多项
- UpstreamPathTemplate: 上游也就是用户输入的请求Url模板
- UpstreamHttpMethod: 上游请求http方法,可使用数组
路由负载均衡
{"DownstreamPathTemplate": "/api/posts/{postId}","DownstreamScheme": "https","DownstreamHostAndPorts": [{"Host": "10.0.1.10","Port": 5000,},{"Host": "10.0.1.11","Port": 5000,}],"UpstreamPathTemplate": "/posts/{postId}","LoadBalancerOptions": {"Type": "LeastConnection"},"UpstreamHttpMethod": [ "Put", "Delete" ]
}
LoadBalancer将决定负载均衡的算法
- LeastConnection – 将请求发往最空闲的那个服务器
- RoundRobin – 轮流发送
- NoLoadBalance – 总是发往第一个请求或者是服务发现
路由Consul负载均衡
条件:
1、Ocelot.Provider.Consul
2、Consul
3、Ocelot
步骤
1、通过nuget下载Ocelot.Provider.Consul
2、添加consul依赖注入
public void ConfigureServices(IServiceCollection services)
{// 1、添加网关Ocelot到ioc容器services.AddOcelot().AddConsul();
}
3、路由consul配置
{"DownstreamPathTemplate": "/api/posts/{postId}","DownstreamScheme": "https","UpstreamPathTemplate": "/posts/{postId}","UpstreamHttpMethod": [ "Put" ],"ServiceName": "product","LoadBalancerOptions": {"Type": "LeastConnection"},
}
多个路由配置(多项目)
条件
1、TeamService,MemberService
2、ocelot.team.json,ocelot.member.json
步骤
1、创建ocelot.team.json,ocelot.member.json文件
2、配置动态加载ocelot.json配置文件
webBuilder.ConfigureAppConfiguration((hostingContext, config) =>
{config// .SetBasePath(hostingContext.HostingEnvironment.ContentRootPath)// .AddJsonFile("appsettings.json", true, true)// .AddJsonFile($"appsettings.{hostingContext.HostingEnvironment.EnvironmentName}.json", true, true).AddOcelot(hostingContext.HostingEnvironment);// .AddEnvironmentVariables();
});
会自动的加载配置文件,然后进行合并,主要用于大项目配置
3、ocelot依赖注入配置
public void ConfigureServices(IServiceCollection services){// 1、添加网关Ocelot到ioc容器services.AddOcelot();}
路由聚合请求
{"ReRoutes": [{"DownstreamPathTemplate": "/","UpstreamPathTemplate": "/laura","UpstreamHttpMethod": ["Get"],"DownstreamScheme": "http","DownstreamHostAndPorts": [{"Host": "localhost","Port": 51881}],"Key": "Laura"},{"DownstreamPathTemplate": "/","UpstreamPathTemplate": "/tom","UpstreamHttpMethod": ["Get"],"DownstreamScheme": "http","DownstreamHostAndPorts": [{"Host": "localhost","Port": 51882}],"Key": "Tom"}],"Aggregates": [{"ReRouteKeys": ["Tom","Laura"],"UpstreamPathTemplate": "/"}]
}
当我们请求/的时候,会将/tom和/laura两个结果合并到一个response返回
{"Tom":{"Age": 19},"Laura":{"Age": 25}}
需要注意的是:
- 聚合服务目前只支持返回json
- 目前只支持Get方式请求下游服务
- 任何下游的response header并会被丢弃
- 如果下游服务返回404,聚合服务只是这个key的value为空,它不会返回404
有一些其它的功能会在将来实现
- 下游服务很慢的处理
- 做一些像 GraphQL的处理对下游服务返回结果进行处理
- 404的处理
路由限流
"RateLimitOptions": {"ClientWhitelist": [],"EnableRateLimiting": true,"Period": "5m","PeriodTimespan": 1,"Limit": 1
}
ClientWihteList 白名单
EnableRateLimiting 是否启用限流
Period 统计时间段:1s, 5m, 1h, 1d
PeroidTimeSpan 多少秒之后客户端可以重试
Limit 在统计时间段内允许的最大请求数量
在 GlobalConfiguration下我们还可以进行以下配置
"RateLimitOptions": {"DisableRateLimitHeaders": false,"QuotaExceededMessage": "Customize Tips!","HttpStatusCode": 999,"ClientIdHeader" : "Test"
}
- Http头 X-Rate-Limit 和 Retry-After 是否禁用
- QuotaExceedMessage 当请求过载被截断时返回的消息
- HttpStatusCode 当请求过载被截断时返回的http status
- ClientIdHeader 用来识别客户端的请求头,默认是 ClientId
路由服务质量与熔断
条件
1、Ocelot.Provider.Polly
步骤
1、在ocelot上添加熔断
public void ConfigureServices(IServiceCollection services)
{// 1、添加网关Ocelot到ioc容器services.AddOcelot(new ConfigurationBuilder().AddJsonFile("ocelot.aggregate.json").Build()).AddConsul().AddPolly();
}
2、添加熔断配置
熔断的意思是停止将请求转发到下游服务。当下游服务已经出现故障的时候再请求也是功而返,并且增加下游服务器和API网关的负担。这个功能是用的Pollly来实现的,我们只需要为路由做一些简单配置即可
"QoSOptions": {"ExceptionsAllowedBeforeBreaking":3,"DurationOfBreak":5,"TimeoutValue":5000
}
- ExceptionsAllowedBeforeBreaking 允许多少个异常请求
- DurationOfBreak 熔断的时间,单位为秒
- TimeoutValue 如果下游请求的处理时间超过多少则自动将请求设置为超时
路由缓存
Ocelot可以对下游请求结果进行缓存 ,目前缓存的功能还不是很强大。它主要是依赖于CacheManager 来实现的,我们只需要在路由下添加以下配置即可
"FileCacheOptions": { "TtlSeconds": 15, "Region": "somename" }
Region是对缓存进行的一个分区,我们可以调用Ocelot的 administration API来移除某个区下面的缓存 。
路由认证(Identity Server4)
步骤
Identity Server Bearer Tokens
添加Identity Server的认证也是一样
public void ConfigureServices(IServiceCollection services)
{var authenticationProviderKey = "TestKey";var options = o =>{o.Authority = "https://whereyouridentityserverlives.com";o.ApiName = "api";o.SupportedTokens = SupportedTokens.Both;o.ApiSecret = "secret";};services.AddAuthentication().AddIdentityServerAuthentication(authenticationProviderKey, options);services.AddOcelot();
}
Allowed Scopes
这里的Scopes将从当前 token 中的 claims中来获取,我们的鉴权服务将依靠于它来实现 。当前路由的下游API需要某个权限时,我们需要在这里声明 。和oAuth2中的 scope意义一致。
路由鉴权
我们通过认证中的AllowedScopes 拿到claims之后,如果要进行权限的鉴别需要添加以下配置
"RouteClaimsRequirement": {"UserType": "registered"
}
当前请求上下文的token中所带的claims如果没有 name=”UserType” 并且 value=”registered” 的话将无法访问下游服务。
路由请求头转化
请求头转发分两种:转化之后传给下游和从下游接收转化之后传给客户端。在Ocelot的配置里面叫做Pre Downstream Request和Post Downstream Request。目前的转化只支持查找和替换。我们用到的配置主要是 UpstreamHeaderTransform 和 DownstreamHeaderTransform
Pre Downstream Request
"Test": "http://www.bbc.co.uk/, http://ocelot.com/"
比如我们将客户端传过来的Header中的 Test 值改为 http://ocelot.com/之后再传给下游
"UpstreamHeaderTransform": {"Test": "http://www.bbc.co.uk/, http://ocelot.com/"
},
Post Downstream Request
而我们同样可以将下游Header中的Test再转为 http://www.bbc.co.uk/之后再转给客户端。
"DownstreamHeaderTransform": {"Test": "http://www.bbc.co.uk/, http://ocelot.com/"
},
浅析API网关——Ocelot[网关]+Consul[服务发现负载均衡]+Polly[服务熔断]+Ids4[服务认证]相关推荐
- .net core grpc consul 实现服务注册 服务发现 负载均衡(二)
在上一篇 .net core grpc 实现通信(一) 中,我们实现的grpc通信在.net core中的可行性,但要在微服务中真正使用,还缺少 服务注册,服务发现及负载均衡等,本篇我们将在 .net ...
- .net core Ocelot Consul 实现API网关 服务注册 服务发现 负载均衡
大神张善友 分享过一篇 <.NET Core 在腾讯财付通的企业级应用开发实践>里面就是用.net core 和 Ocelot搭建的可扩展的高性能Api网关. Ocelot(http:// ...
- 读猿码系列——1. gRPC+Etcd3的服务发现负载均衡
项目源码:https://github.com/wwcd/grpc-lb 项目文档:https://segmentfault.com/a/1190000008672912 我们先把项目down下来,它 ...
- Marahon-lb的服务发现/负载均衡
http://blog.csdn.net/mesos/article/details/52192538 Marahon-lb向DC/OS环境提供服务发现即负载均衡能力,不同的使用场景可以利用其不同的发 ...
- 客户端负载均衡与服务端负载均衡
原文:https://segmentfault.com/a/1190000011081111 通过Nginx负载均衡服务器发送到不同的上游服务器去处理,这种负载均衡就是一种典型的服务端负载均衡,那么客 ...
- 客户端负载均衡与服务端负载均衡对比
客户端 服务端 开发团队灵活修改 运维人员把控修改 运维成本低,开发人员直接可以修改 运维成本高 强依赖注册中心 不依赖注册中心 微服务框架 tomcat等传统应用 服务端负载均衡 负载均衡是我们处理 ...
- SpringCloud微服务-服务注册发现-负载均衡-服务调用-服务降级-服务网关-配置中心-消息总线-消息驱动-链路追踪-alibaba-nacos-sentinel-seata理论原理分析
SpringCloud理论技术 概述 Spring Cloud是一系列框架的有序集合.它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册.配置中心.消息总 ...
- LVS实现web服务的负载均衡
本节索引 Ipvsadm工具介绍 Web服务的负载均衡 实现http与https的同时调度 1 ipvsadm工具 我们知道LVS项目已提供了一个实现可伸缩网络服务的Linux Virtual Ser ...
- java负载均衡框架_SpringCloud与Consul集成实现负载均衡功能
负载均衡(Load Balance,简称LB)是一种服务器或网络设备的集群技术.负载均衡将特定的业务(网络服务.网络流量等)分担给多个服务器或网络设备,从而提高了业务处理能力,保证了业务的高可用性.负 ...
- 服务端负载均衡和客户端负载均衡
服务端负载均衡 用户在App访问通过80端口请求nginx,ngin来实现负载均衡,分发请求 客户端负载均衡 Eureka Server注册中心集群部署,goods_services服务提供者启动后向 ...
最新文章
- 在redhat6.4下安装 Oracle® Database 11g Release 2
- Tomcat修改端口、添加域名访问
- 圣杯布局简单结构代码!
- 40岁的程序员还能找到工作吗_如果程序员已经到三十岁了,那他还能找到满意的工作吗?...
- 推荐 10 本好书,并送上 110 本!
- 使用 ADS 渲染 SAP Adobe Form 的性能分析
- python 示例_是Python中带有示例的关键字
- Centos 6.5(64bit)上安装Vertica single node
- Java并发编程,Condition的await和signal等待通知机制
- 爬虫新宠requests_html 带你甄别2019虚假大学 #华为云·寻找黑马程序员#
- HTML5托拽上传(XMLHttpRequest和Google Gears)
- Sqlite中文资料
- Arduino Uno接JQ8900-16p语音播报模块
- Spring中AOP的Introductions使用介绍
- 企业做好绩效管理的四种方法
- 紧耦合LIO综述 | 6篇顶会论文看透紧耦合LIO玩儿法(LIOM/LIO-SAM)
- ElasticStack搭建Java日志收集分析,并将其构建docker镜像-学习笔记
- 记一次对Pixiv日榜的爬虫
- 关于将LIUNX下的图形化操作倾向WINDOWS的几个东西
- Android错误提示及解决方案(持续更新)
热门文章
- logutils java_【java】简单的日志工具类LogUtils
- ASP.NET 安全认证(二)——灵活运用 Form 表单认证中的 deny 与 allow 及保护 .htm 等文件...
- 误差函数拟合优缺点_各大厂商CTR广告预估模型的优缺点对比
- navicat for mysql 10.1.7下载破解(2017.12.30)
- Fortify 5.1漏洞整改方案
- linux 主机管理平台,Linux虚拟主机管理系统directadmin使用中文教程
- IntelliJ IDEA 2016.2 注册破解激活教程
- 使用Axis2实现WebService的发布和调用
- java-数组-数组缩减
- HDU 5855 Less Time, More profit(最大权闭合子图)