HttpClientFactory 结合 Polly 轻松实现重试机制

HttpClientFactory 结合 Polly 轻松实现重试机制

Intro

我们的服务里有一个 API 会去调用第三方的接口,设置了超时时间,最近偶尔会发生超时的情况,微软在提供 HttpClientFactory 的同时,也提供了一个基于 Polly 的一个扩展,我们可以借助它轻松地实现重试,熔断等行为。

Sample

使用 Polly 扩展需要引用 nuget 包 :Microsoft.Extensions.Http.Polly

使用示例:

services.AddHttpClient(ServiceConst.IterableHttpClientName, x =>
{x.Timeout = new TimeSpan(0, 0, 3);
}).AddTransientHttpErrorPolicy(builder =>{return builder.Or<TaskCanceledException>().Or<OperationCanceledException>().Or<TimeoutException>().OrResult(res => res.StatusCode == HttpStatusCode.TooManyRequests || (int)res.StatusCode >= 500).RetryAsync(5);})

通过 AddTransientHttpErrorPolicy 扩展方法来注册一个 Polly 的 policy,具体可以通过 policyBuilder 委托来定制自己要处理的情况和 policy 行为,支持方式有很多可以简单的指定重试,也可以指定 WaitANdRetryAsync 等待一段时间后重试,可以重试一次也可以一直重试下去,非常的灵活,可以根据自己的业务场景进行定制化配置,这里的示例直接是用了简单的重试机制

单元测试

下面提供了一个测试重试的单元测试,也可以作为使用示例的一个参考:


[Fact]
public async Task TaskCanceledException()
{var ticks = new ConcurrentBag<long>();var retryLimit = 5;var services = new ServiceCollection();services.AddHttpClient("test", x =>{x.Timeout = TimeSpan.FromSeconds(1);}).AddTransientHttpErrorPolicy(builder =>{return builder.Or<TaskCanceledException>().Or<OperationCanceledException>().Or<TimeoutException>().OrResult(res =>res.StatusCode == HttpStatusCode.TooManyRequests || (int)res.StatusCode >= 500).RetryAsync(retryLimit);}).AddHttpMessageHandler(() => new MockHttpHandler(request =>{ticks.Add(DateTime.UtcNow.Ticks);throw new TaskCanceledException();}));await using var provider = services.BuildServiceProvider();try{using var response = await provider.GetRequiredService<IHttpClientFactory>().CreateClient("test").GetAsync("api/test");}catch (Exception e){Assert.True(e is OperationCanceledException);}Assert.Equal(retryLimit + 1, ticks.Count);
}private class MockHttpHandler : DelegatingHandler
{private readonly Func<HttpRequestMessage, HttpResponseMessage> _getResponseFunc;public MockHttpHandler(Func<HttpRequestMessage, HttpResponseMessage> getResponseFunc){_getResponseFunc = getResponseFunc;}protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken){return Task.FromResult(_getResponseFunc(request));}
}

More

除了 AddTransientHttpErrorPolicy 之外,Polly 扩展还支持 AddPolicyHandler/AddPolicyHandlerFromRegistry 扩展方法,有兴趣的可以自己探索一下哈~~

Reference

  • https://www.nuget.org/packages/Microsoft.Extensions.Http.Polly

  • https://github.com/dotnet/aspnetcore/tree/master/src/HttpClientFactory/Polly/src

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/305714.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ASP.NET 状态管理概览

页面每次被回传到服务器的时候都会创建 Web 页面类的一个新实例。在传统的 Web 开发中&#xff0c;这意味着在每次回传的过程中&#xff0c;页面中所有与页面和控件相关联的信息都将被丢失。例如&#xff0c;如果用户在一个文本框中输入了信息&#xff0c;那么在浏览器或者其他…

linux udp端口大数据包,Linux协议栈中UDP数据报从网卡到用户空间流程总结

NAPI驱动流程&#xff1a;中断发生-->确定中断原因是数据接收完毕(中断原因也可能是发送完毕&#xff0c;DMA完毕&#xff0c;甚至是中断通道上的其他设备中断)-->通过netif_rx_schedule将驱动自己的napi结构加入softnet_data的poll_list链表&#xff0c;禁用网卡中断&am…

浅谈.NET技术公司的实习生培养

浅谈.NET技术公司的实习生培养背景近几年.NET开发者市场的越发不景气&#xff0c;一毕业就选择.NET技术的开发者更是少之又少。一方面是公司效益的日益提高&#xff0c;一方面却是招聘优秀人才的速度总是赶不上公司发展的速度&#xff0c;这样的矛盾不断的倾轧着技术管理者的内…

禁止自动播放功能

运行gpedit.msc打开组策略&#xff0c;在“管理模板--系统”右侧双击“关闭自动播放”&#xff0c;然后设置为“已启用”&#xff0c;并在“关闭自动播放”下拉列表中选择“所有驱动器”&#xff0c;最后“确定”即可。这个设置在“计算机配置”和“用户配置”中都有&#xff0…

MBR的Linux分区机制启动过程,linux系统启动流程(MBR)

总&#xff1a;POST---> Boot Squence ---> Bootloader ---> kernel ---> init---> 完成启动系统&#xff1a;CentOS61、按下电源&#xff0c;cpu找到CMOS中的BIOS并运行起来&#xff0c;这个小程序会完成硬件自检。BIOS&#xff1a;Basic Input and Output Sys…

.netcore 极速接入第三方登录

新年新气象&#xff0c;趁着新年的喜庆&#xff0c;肝了十来天&#xff0c;终于发了第一版&#xff0c;希望大家喜欢。如果有不喜欢看文字的童鞋&#xff0c;可以直接看下面的地址体验一下&#xff1a;Github: https://github.com/mrhuo/MrHuo.OAuth唯一官网&#xff1a;https:…

linux watch 文件大小,Linux watch命令的使用

1.命令简介watch 命令以周期性的方式执行给定的命令&#xff0c;并全屏显示执行结果。watch 是一个非常实用的命令&#xff0c;基本所有的 Linux 发行版都带有。如同名字一样&#xff0c;watch 可以帮助监测一个命令的运行结果&#xff0c;省得我们一遍遍地手动运行。比如 tail…

在ISA 2006标准版上定制带宽和限制流量(测试)

最的忙于工作上的事&#xff0c;有点烦躁&#xff0c;很少有心情能静下来去看看书或是做些实验了。这是个不好的现象。 一直想着在ISA SERVER上做一些带宽和流量方面的测试&#xff0c;没有找到较好的软件。偶尔从朋友那得到一款&#xff0c;虽说是英文的&#xff0c;也蛮不错…

.NET 中 async 和 await

前言C# 中的 Async 和 Await 关键字是异步编程的核心。使用这两个关键字可以轻松创建异步方法。使用 async 关键字定义的异步方法简称“异步方法”。异步编程并发的一种形式&#xff0c;它采用furture模式或回调(callback)机制&#xff0c;以避免产生不必要的线程。.Net中futur…

Javascript 常用技巧 [2]

Javascript 常用技巧 [2] /**请问如何去掉主页右面的滚动条&#xff1f; <!-- <body scroll"no"> --> <!-- <body style"overflow-y:hidden"> --> ******************************** 怎样不使用页面的缓存&#xff1f;即每一次打…

mongodb可视化工具 linux,Linux中安装启动MongoDB与可视化工具

MongoDB 提供了 linux 各发行版本 64 位的安装包&#xff0c;你可以在官网下载安装包。下载地址&#xff1a;https://www.mongodb.com/download-center#community下载完安装包&#xff0c;并解压 tgz(以下演示的是 64 位 Linux上的安装) 。curl -O https://fastdl.mongodb.org/…

年轻有为的老黄2020

0x01 不知道开篇要说什么好&#xff0c;那就来个经典的 0x01 吧。这个世界不止苟且&#xff0c;还有诗和远方。工作 工作上面还算是比较忙碌的&#xff0c;在20年也做了很多东西&#xff0c;本来面试进公司的时候title是高开&#xff0c;在基础架构组&#xff0c;光杆部门。过完…

VS.NET调试问题

Q:VS.NET调试问题 A:关于VisualStudio.NET里调试出现的一系列问题&#xff0c;例如没有权限调试Web服务器&#xff0c;不属于Debugger Users组、无法调试等情况&#xff0c;都可以在The VS7 Debugger doesn’t work. What can I do(http://blogs.msdn.co…

linux调用odbc接口乱码,linux中pypyodbc读取GB编码mdb中文乱码解决办法

当前1.3.3版本的pypyodbc在linux系统上面已经可以读取有中文字符的mdb文件,不再出现异常,但是读取的中文字符却全是乱码。下面是根据一些现象的合理推论:mdb文件来自于windows系统,其中的中文字符使用GB编码无疑,但linux系统上mdbtools提供的odbc驱动底层已经执行了编码转换,将…

推荐:Dapper扩展-Dapper.SimpleCRUD

背景Dapper目前应该是大家比较喜欢的orm框架之一&#xff0c;但是它灵活的背后&#xff0c;还是有很多不尽人意的地方&#xff0c;谁想编写基本的读取/插入/更新/删除语句&#xff1f;下面推荐SimpleCRUD为Dapper提供了简单的CRUD帮助器。解放了大家&#xff0c;提高生产力。功…

创建虚拟磁盘的小工具软件plainmaker.exe

此小工具,在虚拟机中做集群实现时用到!其下载地址如下:[url]http://www.vmware.cn/Soft/69.html[/url]

Linux下的MySQL测试,Linux下MySQL命令(1)

启动命令&#xff1a;$ ./mysqld_safe --defaults-file/home/mysql/local/mysql_sale_mirror/etc/my.cnf --basedir/home/mysql/local/mysql_sale_mirror/ --datadir/home/mysql/local/mysql_sale_mirror/var/ --pid-file/home/mysql/local/mysql_sale_mirror/var/mysql.pid --…

深入浅出Dotnet Core的项目结构变化

有时候&#xff0c;越是基础的东西&#xff0c;越是有人不明白。前几天Review一个项目的代码&#xff0c;发现非常基础的内容&#xff0c;也会有人理解出错。今天&#xff0c;就着这个点&#xff0c;写一下Dotnet Core的主要类型的项目结构&#xff0c;以及之间的转换和演化。一…

群策群力:破机房征求灵丹妙药

我校有一年代久远之计算机教室&#xff0c;现已经迈入日落西山之境。特征求灵丹妙药&#xff0c;不求妙手回春&#xff0c;只愿其能为我校的信息技术教育事业再尽最后一把微力&#xff0c;也为我校即将面临无地授课的教师提供继续上岗的救命稻草一枝。具体情况说明&#xff1a;…

使用 C# 9 的records作为强类型ID - 路由和查询参数

上一篇文章&#xff0c;我介绍了使用 C# 9 的record类型作为强类型id&#xff0c;非常简洁public record ProductId(int Value);但是在强类型id真正可用之前&#xff0c;还有一些问题需要解决&#xff0c;比如&#xff0c;ASP.NET Core并不知道如何在路由参数或查询字符串参数中…