.NET8中的Microsoft.Extensions.Http.Resilience库
接上一篇,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库的更多相关文章
- Microsoft.Extensions.DependencyInjection不同版本导致EF出现内存泄露。
我的代码里将IServiceProvider放入ServiceLocator中遇到的问题. 注:以下所有例子都是Console里的结论,AspNetCore里不管怎么玩都没有问题,有其他帖子测试出在A ...
- 使用诊断工具观察 Microsoft.Extensions.DependencyInjection 2.x 版本的内存占用
目录 准备工作 大量接口与实现类的生成 elasticsearch+kibana+apm asp.net core 应用 请求与快照 Kibana 上的请求记录 请求耗时的分析 请求内存的分析 第2次 ...
- Microsoft.Extensions.DependencyInjection 之三:展开测试
目录 前文回顾 IServiceCallSite CallSiteFactory ServiceProviderEngine CompiledServiceProviderEngine Dynamic ...
- Microsoft.Extensions.DependencyInjection 之三:反射可以一战(附源代码)
目录 前文回顾 IServiceCallSite CallSiteFactory ServiceProviderEngine CompiledServiceProviderEngine Dynamic ...
- Microsoft.Extensions.DependencyInjection 之二:使用诊断工具观察内存占用
目录 准备工作 大量接口与实现类的生成 elasticsearch+kibana+apm asp.net core 应用 请求与快照 Kibana 上的请求记录 请求耗时的分析 请求内存的分析 第2次 ...
- Microsoft.Extensions.DependencyInjection中的Transient依赖注入关系,使用不当会造成内存泄漏
Microsoft.Extensions.DependencyInjection中(下面简称DI)的Transient依赖注入关系,表示每次DI获取一个全新的注入对象.但是使用Transient依赖注 ...
- 微软日志工厂 Microsoft.Extensions.Logging 中增加 log4net 的日志输出
前提: 需要nuget Microsoft.Extensions.Logging.Log4Net.AspNetCore 2.2.6: 描述:解决 .net core 微软日志工厂 Micros ...
- Asp.Net Core 2.0 项目实战(9) 日志记录,基于Nlog或Microsoft.Extensions.Logging的实现及调用实例
本文目录 1. Net下日志记录 2. NLog的使用 2.1 添加nuget引用NLog.Web.AspNetCore 2.2 配置文件设置 2.3 依赖配置及调用 ...
- Microsoft.Extensions.Options支持什么样的配置类?
在.Net core中,微软放弃了笨重基于XML的.Config配置文件(好吧,像我这种咸鱼早都忘了如何自己写一个Section了). 现在主推新的高度可扩展的配置文件(参见此处) 对于新的配置系统, ...
- asp.net core 2.0 Microsoft.Extensions.Logging 文本文件日志扩展
asp.net core微软官方为日志提供了原生支持,有如下实现 Console Debug EventLog AzureAppServices TraceSource EventSource 并且在 ...
随机推荐
- vue2init vue2z
<template> <div> </div> </template> <script> export default { name: 'b ...
- TomCat 的 Jenkins 提示:你的容器没有使用UTF-8解码URL地址
1.编辑 Linux 系统的 Tomcat 安装目录的 conf 目录的 server.xml 文件 2.在 <Connector> 追加内容 URIEncoding="UTF- ...
- github 镜像地址
亲测可用的 github 镜像地址: https://hub.nuaa.cf , https://hub.fgit.cf
- Salesforce LWC学习(四十三) lwc 零基础学习路径的视频已上传B站
本篇参考:https://www.bilibili.com/video/BV1QM411G7pN/ 还记得salesforce零基础学习(一百二十五)零基础学习SF路径 中描述的那样,预计今年年底以前 ...
- 记录--alova组件使用方法(区别axios)
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 在我们写项目代码时,应该更加专注于业务逻辑的实现,而把定式代码交给js库或工程化自动处理,而我想说的是,请求逻辑其实也是可以继续简化的. ...
- 记录--这个前端Api管理方案会更好?
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 简介 大家好,前端小白一枚,目前接触后台管理系统比较多,经常遇到不同对象的增删改查的接口,如何对Api进行一个有比较好的管理是个问题.在学 ...
- 优化Mysql配置调整内存
1.查看Mysql版本 # mysql -V 示例: [root@root /]# mysql -V mysql Ver 14.14 Distrib 5.7.44, for Linux (x86_64 ...
- 《百岁人生》读书笔记 | 能活百年,为什么要死在 "35" 岁?
<百年人生>讲述了当我们如愿能够接受到 长寿 这份礼物时,它所带给我们的挑战以及应对方法,这些发生在 "眼前" 的事,不得不引发我们重新的思考.推荐阅读 一.百岁人生的 ...
- Avalonia发布MacOS运行程序
1 打开xxx.csproj项目文件,添加Dotnet.Bundle包: <PackageReference Include="Dotnet.Bundle" Version= ...
- java读写txt
/** * 传入txt路径读取txt文件 * * @param txtPath * @return 返回读取到的内容 */ public String readTxt(String txtPath) ...