HttpClientFactory 结合 Polly 轻松实现重试机制
2021-01-15 23:56
1256 查看
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
相关文章推荐
- .NetCore下使用Polly结合IHttpClientFactory实现聚合服务
- 在 .NET Core 中结合 HttpClientFactory 使用 Polly(上篇)
- 在 .NET Core 中结合 HttpClientFactory 使用 Polly(下篇)
- 在 .NET Core 中结合 HttpClientFactory 使用 Polly(中篇)
- 轻松把玩HttpClient之配置ssl,采用绕过证书验证实现https
- .NET Core HttpClientFactory+Consul实现服务发现
- .net Core 使用IHttpClientFactory请求实现
- HttpClient连接池及重试机制
- 轻松把玩HttpClient之配置ssl,采用绕过证书验证实现https
- Android 网络连接-重试机制-HttpRequestRetryHandler(HttpClient)
- ASP.Net Core2.1中的HttpClientFactory系列二:集成Polly处理瞬态故障
- SSL自签名的实现类org.apache.commons.httpclient.contrib.ssl.EasySSLProtocolSocketFactory
- 轻松把玩HttpClient之配置ssl,采用绕过证书验证实现https
- 轻松把玩HttpClient之配置ssl,采用绕过证书验证实现https
- 如何利用HttpClientFactory实现简单的熔断降级
- 轻松把玩HttpClient之配置ssl,采用设置信任自签名证书实现https
- 轻松把玩HttpClient之配置ssl,采用绕过证书验证实现https
- 轻松把玩HttpClient之配置ssl,采用绕过证书验证实现https
- 轻松把玩HttpClient之配置ssl,采用设置信任自签名证书实现https
- java用httpclient 4.3 实现将base64串进行文件上传