Ocelot之基于Polly熔断
Ocelot之基于Polly熔断
前言
上章节介绍了Ocelot之基于Consul服务发现,这节介绍.NET Core平台下Ocelot之基于Polly熔断。
请求在5秒钟之内没有返回内容,那么本次请求就算超时。要完成这样一个需求,需要用到网关的熔断机制。
环境:Win10+VS2022 +.NET5.0 + Ocelot17.0.0.0 + Consul 1.6.1.1
1 Polly介绍
Polly是一个被.NET基金会认可的弹性和瞬态故障处理库,允许我们以非常顺畅和线程安全的方式来执诸如行重试,断路,超时,故障恢复等策略,其主要功能如下:
l 重试(Retry)
l 断路器(Circuit-Breaker)
l 超时检测(Timeout)
l 缓存(Cache)
l 降级(Fallback)
Polly的策略主要由“故障”和“动作”两个部分组成,“故障”可以包括异常、超时等情况,“动作”则包括Fallback(降级)、重试(Retry)、熔断(Circuit-Breaker)等。策略则用来执行业务代码,当业务代码出现了“故障”中的情况时就开始执行“动作”。
2 熔断
在广义的解释中,熔断主要是指为控制股票、期货或其他金融衍生产品的交易风险,为其单日价格波动幅度规定区间限制,一旦成交价触及区间上下限,交易则自动中断一段时间(“熔即断”),或就此“躺平”而不得超过上限或下限(“熔而不断”)。
而对于微服务来说,熔断就是我们常说的“保险丝”,意为当服务出现某些状况时,切断服务,从而防止应用程序不断地尝试执行可能会失败的操作造成系统的“雪崩”,或者大量的超时等待导致系统卡死等情况,很多地方也将其成为“过载保护”。
3 项目实现
在上节“Ocelot之基于Consul服务发现”的项目实现上继续改造。
3.1 修改接口服务
在获取天气接口中添加打印Log和休眠6秒功能。
[HttpGet] public IEnumerable<WeatherForecast> Get() { _logger.LogInformation("执行"); Thread.Sleep(6000); var rng = new Random(); return Enumerable.Range(1, 5).Select(index => new WeatherForecast { Date = DateTime.Now.AddDays(index), TemperatureC = rng.Next(-20, 55), Summary = Summaries[rng.Next(Summaries.Length)] }) .ToArray(); } |
3.2 修改网关
1.添加Ocelot的Polly依赖
添加Polly依赖后,Yak.Ocelot.Gateway项目文件下添加了下面代码。
<ItemGroup> <PackageReference Include="Ocelot" Version="17.0.0" /> <PackageReference Include="Ocelot.Provider.Consul" Version="17.0.0" /> <PackageReference Include="Ocelot.Provider.Polly" Version="17.0.0" /> </ItemGroup> |
2. 修改ocelot配置文件,添加熔断配置。
{ "Routes": [ { "DownstreamPathTemplate": "/WeatherForecast", "DownstreamScheme": "http", "ServiceName": "service-a", "UseServiceDiscovery": true, "UpstreamPathTemplate": "/Weather", "UpstreamHttpMethod": [ "Get" ], "LoadBalancerOptions": { "Type": "RoundRobin" }, //熔断器Polly "QoSOptions": { "ExceptionsAllowedBeforeBreaking": 3, //打开断路器之前允许的多少个异常请求 "DurationOfBreak": 60000, // 熔断时间 "TimeoutValue": 1000 //请求超时时间(毫秒) } } ], "GlobalConfiguration": { "BaseUrl": "http://localhost:5000" } } |
说明:上面配置是在请求超过1秒将会超时,发生三次超时后保持60秒熔断。
3. 修改Startup,添加Polly服务。
public void ConfigureServices(IServiceCollection services) { services.AddControllers(); services .AddOcelot() .AddConsul() .AddPolly(); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IHostApplicationLifetime lifetime, ConsulOption consulOption) { ......... app.UseEndpoints(endpoints => { endpoints.MapGet("/", async context => { await context.Response.WriteAsync("我是Ocelot网关!"); }); }); // 注册 app.UseOcelot().Wait(); ........... } |
3.3 启动Consul
这里是Win10系统,下载相应的Consul后,在文件夹下创建启动BAT文件用于启动Consul,双击启动。
3.4 服务发现
启动“Yak.Ocelot.Api”项目,查看到服务已经注册到Consul中。
3.5 调试
1. 启动网关服务
运行网关项目“Yak.Ocelot.Gateway”。
2. 启动接口服务
运行网关项目“Yak.Ocelot.Api”,通过接口自己的端口http://localhost:5000/Weather访问WebAPI天气接口服务。
3. 通过网关访问接口服务
通过网关地址访问WebAPI天气接口服务
从浏览器看这个请求返回503,代表请求被服务器拒绝访问。实际已经执行了,从Log可以看出:
访问三次后直接熔断了,在访问接口就没Log打印出了,除非超过所设置熔断时间60秒后再访问。
4 总结
通过上面项目实践,我们了解到了Ocelot网关结合Polly就可以实现访问熔断,在三次访问接口都超时时,直接熔断了60秒。
5 鸣谢
https://www.cnblogs.com/edisonchou/p/9159644.html
6 源码
https://github.com/yandaniugithub/NETCore/tree/main/Yak.Ocelot.Demo
本文来自博客园,作者:{春光牛牛,yak},转载请注明原文链接:https://www.cnblogs.com/yakniu/p/16113231.html
欢迎各位大佬们评论指正
QQ讨论群:610129902
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!