Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >asp.net core 使用HttpClientFactory Polly实现熔断降级

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

原创
作者头像
HueiFeng
修改于 2020-02-12 06:47:19
修改于 2020-02-12 06:47:19
8540
举报
文章被收录于专栏:HueiFeng技术专栏HueiFeng技术专栏

前言

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添加
代码语言:txt
AI代码解释
复制
services.AddHttpClient();
  • 通过IHttpClientFactory创建一个HttpClient对象,后面操作如旧,但是不需要关心其资源释放
代码语言:txt
AI代码解释
复制
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 的配置。)

  • PackagePM> Install-package Microsoft.Extensions.Http.PollyStartup 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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C#中的HTTP客户端:专家级最佳实践与性能优化指南
在微服务架构中,或与外部API通信时,HTTP客户端是必不可少的组件。然而,许多开发人员在实现HTTP客户端时未能充分考虑性能和可用性。
郑子铭
2025/04/21
1120
C#中的HTTP客户端:专家级最佳实践与性能优化指南
asp.net core 使用HttpClientFactory Polly实现熔断降级
在NET Core2.1后也是增加更新了很多东西,当然HttpClientFactory更新中的一部分.虽然说HttpClient这个实现了disposable,但使用它的时候用using包装块的方式通常不是最好的选择。
梁规晓
2019/09/24
9270
asp.net core 使用HttpClientFactory Polly实现熔断降级
.NET Core 3.0深入源码理解HttpClientFactory之实战
前面两篇文章透过源码角度,理解了HttpClientFactory的内部实现,当我们在项目中使用时,总会涉及以下几个问题:
AI.NET 极客圈
2019/08/06
1.3K0
Asp.net Core Flurl.Http 结合IHttpClientFactory管理HttpClient生命周期
不过它因为出现的比较早,并没有使用asp.net core中的IHttpClientFactory 管理HttpClient实例,而是自己管理。一般是根据host来缓存一个HttpClient实例,比如你请求所有的https://www.baidu.com/ 都用一个缓存的实例,这样可能会有些问题,比如Dns更新等;
乔达摩@嘿
2021/08/05
9980
ASP.NET Core 6框架揭秘实例演示[17]:利用IHttpClientFactory工厂来创建HttpClient
在一个采用依赖注入框架的应用中,我们一般不太推荐利用手工创建的HttpClient对象来进行HTTP调用,使用的HttpClient对象最好利用注入的IHttpClientFactory工厂来创建。前者引起的问题,以及后者带来的好处,将通过如下这几个演示程序展现出来。IHttpClientFactory类型由“Microsoft.Extensions.Http”这个NuGet包提供,“Microsoft.NET.Sdk.Web”SDK具有该包的默认引用。如果采用“Microsoft.NET.Sdk”这个SDK,需要添加该包的引用。(本篇提供的实例已经汇总到《ASP.NET Core 6框架揭秘-实例演示版》)
蒋金楠
2022/05/09
8630
ASP.NET Core 6框架揭秘实例演示[17]:利用IHttpClientFactory工厂来创建HttpClient
asp.net core之HttpClient
本文介绍了ASP.NET Core中的HttpClient和HttpClientFactory的作用、用法以及最佳实践。通过示例代码的展示,读者可以了解如何使用HttpClient发送HTTP请求并处理响应,以及如何使用HttpClientFactory来解决HttpClient的一些问题,如资源泄漏和性能问题。同时,本文还强调了HttpClientFactory的优势,如更好的性能、资源管理和可配置性。通过深入理解和应用HttpClient和HttpClientFactory,开发人员可以更好地与外部服务进行通信。
饭勺oO
2023/10/18
4980
asp.net core之HttpClient
基于 keyed DI 的 HttpClient
.NET 8 中依赖注入引入了 keyed service 的支持 可以参考 .NET 8 中的 KeyedService,.NET 9 中改进了 HttpClient 基于名称的 HttpClient 依赖注入,使用基于名称的 HttpClient 的时候可以直接使用 keyed service 来解析了
郑子铭
2025/03/29
420
基于 keyed DI 的 HttpClient
.NET使用HttpClientFactory和Polly 替代直接调用HttpClient的优势
在 .NET 开发中,发出高效、可靠、且可伸缩的 Web 请求至关重要。过去,开发人员习惯直接使用 HttpClient 发出请求,这种方法看似简单:
郑子铭
2024/12/05
1660
.NET使用HttpClientFactory和Polly 替代直接调用HttpClient的优势
HttpClientFactory的套路,你知多少?
ASP.NET Core 在 2.1 之后推出了具有弹性 HTTP 请求能力的 HttpClient 工厂类 HttpClientFactory。
有态度的马甲
2020/04/15
1.5K0
.NET Core 3.0之深入源码理解HttpClientFactory(一)
创建HttpClient实例的时候,在内部会创建HttpMessageHandler链,我们知道HttpMessageHandler是负责建立连接的抽象处理程序,所以HttpClient的维护实际上就是维护HttpMessageHandler的使用,释放HttpClient并不会及时释放连接,而通常情况下一般是创建全局使用的HttpClient实例,以减少重复连接的次数。当然这种方式所带来的的弊端也是显而易见的,因为当前的HttpClient实例所指向的服务器发生问题或者DNS发生变更,那么该实例是无法做到自动更新指向的。
AI.NET 极客圈
2019/07/25
1K0
.NET Core 3.0之深入源码理解HttpClientFactory(一)
Asp.Net Core中HttpClient的使用方式
在.Net Core应用开发中,调用第三方接口也是常有的事情,HttpClient使用人数、使用频率算是最高的一种了,在.Net Core中,HttpClient的使用方式随着版本的升级也发生了一些变化,本次就讲解一下Asp.Net Core2.1前后使用的两种方式。
心莱科技雪雁
2019/03/11
1.3K0
Asp.Net Core中HttpClient的使用方式
.NET Core 3.0之深入源码理解HttpClientFactory(二)
上一篇文章讨论了通过在ConfigureServices中调用services.AddHttpClient()方法,并基于此进一步探讨了DefaultHttpClientFactory是如何创建HttpClient实例和HttpMessageHandler实例的,并了解了DefaultHttpClientFactory内部维护者一个定时器和两个HttpMessageHandler对象集合,以定期清理无效的 HttpMessageHandler对象,详细的内容可以点击链接跳转,接下来我会接着前一篇文章继续展开相关讨论。
AI.NET 极客圈
2019/07/30
8780
精:在 .NET 8中使用 Polly 处理瞬态故障
在本文中,我们将学习如何在与服务交互时实现重试机制,尤其当服务出现一些瞬态故障时。
郑子铭
2024/12/10
2680
精:在 .NET 8中使用 Polly 处理瞬态故障
.NET 9 的网络改进
继续我们的传统,我们很高兴分享一篇博客文章,重点介绍新 .NET 发布版本中网络领域的最新和最有趣的变更。今年,我们在 HTTP 领域引入了更新,新增了 HttpClientFactory API,改进了 .NET Framework 的兼容性等。
郑子铭
2025/03/27
750
.NET 9 的网络改进
HttpClient 调用WebAPI时—传参的三种方式(ASP.NET MVC&CORE均适用)
代码里有注释: 方法一,传json参数 方法二,传表单参数 方法三,传字节流 public void Post() { //方法一,传json参数 var d = new { username = " ", password = " ", grant_type = "password", appcode = " ",
红目香薰
2022/11/29
1.1K0
.NetCore 2.1以后的HttpClient最佳实践
ASP.NET Core 2.1中出现一个新的HttpClientFactory功能,
leon公众号精选
2022/04/27
1.2K0
.NetCore 2.1以后的HttpClient最佳实践
.net core HttpClient 使用之消息管道解析(二)
前面分享了 .net core HttpClient 使用之掉坑解析(一),今天来分享自定义消息处理HttpMessageHandler和PrimaryHttpMessageHandler 的使用场景和区别
Jlion
2022/04/07
7060
.net core HttpClient 使用之消息管道解析(二)
.net core HttpClient 使用之掉坑解析(一)
在我们开发当中经常需要向特定URL地址发送Http请求操作,在.net core 中对httpClient使用不当会造成灾难性的问题,这篇文章主要来分享.net core中通过IHttpClientFactory 工厂来使用HttpClient的正确打开方式。
Jlion
2022/04/07
9890
.net core HttpClient 使用之掉坑解析(一)
基于PaddleOCR实现AI发票识别的Asp.net Core应用
用户批量上传需要识别的照片,上传成功后,系统会启动Hangfire后台Job开始调用PaddleOCR服务返回结果,这个过程有点类似微服务的架构模型。
阿新
2021/10/09
1.6K0
基于PaddleOCR实现AI发票识别的Asp.net Core应用
.Net Core with 微服务 - Polly 服务降级熔断
在我们实施微服务之后,服务间的调用变的异常频繁。多个服务之间可能是互相依赖的关系。某个服务出现故障或者是服务间的网络出现故障都会造成服务调用的失败,进而影响到某个业务服务处理失败。某一个服务调用失败轻则造成当前相关业务无法处理;重则可能耗尽资源而拉垮整个应用。为了尽可能的保证我们生产环境的可用性,至少是部分可用性我们就需要一些策略来保护我们的服务。
MJ.Zhou
2021/07/28
7030
推荐阅读
相关推荐
C#中的HTTP客户端:专家级最佳实践与性能优化指南
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档