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

HttpClientFactory 结合 Polly 轻松实现重试机制相关推荐

  1. .net使用httpclient获取http状态码_在 .NET Core 中结合 HttpClientFactory 使用 Polly(中篇)...

    译者:码农老王 作者:Polly 团队 原文:http://t.cn/EhZ90oq 声明:我翻译技术文章不是逐句翻译的,而是根据我自己的理解来表述的(包括标题).其中可能会去除一些不影响理解但本人实 ...

  2. Springboot 整合Retry 实现重试机制

    重试,在项目需求中是非常常见的,例如遇到网络波动等,要求某个接口或者是方法可以最多/最少调用几次: 实现重试机制,非得用Retry这个重试框架吗?那肯定不是,相信很多伙伴手写一下控制流程的逻辑也可以达 ...

  3. loadingcache 有重试机制吗_重试机制的实现

    服务在请求资源,如果遇到网络异常等情况,导致请求失败,这时需要有个重试机制来继续请求. 常见的做法是重试3次,并随机 sleep 几秒. 业务开发的脚手架,HTTP Client 基本会封装好 ret ...

  4. springboot 整合retry(重试机制)

    当我们调用一个接口可能由于网络等原因造成第一次失败,再去尝试就成功了,这就是重试机制,spring支持重试机制,并且在Spring Cloud中可以与Hystaix结合使用,可以避免访问到已经不正常的 ...

  5. Spring Cloud Gateway重试机制

    前言 重试,我相信大家并不陌生.在我们调用Http接口的时候,总会因为某种原因调用失败,这个时候我们可以通过重试的方式,来重新请求接口. 生活中这样的事例很多,比如打电话,对方正在通话中啊,信号不好啊 ...

  6. 一文读懂熔断器和重试机制

    导语:随着微服务的流行,熔断作为其中一项很重要的技术也广为人知.当微服务的运行质量低于某个临界值时,启动熔断机制,暂停微服务调用一段时间,以保障后端的微服务不会因为持续过负荷而宕机.本文作者介绍了熔断 ...

  7. invalid signature 错误原因验签失败_Nginx 失败重试机制

    可直接点击上方蓝字 (网易游戏运维平台) 关注我们,获一手游戏运维方案 src 网易游戏 SRE,喜欢钻研与分享. 背景 Nginx 作为目前应用较广的反向代理服务,原生提供了一套失败重试机制,来保证 ...

  8. android网络重试机制,okhttp源码解析(四):重试机制

    前言 这一篇我们分析okhttp的重试机制,一般如果网络请求失败,我们会考虑连续请求多次,增大网络请求成功的概率,那么okhttp是怎么实现这个功能的呢? 正文 首先还是回到之前的Intercepto ...

  9. Spring Retry 重试机制实现及原理

    概要 Spring实现了一套重试机制,功能简单实用.Spring Retry是从Spring Batch独立出来的一个功能,已经广泛应用于Spring Batch,Spring Integration ...

最新文章

  1. 动态调用WebService
  2. [转]另一个SqlParameterCollection 中已包含 SqlParameter[解决方案]
  3. C++插入排序(附完整源码)
  4. basler相机 ip linux,Linux环境中连接Basler相机(Pylon软件的安装),ROS环境中连接Basler相机...
  5. python中星号变量的几种特殊用法
  6. Sphinx编译docs文档
  7. 学习笔记13-C语言-字符串函数、缓冲区
  8. Apache Pulsar的多租户消息系统
  9. 内存读写函数实现进程间通信
  10. mysql联合索引测试
  11. NLP学习—24.Pre-trained Word Embedding—ELMO、GPT、Bert
  12. java 查看类常量池_Java中常量以及常量池
  13. 工作中使用到的单词(软件开发)
  14. 统计学之假设检验(总体均值、总体比例、总体方差)含例题和解答
  15. Java中的日期与时间
  16. Revit SDK 介绍:ModelessForm_ExternalEvent ModelessForm_IdlingEvent
  17. 最简单优雅修改jupyter自带主题字体大小颜色(不需要插件不需要第三方theme)
  18. 2018麦考林杂志计算机科学,2020年麦考林杂志排名全解析
  19. 扑克牌顺子(C++)
  20. java开发工具(装机大全)

热门文章

  1. 帆软报表(finereport)点击事件对话框打开
  2. Linux中一些常用的很巧妙的命令
  3. sublime-text3按tab跳出括号
  4. Flowportal-BPM——环境配置
  5. DbVisualizer 8 解决中文乱码问题
  6. apple默认备份位置_如何将Apple Maps默认设置为步行路线
  7. dvd vlc 复制_如何使用VLC翻录DVD
  8. 为什么Android Geeks购买Nexus设备
  9. requests保存图片
  10. 文本文档TXT每行开头结尾加内容批处理代码