前言
在NET Core2.1后也是增长更新了不少东西,固然HttpClientFactory更新中的一部分.虽说HttpClient这个实现了disposable,但使用它的时候用using包装块的方式一般不是最好的选择。处理HttpClient,底层socket套接字不会当即释放。该HttpClient类是未多个请求重复使用而建立的。须要不一样的基地址,不一样的HTTP 标头和其余对请求个性化操做的场景时,须要动手管理多个HttpClient实例,为了简化HttpClient实例管理,.NET Core 2.1提供了一个新的HTTPClientFactory - 它能够建立,缓存和处理HttpClient实例。git
什么是HttpClientFactory
从ASPNET Core开始,Polly与IHttpClientFastory集成。HttpClientFastory是一个简化管理和使用的HttpClientory。用ASP.Net团队的话说:“an opinionated factory for creating HttpClient instances”(一个用于建立HttpClient实例的最佳实践的工厂)github
HttpClientFactory简单使用
services.AddHttpClient();
using Microsoft.AspNetCore.Mvc; using System.Net.Http; using System.Threading.Tasks; namespace HttpClientFactoryPolly.Controllers { [Route("api/[controller]")] [ApiController] public class ValuesController : ControllerBase { private readonly IHttpClientFactory _httpClientFactory; public ValuesController(IHttpClientFactory httpClientFactory) { this._httpClientFactory = httpClientFactory; } // GET api/values [HttpGet] public async Task<ActionResult<string>> Get() { var client = _httpClientFactory.CreateClient(); var result =await client.GetStringAsync("https://www.microsoft.com/zh-cn/"); return result; } } }
配置HttpClientFactory Polly
这边采用命名客户端演示该栗子(若是应用须要有许多不一样的 HttpClient 用法(每种用法的配置都不一样),能够视状况使用命名客户端。 能够在 HttpClient 中注册时指定命名 Startup.ConfigureServices 的配置。) json
PM> Install-package Microsoft.Extensions.Http.Polly
Startupapi
services.AddHttpClient("github",c=> { //基址 c.BaseAddress = new System.Uri("https://api.github.com/"); // Github API versioning c.DefaultRequestHeaders.Add("Accept", "application/vnd.github.v3+json"); // Github requires a user-agent c.DefaultRequestHeaders.Add("User-Agent", "HttpClientFactory-Sample"); });
[HttpGet("{id}")] public async Task<ActionResult<string>> Get(int id) { var request = new HttpRequestMessage(HttpMethod.Get, "repos/aspnet/docs/pulls"); var client = _httpClientFactory.CreateClient("github"); var response = await client.SendAsync(request); var result =await response.Content.ReadAsStringAsync(); return result; }
services.AddHttpClient("github", c => { //基址 c.BaseAddress = new System.Uri("https://api.github.com/"); // Github API versioning c.DefaultRequestHeaders.Add("Accept", "application/vnd.github.v3+json"); // Github requires a user-agent c.DefaultRequestHeaders.Add("User-Agent", "HttpClientFactory-Sample"); //AddTransientHttpErrorPolicy主要是处理Http请求的错误,如HTTP 5XX 的状态码,HTTP 408 的状态码 以及System.Net.Http.HttpRequestException异常 }).AddTransientHttpErrorPolicy(p => //WaitAndRetryAsync参数的意思是:每次重试时等待的睡眠持续时间。 p.WaitAndRetryAsync(3, _ => TimeSpan.FromMilliseconds(600)));
效果以下 缓存
services.AddHttpClient("test", c => { //基址 c.BaseAddress = new System.Uri("http://localhost:5000/"); // Github API versioning c.DefaultRequestHeaders.Add("Accept", "application/vnd.github.v3+json"); // Github requires a user-agent c.DefaultRequestHeaders.Add("User-Agent", "HttpClientFactory-Sample"); }) // 降级 .AddPolicyHandler(Policy<HttpResponseMessage>.Handle<Exception>().FallbackAsync(fallbackResponse, async b => { Console.WriteLine($"fallback here {b.Exception.Message}"); })) // 熔断 .AddPolicyHandler(Policy<HttpResponseMessage>.Handle<Exception>().CircuitBreakerAsync(2, TimeSpan.FromSeconds(4), (ex, ts) => { Console.WriteLine($"break here {ts.TotalMilliseconds}"); }, () => { Console.WriteLine($"reset here "); })) // 超时 .AddPolicyHandler(Policy.TimeoutAsync<HttpResponseMessage>(1)); }
设置降级策略当出现任何异常返回fallbackapp
设置熔断策略当连续出现异常异常 2 次,熔断 4s;socket
设置超时策略,请求超时为 1s,超时默认会抛出 TimeoutRejectedException;async
效果以下微服务
概要
示例地址:https://github.com/fhcodegit/HttpClientFactoryPolly Polly:https://github.com/App-vNext/Polly 参考:http://www.javashuo.com/article/p-kmdmyiuk-mw.htmlui