HttpClientFactory 结合 Polly 轻松实现重试机制
HttpClientFactory 结合 Polly 轻松实现重试机制
Intro#
我们的服务里有一个 API 会去调用第三方的接口,设置了超时时间,最近偶尔会发生超时的情况,微软在提供 HttpClientFactory
的同时,也提供了一个基于 Polly
的一个扩展,我们可以借助它轻松地实现重试,熔断等行为。
Sample#
使用 Polly 扩展需要引用 nuget 包 :Microsoft.Extensions.Http.Polly
使用示例:
services.AddHttpClient("test", x =>
{
x.Timeout = new TimeSpan(0, 0, 3);
})
.AddTransientHttpErrorPolicy(builder =>
{
return builder.Or<TaskCanceledException>()
.Or<OperationCanceledException>()
.Or<TimeoutException>()
.OrResult(res => res.StatusCode == HttpStatusCode.TooManyRequests)
.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)
.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#
作者:weihanli
出处:https://www.cnblogs.com/weihanli/p/httpclientfactory-polly.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
2019-01-15 EFCore使用JSON_VALUE查询json对象的值
2017-01-15 Mvc分页组件MvcSimplePager代码重构及使用
2014-01-15 C#多线程基础