ASP.NET Core-HttpClientFactory + Polly 实现熔断降级【转】

本文主要介绍 HttpClientFactory 整合 Polly 的使用,实现对 Http 请求的超时、重试、熔断、降级等操作。

HttpClientFactory 集成 Polly

  1. 创建 .NET Core API 项目(这里使用的是 .NET Core 2.2);
  2. 安装 Microsoft.Extensions.Http.Polly NuGet Package;
  3. 在 Startup.cs 的 ConfigureServices 方法中添加 HttpClient 相关代码:
    public void ConfigureServices(IServiceCollection services)
    {
      var fallbackResponse = new HttpResponseMessage
      {
        Content = new StringContent("Fallback"),
        StatusCode = HttpStatusCode.GatewayTimeout
      };
    
      services.AddHttpClient("github", client =>
      {
        client.BaseAddress = new Uri("https://www.github.com");
      })
      // 降级
      .AddPolicyHandler(Policy<HttpResponseMessage>.Handle<Exception>().FallbackAsync(fallbackResponse, async b =>
      {
        await Task.CompletedTask;
        _logger.LogWarning($"Fallback: {b.Exception.Message}");
      }))
      // 熔断
      .AddPolicyHandler(Policy<HttpResponseMessage>.Handle<TimeoutRejectedException>().CircuitBreakerAsync(5, TimeSpan.FromSeconds(3), (ex, ts) =>
      {
        _logger.LogWarning($"Open Circuit Breaker:{ts.TotalMilliseconds}");
      }, () =>
      {
        _logger.LogWarning($"Closed Circuit Breaker");
      }, () =>
      {
        _logger.LogWarning($"HalfOpen Circuit Breaker");
      }))
      // 重试
      .AddPolicyHandler(Policy<HttpResponseMessage>
        .Handle<TimeoutRejectedException>()
        .WaitAndRetryAsync(
            new[]
            {
              TimeSpan.FromMilliseconds(100),
              TimeSpan.FromMilliseconds(200)
            }
        )
      )
      // 超时
      .AddPolicyHandler(Policy.TimeoutAsync<HttpResponseMessage>(TimeSpan.FromSeconds(0.5)));
    
      services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    }
    

    说明(这部分代码在实际使用中建议重新封装,不应该每次都为当前定义的 HttpClient 设置一堆重复代码):

    • 通过 services.AddHttpClient 定义一个名为 githubHttpClient ,后续可通过名称获取到这个 HttpClient 对象来发送 Http 请求;
    • 通过 AddPolicyHandler其他扩展方法参考:Polly and HttpClientFactory AddTransientHttpErrorPolicyAddPolicyHandlerFromRegistry 的使用介绍) 为此 HttpClient 添加 Polly 策略;
    • 设置降级策略,当出现任何异常,返回 fallbackResponse
    • 设置熔断策略,当连续出现 TimeoutRejectedException 异常 5 次,熔断 3s;
    • 设置重试策略,当出现 TimeoutRejectedException 分别等待 100ms、200ms 后重试;
    • 设置超时策略,请求超时为 0.5s,超时默认会抛出 TimeoutRejectedException
    • 当多个策略叠加时,最先起作用的是最后添加的;
  4. 使用 HttpClient
    public class ValuesController : ControllerBase
    {
      private readonly IHttpClientFactory _httpClientFactory;
    
      public ValuesController(IHttpClientFactory httpClientFactory)
      {
        _httpClientFactory = httpClientFactory;
      }
    
      [HttpGet]
      public async Task<ActionResult> Get()
      {
        var client = _httpClientFactory.CreateClient("github");
        var request = new HttpRequestMessage(HttpMethod.Get, "/");
        var response = await client.SendAsync(request);
        var result = await response.Content.ReadAsStringAsync();
        return Ok(result);
      }
    }
    

    说明:从 HttpClientFactory 中获取定义好的名为 githubHttpClient 对象,和普通的 HttpClient 的区别是此 HttpClient 已具有定义的各种 Polly 策略,其他没任何区别;

转:https://www.jianshu.com/p/f4444c04b05c

原文地址:https://www.cnblogs.com/fanfan-90/p/12151684.html

时间: 2024-11-10 06:59:57

ASP.NET Core-HttpClientFactory + Polly 实现熔断降级【转】的相关文章

熔断降级(Polly)

熔断降级(Polly) https://www.cnblogs.com/qhbm/p/9224307.html 一. 什么是熔断降级 熔断就是"保险丝".当出现某些状况时,切断服务,从而防止应用程序不断地尝试执行可能会失败的操作给系统造成"雪崩",或者大量的超时等待导致系统卡死. 降级的目的是当某个服务提供者发生故障的时候,向调用方返回一个错误响应或者替代响应.举例子:调用联通接口服务器发送短信失败之后,改用移动短信服务器发送,如果移动短信服务器也失败,则改用电信短

ASP.NET Core 2.1 中的 HttpClientFactory (Part 3) 使用Handler实现传出请求中间件

原文:https://www.stevejgordon.co.uk/httpclientfactory-aspnetcore-outgoing-request-middleware-pipeline-delegatinghandlers  发表于:2018年4月 先前的系列文章中我介绍了一些核心概念,并且展示了ASP.NET Core 2.1中新的IHttpClientFactory的一些示例.前面两个帖子开始已经有一段时间了,我想通过讨论带有handler的“传出请求中间件”的概念来继续本系列

asp.net core microservices 架构之eureka服务发现

一 简介 微服务将需多的功能拆分为许多的轻量级的子应用,这些子应用相互调度.好处就是轻量级,完全符合了敏捷开发的精神.我们知道ut(单元测试),不仅仅提高我们的程序的健壮性,而且可以强制将类和方法的设计尽量的单一化.那么微服务也是这样,敏捷对于软件工程的意义就是快速开发,验证市场需求,然后快速改进,从而适应市场节奏.什么东西要快速,就必须轻量级.大家知道一个应用的复杂程度,完全是和这个项目的功能和代码数量挂钩的,这是软件自诞生就存在的问题,一个设计不好的软件,最后会让这个软件更新和改进变的非常复

一次业务网关用ASP.NET Core 2.1重构的小结

目录 前言 统一鉴权 服务限流 路由转发 参数重组 链路跟踪 熔断降级 服务计次 业务指标监控 日志记录 迭代更新 总结 前言 对于API网关,业界貌似对它进行下划分,有下面几个分类/场景. 面向Web App 面向Mobile App 面向Partner OpenAPI 面向Partner ExternalAPI 其他... 在18年8月份的时候,有幸用.NET Core 2.1重构了一个对外的业务网关项目,这个项目的作用其实就是将公司内部能提供的数据能力公开出来,可以让有需要的公司使用. 这

Asp.Net Core 轻松学-HttpClient的演进和避坑

前言 ????在 Asp.Net Core 1.0 时代,由于设计上的问题, HttpClient 给开发者带来了无尽的困扰,用 Asp.Net Core 开发团队的话来说就是:我们注意到,HttpClient 被很多开发人员不正确的使用.得益于 .Net Core 不断的版本快速升级:解决方案也一一浮出水面,本文尝试从各个业务场景去剖析 HttpClient 的各种使用方式,从而在开发中正确的使用 HttpClient 进行网络请求. 1.0时代发生的事情 1.1 在 1.0 时代,部署在 L

ASP.NET Core 微服务初探[1]:服务发现之Consul

在传统单体架构中,由于应用动态性不强,不会频繁的更新和发布,也不会进行自动伸缩,我们通常将所有的服务地址都直接写在项目的配置文件中,发生变化时,手动改一下配置文件,也不会觉得有什么问题.但是在微服务模式下,服务会更细的拆分解耦,微服务会被频繁的更新和发布,根据负载情况进行动态伸缩,以及受资源调度影响而从一台服务器迁移到另一台服务器等等.总而言之,在微服务架构中,微服务实例的网络位置变化是一种常态,服务发现也就成了微服务中的一个至关重要的环节. 服务发现是什么 其实,服务发现可以说自古有之,我们每

ASP.NET Core OceLot 微服务实践

1.OceLot中间件介绍 在传统的BS应用中,随着业务需求的快速发展变化,需求不断增长,迫切需要一种更加快速高效的软件交付方式.微服务可以弥补单体应用不足,是一种更加快速高效软件架构风格.单体应用被分解成多个更小的服务,每个服务有自己的独立模块,单独部署,然后共同组成一个应用程序.把范围限定到单个独立业务模块功能.分布式部署在各台服务器上. 而Ocelot开发的目标就是使用.NET运行面向微服务/服务的架构,要达到这个目标需要一个统的系统入口点(我们统称为API网关),同时需要与Identit

【转】ASP.NET Core API 版本控制

几天前,我和我的朋友们使用 ASP.NET Core 开发了一个API ,使用的是GET方式,将一些数据返回到客户端 APP.我们在前端进行了分页,意味着我们将所有数据发送给客户端,然后进行一些data.length操作,以获得items count用于分页逻辑.为了减少HTTP请求的负荷,我们决定在后端(服务器端分页)实现逻辑.在我们这样的情况下,这是没有任何问题的,因为我们在客户端能快速实现.我们在客户端和服务端修改了所有逻辑,并且快速完成所有功能. 但是,您可能会有其他客户端在使用,因为只

58HouseSearch项目迁移到asp.net core

前言 58HouseSearch这个项目原本是基于ASP.NET MVC 4写的,开发环境是Windows+VS2015,发布平台是linux+mono+jexus,这样看来整个项目基本已经满足跨平台的需求. 这样一来,本来我是没什么动力去做迁移的,好好的东西闲着没事干才迁移呢. 不过,这不国庆了么?穷人不是在家穷游天下么?所以…真的有点闲着没事干了. 迁移可行性探讨 项目迁移前,我们还是先来讨论一下迁移可行性.为嘛要进行可行性探讨呢?原因是.NET CORE是一个跨平台的框架,和上一代的.NE