asp.net core 使用HttpClientFactory Polly实现熔断降级

前言

NET Core2.1后也是增长更新了不少东西,固然HttpClientFactory更新中的一部分.虽说HttpClient这个实现了disposable,但使用它的时候用using包装块的方式一般不是最好的选择。处理HttpClient,底层socket套接字不会当即释放。该HttpClient类是未多个请求重复使用而建立的。须要不一样的基地址,不一样的HTTP 标头和其余对请求个性化操做的场景时,须要动手管理多个HttpClient实例,为了简化HttpClient实例管理,.NET Core 2.1提供了一个新的HTTPClientFactory - 它能够建立,缓存和处理HttpClient实例。git

什么是HttpClientFactory

ASPNET Core开始,PollyIHttpClientFastory集成。HttpClientFastory是一个简化管理和使用的HttpClientory。用ASP.Net团队的话说:“an opinionated factory for creating HttpClient instances”(一个用于建立HttpClient实例的最佳实践的工厂github

  • 提供命名和配置逻辑HttpClient 对象的中心位置。例如,您能够配置预先配置为访问特定微服务的客户端(服务代理)。
  • 经过委派处理程序HttpClient 并实施基于Polly 的中间件来利用Polly 的弹性策略,对传出中间件的概念进行编码。
  • HttpClient 已经有了委托处理程序的概念,这些处理程序能够连接在一块儿用于传出HTTP 请求。您将HTTP 客户端注册到工厂中,而且可使用Polly处理程序将Polly策略用于RetryCircuitBreakers 等。
  • 管理生命周期,HttpClientMessageHandlers 以免在管理HttpClient 本身的生命周期时可能发生的上述问题/问题。

HttpClientFactory简单使用

  • Startup添加
services.AddHttpClient();
  • 经过IHttpClientFactory建立一个HttpClient对象,后面操做如旧,可是不须要关心其资源释放
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

  • Package
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

相关文章
相关标签/搜索