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

比如下图的微服务场景:

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

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

然鹅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

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


builder.Services.AddHttpClient("qrcode", client =>
{
client.BaseAddress = new("http://qrcode");
}) // Microsoft.Extensions.Http.Polly实现的代码:
.AddTransientHttpErrorPolicy((builder) =>
{
// 重试3次,每次间隔5秒
var retryPolicy = builder.WaitAndRetryAsync(3, retryCount => TimeSpan.FromSeconds(5d));
// 熔断器,失败3次后,30秒内不再请求
var circuitBreakerPolicy = builder.CircuitBreakerAsync(3, TimeSpan.FromSeconds(30)); // 重试策略包装熔断器
return retryPolicy.WrapAsync(circuitBreakerPolicy);
})
// Microsoft.Extensions.Http.Resilience实现代码:
.AddStandardResilienceHandler(options =>
{
options.Retry.MaxRetryAttempts = 3;
options.TotalRequestTimeout.Timeout = TimeSpan.FromSeconds(30);// 总的超时时间
options.AttemptTimeout.Timeout = TimeSpan.FromSeconds(5);//每次重试的超时时间
options.CircuitBreaker.BreakDuration = TimeSpan.FromSeconds(30);//熔断时间
})
;

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


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

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

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

builder.Services.AddHttpClient("qrcode", client =>
{
client.BaseAddress = new("http://qrcode");
})
.AddResilienceHandler("MyPolicy", builder =>
{
builder.AddTimeout(TimeSpan.FromSeconds(5));
builder.AddRetry(new HttpRetryStrategyOptions
{
MaxRetryAttempts = 3,
Delay = TimeSpan.FromSeconds(2),
MaxDelay = TimeSpan.FromSeconds(10),
});
//其他的机制....
});

参考文档 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/

.NET8中的Microsoft.Extensions.Http.Resilience库的更多相关文章

  1. Microsoft.Extensions.DependencyInjection不同版本导致EF出现内存泄露。

    我的代码里将IServiceProvider放入ServiceLocator中遇到的问题. 注:以下所有例子都是Console里的结论,AspNetCore里不管怎么玩都没有问题,有其他帖子测试出在A ...

  2. 使用诊断工具观察 Microsoft.Extensions.DependencyInjection 2.x 版本的内存占用

    目录 准备工作 大量接口与实现类的生成 elasticsearch+kibana+apm asp.net core 应用 请求与快照 Kibana 上的请求记录 请求耗时的分析 请求内存的分析 第2次 ...

  3. Microsoft.Extensions.DependencyInjection 之三:展开测试

    目录 前文回顾 IServiceCallSite CallSiteFactory ServiceProviderEngine CompiledServiceProviderEngine Dynamic ...

  4. Microsoft.Extensions.DependencyInjection 之三:反射可以一战(附源代码)

    目录 前文回顾 IServiceCallSite CallSiteFactory ServiceProviderEngine CompiledServiceProviderEngine Dynamic ...

  5. Microsoft.Extensions.DependencyInjection 之二:使用诊断工具观察内存占用

    目录 准备工作 大量接口与实现类的生成 elasticsearch+kibana+apm asp.net core 应用 请求与快照 Kibana 上的请求记录 请求耗时的分析 请求内存的分析 第2次 ...

  6. Microsoft.Extensions.DependencyInjection中的Transient依赖注入关系,使用不当会造成内存泄漏

    Microsoft.Extensions.DependencyInjection中(下面简称DI)的Transient依赖注入关系,表示每次DI获取一个全新的注入对象.但是使用Transient依赖注 ...

  7. 微软日志工厂 Microsoft.Extensions.Logging 中增加 log4net 的日志输出

    前提: 需要nuget   Microsoft.Extensions.Logging.Log4Net.AspNetCore   2.2.6: 描述:解决 .net core 微软日志工厂 Micros ...

  8. Asp.Net Core 2.0 项目实战(9) 日志记录,基于Nlog或Microsoft.Extensions.Logging的实现及调用实例

    本文目录 1. Net下日志记录 2. NLog的使用     2.1 添加nuget引用NLog.Web.AspNetCore     2.2 配置文件设置     2.3 依赖配置及调用     ...

  9. Microsoft.Extensions.Options支持什么样的配置类?

    在.Net core中,微软放弃了笨重基于XML的.Config配置文件(好吧,像我这种咸鱼早都忘了如何自己写一个Section了). 现在主推新的高度可扩展的配置文件(参见此处) 对于新的配置系统, ...

  10. asp.net core 2.0 Microsoft.Extensions.Logging 文本文件日志扩展

    asp.net core微软官方为日志提供了原生支持,有如下实现 Console Debug EventLog AzureAppServices TraceSource EventSource 并且在 ...

随机推荐

  1. 通过debug搞清楚.vue文件怎么变成.js文件

    前言 我们每天写的vue代码都是写在vue文件中,但是浏览器却只认识html.css.js等文件类型.所以这个时候就需要一个工具将vue文件转换为浏览器能够认识的js文件,想必你第一时间就想到了web ...

  2. GoLand打开后Project消失

    一直用的好好的Goland,突然不能用了,左边栏Project"消失"了. 如下: 解决方法 遇到上面问题,一般情况是GoLand的cache问题,这个时候要将GoLand清理一下 ...

  3. [学习笔记]Linux + Nginx环境下部署 Web 站点

    ​部署后端程序,请阅读: [学习笔记]Linux环境下部署 .Net5 程序 - 林晓lx - 博客园 (cnblogs.com) 打包项目 以Vue项目为例,首先打包站点,前往项目的根目录并键入: ...

  4. 使用fastJson中的JSONObject对象简化POST请求传参-2022新项目

    一.业务场景 Java项目开发中,经常会用到远程调用,不管是POST请求,Feign远程调用,还是使用Resttemplate中的POST方法等等都需要传递参数. 可是如何更好的传递参数呢?之前自己开 ...

  5. vscode 利用正则 搜索标签 tags (?=.*关键字1)(?=.*关键字2).*

    vscode 利用正则 搜索标签 (?=.关键字1)(?=.关键字2).* 这里关键词是可以多个并且不按照顺序搜索的,就是写起来需要 (?=.关键字) 最后. 结尾 我是不是需要制作一个转换的小工具呢 ...

  6. 制作B站直播简介

    本文只用于个人总结备份,如果对你有帮助就更好了. 准备工作 准备好简介要用的的背景图.头像图,上传到图床生成图片链接. 简介的内容可分为主播简介.直播时间.直播内容.联系方式,内容根据实际需要修改,需 ...

  7. windows10 使用gcc编译生成可执行文件exe实例解析

    一 操作步骤 1.生成可执行程序 cd xxx # 先进入源程序所在的目录 gcc hello.cpp # 一次性编译,windows系统生成a.exe文件,Linux系统生成a.out文件 gcc ...

  8. python librosa 实例解析

    一 概念 librosa是一个用于音乐和音频分析的python包.它提供了创建音乐信息检索系统所需的构建块. 核心函数:   二 实例解析   实例A,确认是否安装成功: import librosa ...

  9. 完美解决浏览器输入http被自动跳转至https问题

    查阅相关资料,发现这是浏览器的HSTS(HTTP Strict Transport Security)功能引起的.在安装配置SSL证书时,可以使用一种能使数据传输更加安全的Web安全协议,即在服务器端 ...

  10. Docker 部署GitLabs 版本升级 13.9.x -> 15.3.x

    Gitlabs版本升级大版本不能直接跳级升级, 可以参考官方的升级路径.本人是从13.9.x需要升级到最新的15.3.x. 参考官方路径结合自己的实际情况成功升级. 13.9.0 -> 13.1 ...