前言

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

什么是HttpClientFactory

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

  • 提供命名和配置逻辑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 的配置。)

  • Package
PM> Install-package Microsoft.Extensions.Http.Polly

Startup

   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)); }

设置降级策略当出现任何异常返回fallback

设置熔断策略当连续出现异常异常 2 次,熔断 4s;

设置超时策略,请求超时为 1s,超时默认会抛出 TimeoutRejectedException;

效果如下

概要

示例地址:https://github.com/fhcodegit/HttpClientFactoryPolly

Polly:https://github.com/App-vNext/Polly

参考:https://blog.csdn.net/qq_42606051/article/details/81698662

asp.net core 使用HttpClientFactory Polly实现熔断降级的更多相关文章

  1. 在 ASP.NET Core Web API中使用 Polly 构建弹性容错的微服务

    在 ASP.NET Core Web API中使用 Polly 构建弹性容错的微服务 https://procodeguide.com/programming/polly-in-aspnet-core ...

  2. 使用.NetCore 控制台演示 熔断 降级(polly)

    1.熔断降级的概念: 熔断:我这里有一根长度一米的钢铁,钢铁的熔点1000度(假设),现在我想用力把这根钢铁折弯,但是人的力有限达不到折弯的点,然后我使用火给钢铁加热,每隔一段时间我就会尝试一下是否能 ...

  3. (1)学习笔记 ) ASP.NET CORE微服务 Micro-Service ---- 什么是微服务架构,.netCore微服务选型

    开发工具:VS2017 .Net Core 2.1 什么是微服务?单体结构: 缺点: 1)只能采用同一种技术,很难用不同的语言或者语言不同版本开发不同模块: 2)系统耦合性强,一旦其中一个模块有问题, ...

  4. 熔断 降级(polly)

    熔断 降级(polly) https://www.cnblogs.com/szlblog/p/9300845.html1.熔断降级的概念: 熔断:我这里有一根长度一米的钢铁,钢铁的熔点1000度(假设 ...

  5. ASP.NET Core 微服务初探[2]:熔断降级之Polly

    当我们从单体架构迁移到微服务模式时,其中一个比较大的变化就是模块(业务,服务等)间的调用方式.在以前,一个业务流程的执行在一个进程中就完成了,但是在微服务模式下可能会分散到2到10个,甚至更多的机器( ...

  6. (5)学习笔记 ) ASP.NET CORE微服务 Micro-Service ---- 熔断降级(Polly)

    一. 什么是熔断降级 熔断就是“保险丝”.当出现某些状况时,切断服务,从而防止应用程序不断地尝试执行可能会失败的操作给系统造成“雪崩”,或者大量的超时等待导致系统卡死. 降级的目的是当某个服务提供者发 ...

  7. ASP.NET Core 2.1 中的 HttpClientFactory (Part 4) 整合Polly实现瞬时故障处理

    原文:https://www.stevejgordon.co.uk/httpclientfactory-using-polly-for-transient-fault-handling发表于:2018 ...

  8. (7)学习笔记 ) ASP.NET CORE微服务 Micro-Service ---- 利用Polly+AOP+依赖注入封装的降级框架

    创建简单的熔断降级框架 要达到的目标是: 参与降级的方法参数要一样,当HelloAsync执行出错的时候执行HelloFallBackAsync方法. public class Person { [H ...

  9. 中小研发团队架构实践之生产环境诊断工具WinDbg 三分钟学会.NET微服务之Polly 使用.Net Core+IView+Vue集成上传图片功能 Fiddler原理~知多少? ABP框架(asp.net core 2.X+Vue)模板项目学习之路(一) C#程序中设置全局代理(Global Proxy) WCF 4.0 使用说明 如何在IIS上发布,并能正常访问

    中小研发团队架构实践之生产环境诊断工具WinDbg 生产环境偶尔会出现一些异常问题,WinDbg或GDB是解决此类问题的利器.调试工具WinDbg如同医生的听诊器,是系统生病时做问题诊断的逆向分析工具 ...

随机推荐

  1. Java学习|强引用,软引用,弱引用,幻想引用有什么区别?

    在Java语言中,除了基本数据类型外,其他的都是指向各类对象的对象引用:Java中根据其生命周期的长短,将引用分为4类. 1 强引用 特点:我们平常典型编码Object obj = new Objec ...

  2. Kafka 系列(五)—— 深入理解 Kafka 副本机制

    一.Kafka集群 Kafka 使用 Zookeeper 来维护集群成员 (brokers) 的信息.每个 broker 都有一个唯一标识 broker.id,用于标识自己在集群中的身份,可以在配置文 ...

  3. 自定义Dialog---实现优美对话框

    PS:自定义dialog,一些系统的dialog已经不能满足开发人员的需求了,所以,我们需要自定义一个属于并且适合自己项目的对话框,无论是颜色还是功能需求上都是和自己的项目紧密相关的,一些系统的对话框 ...

  4. sqoop与PG库导入导出数据

    导入数据到Hive sqoop import --connect jdbc:postgresql://172.66.6.666/radar5g4h --username postgres --pass ...

  5. 使用maven搭建ssm框架环境

    1.前言 因为经常换环境,在搭ssm框架的时候老是出错,所以记录一下最近搭建的环境,以供参考. 本文讲解如何使用maven搭建ssm框架,并能用于简单的登录注册. IDE:IDEA,JDK版本:1.8 ...

  6. go语言实现分布式对象存储系统之单体对象存储

    对象存储 基本概念 主流存储类型分为三种:块存储.文件存储以及对象存储 NAS(文件存储):Network Attached storage,提供了存储功能和文件系统的网络服务器,客户端可以访问NAS ...

  7. CentOS -- RocketMQ HA & Monitoring

    RocketMQ Architecture NameServer Cluster Name Servers provide lightweight service discovery and rout ...

  8. mac系统chrome浏览器快捷键

    开发中谷歌浏览器常用快捷键: 开发者工具台快捷键:option+command+iconsole控制台快捷键:option+command+j 或者 option+command+c 1. 标签页和窗 ...

  9. Vue+webpack项目的多环境打包配置

    背景:由于需要将应用部署到线上开发环境.线上测试环境.线上预发环境.线上生产环境,而每个环境的访问地址是不同的.如果每次更改请求地址未免有些繁琐,就考虑在本地进行一次性配置. 代码管理工具:git 代 ...

  10. python接口自动化测试之requests库详解

    前言 说到python发送HTTP请求进行接口自动化测试,脑子里第一个闪过的可能就是requests库了,当然python有很多模块可以发送HTTP请求,包括原生的模块http.client,urll ...