前言

上一篇【.Net Core微服务入门全纪录(四)——Ocelot-API网关(上)】已经完成了Ocelot网关的基本搭建,实现了服务入口的统一。当然,这只是API网关的一个最基本功能,它的进阶功能还有很多很多。

服务发现

首先需要解决的就是服务发现的问题,服务发现的优点之前讲过,就不说了。

上一篇中我们的服务地址都是写在ocelot.json配置文件里,现在我们需要结合之前的Consul来实现服务发现。

  • 改造代码:

首先NuGet安装Ocelot.Provider.Consul

修改Startup.cs:

        public void ConfigureServices(IServiceCollection services)
{
//添加ocelot服务
services.AddOcelot()
.AddConsul();//添加consul支持
}

修改ocelot.json配置:

{
"Routes": [
{
"DownstreamPathTemplate": "/products",
"DownstreamScheme": "http",
"UpstreamPathTemplate": "/products",
"UpstreamHttpMethod": [ "Get" ],
"ServiceName": "ProductService",
"LoadBalancerOptions": {
"Type": "RoundRobin"
}
},
{
"DownstreamPathTemplate": "/orders",
"DownstreamScheme": "http",
"UpstreamPathTemplate": "/orders",
"UpstreamHttpMethod": [ "Get" ],
"ServiceName": "OrderService",
"LoadBalancerOptions": {
"Type": "RoundRobin"
}
}
],
"GlobalConfiguration": {
"BaseUrl": "http://localhost:9070",
"ServiceDiscoveryProvider": {
"Scheme": "http",
"Host": "localhost",
"Port": 8500,
"Type": "Consul"
}
}
}

这个配置应该很好理解,就是把我们上次的DownstreamHostAndPorts节点去掉了,然后增加了ServiceDiscoveryProvider服务发现相关配置。

注意,Ocelot除了支持Consul服务发现以外,还有Eureka也可以,Eureka也是一个类似的注册中心。

好了,代码修改就差不多了,下面运行程序测试一下:





客户端正常运行。

至此我们就实现了服务注册与发现和api网关的基本功能。接下来就要提到:服务治理

服务治理

其实服务治理也没有一个非常明确的定义。它的作用简单来说,就是帮助我们更好的管理服务,提升服务的可用性。——缓存,限流,熔断,链路追踪 等等。。。都属于常用的服务治理手段。

之前讲的负载均衡,服务发现也可以算是服务治理。

  • 缓存:

在Ocelot中启用缓存,需要NuGet安装一下Ocelot.Cache.CacheManager

修改Startup.cs中的ConfigureServices()方法:

//添加ocelot服务
services.AddOcelot()
//添加consul支持
.AddConsul()
//添加缓存
.AddCacheManager(x =>
{
x.WithDictionaryHandle();
});

修改ocelot.json配置文件:

{
"Routes": [
{
"DownstreamPathTemplate": "/products",
"DownstreamScheme": "http",
"UpstreamPathTemplate": "/products",
"UpstreamHttpMethod": [ "Get" ],
"ServiceName": "ProductService",
"LoadBalancerOptions": {
"Type": "RoundRobin"
},
"FileCacheOptions": {
"TtlSeconds": 5,
"Region": "regionname"
}
},
{
"DownstreamPathTemplate": "/orders",
"DownstreamScheme": "http",
"UpstreamPathTemplate": "/orders",
"UpstreamHttpMethod": [ "Get" ],
"ServiceName": "OrderService",
"LoadBalancerOptions": {
"Type": "RoundRobin"
},
"FileCacheOptions": {
"TtlSeconds": 5,
"Region": "regionname"
}
}
],
"GlobalConfiguration": {
"BaseUrl": "http://localhost:9070",
"ServiceDiscoveryProvider": {
"Scheme": "http",
"Host": "localhost",
"Port": 8500,
"Type": "Consul"
}
}
}

在Routes路由配置中增加了FileCacheOptions。TtlSeconds代表缓存的过期时间,Region代表缓冲区名称,这个我们目前用不到。

好了,代码修改完需要编译重启一下网关项目,然后打开客户端网站测试一下:



可以看到,5秒之内的请求都是同样的缓存数据。Ocelot也支持自定义缓存。

  • 限流:

限流就是限制客户端一定时间内的请求次数。

继续修改配置:

{
"Routes": [
{
"DownstreamPathTemplate": "/products",
"DownstreamScheme": "http",
"UpstreamPathTemplate": "/products",
"UpstreamHttpMethod": [ "Get" ],
"ServiceName": "ProductService",
"LoadBalancerOptions": {
"Type": "RoundRobin"
},
"FileCacheOptions": {
"TtlSeconds": 5,
"Region": "regionname"
},
"RateLimitOptions": {
"ClientWhitelist": [ "SuperClient" ],
"EnableRateLimiting": true,
"Period": "5s",
"PeriodTimespan": 2,
"Limit": 1
}
},
{
"DownstreamPathTemplate": "/orders",
"DownstreamScheme": "http",
"UpstreamPathTemplate": "/orders",
"UpstreamHttpMethod": [ "Get" ],
"ServiceName": "OrderService",
"LoadBalancerOptions": {
"Type": "RoundRobin"
},
"FileCacheOptions": {
"TtlSeconds": 5,
"Region": "regionname"
},
"RateLimitOptions": {
"ClientWhitelist": [ "SuperClient" ],
"EnableRateLimiting": true,
"Period": "5s",
"PeriodTimespan": 2,
"Limit": 2
}
}
],
"GlobalConfiguration": {
"BaseUrl": "http://localhost:9070",
"ServiceDiscoveryProvider": {
"Scheme": "http",
"Host": "localhost",
"Port": 8500,
"Type": "Consul"
},
"RateLimitOptions": {
"DisableRateLimitHeaders": false,
"QuotaExceededMessage": "too many requests...",
"HttpStatusCode": 999,
"ClientIdHeader": "Test"
}
}
}

在Routes路由配置中增加了RateLimitOptions。ClientWhitelist代表客户端白名单,在白名单中的客户端可以不受限流的影响;EnableRateLimiting代表是否限流;Period代表限流的单位时间,例如1s,5m,1h,1d等;PeriodTimespan代表客户端达到请求上限多少秒后可以重试;Limit代表客户端在定义的时间内可以发出的最大请求数。

在GlobalConfiguration配置中也增加了RateLimitOptions。DisableRateLimitHeaders代表是否禁用X-Rate-Limit和Retry-After标头(请求达到上限时response header中的限制数和多少秒后能重试);QuotaExceededMessage:代表请求达到上限时返回给客户端的消息;HttpStatusCode:代表请求达到上限时返回给客户端的HTTP状态代码。ClientIdHeader可以允许自定义用于标识客户端的标头。默认情况下为“ ClientId”。

最重要的就是Period,PeriodTimespan,Limit这几个配置。

重新编译启动看一下效果:

  • 超时/熔断

超时很好理解,就是网关请求服务时可容忍的最长响应时间。熔断的意思就是当请求某个服务的异常次数达到一定量时,那么网关在一定时间内就不再对这个服务发起请求了,直接熔断。

Ocelot中启用 超时/熔断 需要NuGet安装一下Ocelot.Provider.Polly

修改Startup.cs中的ConfigureServices()方法:

//添加ocelot服务
services.AddOcelot()
//添加consul支持
.AddConsul()
//添加缓存
.AddCacheManager(x =>
{
x.WithDictionaryHandle();
})
//添加Polly
.AddPolly();

同样的在ocelot.json路由配置中增加QoSOptions:

"QoSOptions": {
"ExceptionsAllowedBeforeBreaking": 3,
"DurationOfBreak": 10000,
"TimeoutValue": 5000
}

ExceptionsAllowedBeforeBreaking代表发生错误的次数,DurationOfBreak代表熔断时间,TimeoutValue代表超时时间。

以上的配置意思就是当服务发生3次错误时,那么就熔断10秒,期间客户端的请求直接返回错误,10秒之后恢复。

这个不太好模拟,就不演示了,应该也挺好理解的。

。。。。。。

关于服务治理的学问还有很多,不继续了。。。就到此为止吧。

想要更深入了解Ocelot的,请看官网:https://ocelot.readthedocs.io/en/latest/

或者看源码:https://github.com/ThreeMammals/Ocelot

下一篇准备说一下:事件总线。

代码放在:https://github.com/xiajingren/NetCoreMicroserviceDemo

未完待续...

最新文章

  1. Vue.js 和 MVVM 小细节
  2. 十二、EnterpriseFrameWork框架核心类库之与EntLib结合
  3. 【CodeForces 625A】Guest From the Past
  4. Env:Winmanager插件使用
  5. webview 中 svg的坑
  6. WinSock IO模型 -- WSAEventSelect模型事件触发条件说明
  7. git生成密钥
  8. 前台改变asp button控件的值,后台取值没有改变的问题
  9. xamarin android checkbox自定义样式
  10. 调用sed命令的三种方式
  11. SDOI 2018划水记
  12. jdk5升8问题记录-Spring2升4
  13. Javascript高级编程学习笔记(58)—— 事件(2)事件处理程序
  14. nginx tcp负载均衡 (Module ngx_stream_upstream_module)
  15. Rancher 容器管理平台-实战训练营-免费视频培训
  16. 从开启GTID功能的库同步数据到未开启GTID功能库时,注意事项!
  17. unity中手机触摸代码
  18. HDU1025贫富平衡
  19. 你都掌握了吗?jQuery 选择器大全
  20. C柔性数组

热门文章

  1. MongoDB全球云端技术盛会MongoDB.live
  2. IDEA奇淫小技巧
  3. StreamSets使用指南
  4. lunix如何查看防火墙是否关闭和关闭开启防火墙命令
  5. SpringBoot系列—简单的邮件系统
  6. 【汇总】 为园友写的皮肤制作工具 awescnb
  7. 【docker系列2】docker 的前世今生
  8. jQuery-ajax请求使用
  9. jchdl - GSL实例 - MulC2(有符号数的乘法)
  10. js函数prototype属性学习(二)