外贸免费建设网站制作,深圳专业商城网站制作,怎样用织梦建设网站,专做药材的网站有哪些HttpClientFactory 结合 Polly 轻松实现重试机制Intro我们的服务里有一个 API 会去调用第三方的接口#xff0c;设置了超时时间#xff0c;最近偶尔会发生超时的情况#xff0c;微软在提供 HttpClientFactory 的同时#xff0c;也提供了一个基于 Polly 的一个扩展#xff… 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.OrTaskCanceledException().OrOperationCanceledException().OrTimeoutException().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 ConcurrentBaglong();var retryLimit 5;var services new ServiceCollection();services.AddHttpClient(test, x {x.Timeout TimeSpan.FromSeconds(1);}).AddTransientHttpErrorPolicy(builder {return builder.OrTaskCanceledException().OrOperationCanceledException().OrTimeoutException().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.GetRequiredServiceIHttpClientFactory().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 FuncHttpRequestMessage, HttpResponseMessage _getResponseFunc;public MockHttpHandler(FuncHttpRequestMessage, HttpResponseMessage getResponseFunc){_getResponseFunc getResponseFunc;}protected override TaskHttpResponseMessage SendAsync(HttpRequestMessage request, CancellationToken cancellationToken){return Task.FromResult(_getResponseFunc(request));}
}
More除了 AddTransientHttpErrorPolicy 之外Polly 扩展还支持 AddPolicyHandler/AddPolicyHandlerFromRegistry 扩展方法有兴趣的可以自己探索一下哈~~Referencehttps://www.nuget.org/packages/Microsoft.Extensions.Http.Pollyhttps://github.com/dotnet/aspnetcore/tree/master/src/HttpClientFactory/Polly/src