.Net Core微服务入门全纪录(五)——Ocelot-API网关(下)

.Net Core微服务入门全纪录(五)——Ocelot-API网关(下),第1张

概述Tips:本篇已加入系列文章阅读目录,可点击查看更多相关文章。 前言 上一篇【.Net Core微服务入门全纪录(四)——Ocelot-API网关(上)】已经完成了Ocelot网关的基本搭建,实现了服

Tips:本篇已加入系列文章阅读目录,可点击查看更多相关文章。

前言

上一篇【.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","UpstreamPathTemplate": "/orders","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","LoadBalancerOptions": {        "Type": "RoundRobin"      },"fileCacheOptions": {        "TtlSeconds": 5,"Region": "regionname"      }    },"Region": "regionname"      }    }  ],"Type": "Consul"    }  }}

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

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


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

限流:

限流就是限制客户端一定时间内的请求次数。
继续修改配置:

{  "Routes": [    {      "DownstreamPathTemplate": "/products","Region": "regionname"      },"Ratelimitoptions": {        "ClIEntWhiteList": [ "SuperClIEnt" ],"EnableRatelimiting": true,"Period": "5s","PeriodTimespan": 2,"limit": 1      }    },"limit": 2      }    }  ],"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

未完待续...

总结

以上是内存溢出为你收集整理的.Net Core微服务入门全纪录(五)——Ocelot-API网关(下)全部内容,希望文章能够帮你解决.Net Core微服务入门全纪录(五)——Ocelot-API网关(下)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1214775.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存