经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » ASP.net » 查看文章
.NET8中的Microsoft.Extensions.Http.Resilience库
来源:cnblogs  作者:万雅虎  时间:2024/4/17 15:31:36  对本文有异议

接上一篇,https://www.cnblogs.com/vipwan/p/18129361 借助Aspire中新增的Microsoft.Extensions.ServiceDiscovery库,我们可以很容易的做到服务发现,那么服务节点的熔断限流以及重试等弹性机制.NET是怎么处理的呢?
比如下图的微服务场景:

image

这里就不得不提到 Microsoft.Extensions.Http.Polly这个Polly的封装库了,这个库是从NETCore2.1增加的,我们可以很容易的对IHttpClientBuilder扩展弹性机制,比如下面的代码:

  1. builder.Services.AddHttpClient("qrcode", client =>
  2. {
  3. client.BaseAddress = new("http://qrcode");
  4. })
  5. .AddTransientHttpErrorPolicy((builder) =>
  6. {
  7. // 重试3次,每次间隔5秒
  8. var retryPolicy = builder.WaitAndRetryAsync(3, retryCount => TimeSpan.FromSeconds(5d));
  9. // 熔断器,失败3次后,30秒内不再请求
  10. var circuitBreakerPolicy = builder.CircuitBreakerAsync(3, TimeSpan.FromSeconds(30));
  11. // 重试策略包装熔断器
  12. return retryPolicy.WrapAsync(circuitBreakerPolicy);
  13. });

然鹅Microsoft.Extensions.Http.Polly库是早些年就存在的产物了,针对Polly V8及后续的版本巨硬在 NET8后增加了 Microsoft.Extensions.Http.Resilience库作为替代方案.

下面是巨硬给出的两个版本的性能差异:

Method Mean Error StdDev Ratio Gen0 Allocated Alloc Ratio
StandardPipeline_Polly_V7 3.236 us 0.0130 us 0.0187 us 1.00 0.1488 3816 B 1.00
StandardPipeline_Polly_V8 3.104 us 0.0237 us 0.0317 us 0.96 0.0381 1008 B 0.26

速度较快的同时,基于 Polly v8 构建的Microsoft.Extensions.Http.Resilience使用的内存减少了4倍之多。
所以至NET8+以后我推荐使用Microsoft.Extensions.Http.Resilience替代Microsoft.Extensions.Http.Polly

下面我们使用新库实现模拟的策略:

  1. builder.Services.AddHttpClient("qrcode", client =>
  2. {
  3. client.BaseAddress = new("http://qrcode");
  4. })
  5. // Microsoft.Extensions.Http.Polly实现的代码:
  6. .AddTransientHttpErrorPolicy((builder) =>
  7. {
  8. // 重试3次,每次间隔5秒
  9. var retryPolicy = builder.WaitAndRetryAsync(3, retryCount => TimeSpan.FromSeconds(5d));
  10. // 熔断器,失败3次后,30秒内不再请求
  11. var circuitBreakerPolicy = builder.CircuitBreakerAsync(3, TimeSpan.FromSeconds(30));
  12. // 重试策略包装熔断器
  13. return retryPolicy.WrapAsync(circuitBreakerPolicy);
  14. })
  15. // Microsoft.Extensions.Http.Resilience实现代码:
  16. .AddStandardResilienceHandler(options =>
  17. {
  18. options.Retry.MaxRetryAttempts = 3;
  19. options.TotalRequestTimeout.Timeout = TimeSpan.FromSeconds(30);// 总的超时时间
  20. options.AttemptTimeout.Timeout = TimeSpan.FromSeconds(5);//每次重试的超时时间
  21. options.CircuitBreaker.BreakDuration = TimeSpan.FromSeconds(30);//熔断时间
  22. })
  23. ;

当然大多数情况弹性机制是放到配置文件或者其他持久层的这个时候我们可以使用Configure(IConfigurationSection) 或者 Configure(Action<HttpStandardResilienceOptions, IServiceProvider>)

  1. .AddStandardResilienceHandler(options =>
  2. {
  3. options.Retry.MaxRetryAttempts = 3;
  4. options.TotalRequestTimeout.Timeout = TimeSpan.FromSeconds(5);// 超时时间
  5. options.AttemptTimeout.Timeout = TimeSpan.FromSeconds(5);//每次重试的超时时间
  6. options.CircuitBreaker.BreakDuration = TimeSpan.FromSeconds(30);//熔断时间
  7. })
  8. .Configure((options, sp) =>
  9. {
  10. // 配置来自自定义的Provider
  11. var myResiliencePolicy = sp.GetRequiredService<IResiliencePolicyProvider>().GetResiliencePolicy("MyPolicy");
  12. options.Retry.MaxRetryAttempts = myResiliencePolicy.Retry.MaxRetryAttempts;
  13. });

从代码上来说也优雅了一些

当然也可以使用AddResilienceHandler扩展方法实现一些比较个性化的配置需求,这个就比较类似于Microsoft.Extensions.Http.Polly:

  1. builder.Services.AddHttpClient("qrcode", client =>
  2. {
  3. client.BaseAddress = new("http://qrcode");
  4. })
  5. .AddResilienceHandler("MyPolicy", builder =>
  6. {
  7. builder.AddTimeout(TimeSpan.FromSeconds(5));
  8. builder.AddRetry(new HttpRetryStrategyOptions
  9. {
  10. MaxRetryAttempts = 3,
  11. Delay = TimeSpan.FromSeconds(2),
  12. MaxDelay = TimeSpan.FromSeconds(10),
  13. });
  14. //其他的机制....
  15. });

参考文档 https://github.com/dotnet/docs/blob/main/docs/core/resilience/http-resilience.md

https://devblogs.microsoft.com/dotnet/building-resilient-cloud-services-with-dotnet-8/

原文链接:https://www.cnblogs.com/vipwan/p/18138649

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号