HttpClientFactory-向外请求的最佳

简介: 它的组件包是Microsoft.Extensions.Http复原HttpClient带来的问题
  • 它的组件包是Microsoft.Extensions.Http
  • 复原HttpClient带来的问题

1|1HttpClient相关问题

  • 虽然HttpClient类实现了IDisposable,但不是首选在using语句中声明和实例化它,因为释放HttpClient对象时,基础套接字不会立即释放,这可能会导致“套接字耗尽”问题 。因此,HttpClient 应进行一次实例化并在应用程序的生命周期中重复使用。 在负载较重的情况下,实例化每个请求的 HttpClient 类将耗尽可用的套接字数。 该问题会导致 SocketException 错误。 要解决此问题,可能的方法是将 HttpClient 对象创建为单一对象或静态对象,在长期运行的进程中使用 HttpClient 的共享实例时,开发人员遇到的另一个问题。 在将 HttpClient 实例化为单一实例或静态对象的情况下,它无法处理 DNS 更改,但是,问题实际上不是 HttpClient 本身,而是 HttpClient 的默认构造函数,因为它创建了一个新的实际 HttpMessageHandler 实例,该实例具有上面提到的“套接字耗尽”和 DNS 更改问题 。

参考解决内容

1|2核心点

  • 管理内部HttpMessageHandler的生命周期,灵活应对资源问题和DNS刷新问题。
  • 支持命名化,类型化配置,集中管理配置,避免冲突
  • 灵活的出站请求管道配置,轻松管理请求生命周期
  • 内置管道最外层和最内存日志记录器,有Information和Trace输出

1|3核心对象

  • HttpClient
  • HttpMessageHandler
  • SocketsHttpHandler
  • DelegatingHandler
  • IHttpClientFactory
  • IHttpClientBuilder

1|4使用方式

  • 基本用法
  • 命名客户端模式
  • 类型化客户端模式
  • 生成的客户端

基本用法

//首先,在Startup中的ConfigureService注册我们的HttClient服务,仅仅一行代码就可以搞定service.AddHttpClien();//接着,我们通过依赖注入来请求IHttpClientFactory,并创建HttpClient实例,以下代码之后我们就可以放心使用HttpClientpublicBasicUsageModel(IHttpClientFactory clientFactory) {   _clientFactory = clientFactory; }publicasync Task OnGet() {       var client = _clientFactory.CreateClient(); }

类型化客户端

publi classXXXClient{       IHttpClientFactory _httpclientFatory;       publicXXXClient(IHttpClientFactory httpclientFatory)       {             _httpclientFatory=httpclientFatory;       }       publicasync Task<string> Get()       {             var client = _httpclientFatory.CreateClient();             returnawait client.GetStringAsync("xxx.url");       } } 注册 services.AddHttpClient<XXXClient>();

1|5出站请求中间件

  • HttpClient具有委托处理程序概念。

创建委托处理程序

  • 派生自DelegatingHandler (将 HTTP 响应消息的处理委托给另一处理程序(称为“内部处理程序”)的 HTTP 处理程序的类型。)
  • 重写SendAsync

代码

publicclassxxxHandler : DelegatingHandler    {         protectedoverrideasync Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)         {             //处理请求                        var result = awaitbase.SendAsync(request, cancellationToken); //调用内部handler             //处理响应             return result;         }     }         publicvoidConfigureServices(IServiceCollection services){              services.AddSingleton<xxxHandler>();             services.AddHttpClient("XXXServiceClient", client =>             {                 client.DefaultRequestHeaders.Add("client-name", "namedclient");                 client.BaseAddress = new Uri("https://localhost:5003");             }).SetHandlerLifetime(TimeSpan.FromMinutes(20))             .AddHttpMessageHandler(provider => provider.GetService<xxxHandler>());             services.AddScoped<xxxHandler>(); }publicclassXXXServiceClient    {         IHttpClientFactory _httpClientFactory;         conststring _clientName = "NamedOrderServiceClient";  //定义客户端名称         publicXXXServiceClient(IHttpClientFactory httpClientFactory)         {             _httpClientFactory = httpClientFactory;         }         publicasync Task<string> Get()         {             var client = _httpClientFactory.CreateClient(_clientName); //使用客户端名称获取客户端             //使用client发起HTTP请求,这里使用相对路径来访问            returnawait client.GetStringAsync("/OrderService");         }     }

1|6生命周期

  • 每次对 IHttpClientFactory 调用 CreateClient 都会返回一个新 HttpClient 实例。 每个命名客户端都创建一个 HttpMessageHandler。 工厂管理 HttpMessageHandler 实例的生存期。
  • 处理程序的默认生存期为两分钟,可通过SetHandlerLifetime 重新设置。


相关文章
|
前端开发
68 # 中间层如何请求其他服务
68 # 中间层如何请求其他服务
38 0
|
Java 数据库 Maven
根据请求中接收到的主动协商头字段,目标资源没有用户代理可以接受的当前表示
今天使用ssm框架搭建了一个项目,测试一个插入的接口结果返回406,但是数据库插入成功了,报错406是因为返回的结果接口无法解析。
857 0
|
3月前
|
安全 Java Shell
【内网—内网转发】——http协议代理转发_reGeorg代理转发
【内网—内网转发】——http协议代理转发_reGeorg代理转发
106 3
|
6月前
|
设计模式 监控 网络协议
socket通信处于网络协议那一层和两种接收发送消息方式
socket通信处于网络协议那一层和两种接收发送消息方式
86 2
|
网络协议 安全 Unix
虚拟路由和转发 (VRF) 表上下文中的多点标签分发协议带内信令
本文档是 Internet 工程任务组 (IETF) 的产品。它代表了 IETF 社区的共识。它已接受公众审查,并已获互联网工程指导小组 (IESG) 批准出版。有关 Internet 标准的更多信息,请参见 RFC 5741 的第 2 节。
436 0
虚拟路由和转发 (VRF) 表上下文中的多点标签分发协议带内信令
|
缓存 安全 网络安全
详解通信数据转发程序:代理、网关、隧道
1.代理 代理服务器的基本行为就是接收客户端发送的请求后转发给其他服务器 持有资源实体的服务器被称为源服务器。从源服务器返回的响应经过代理服务器后再传给客户端 每次通过代理服务器转发请求或响应时,会追加写入Via首部信息🎶
214 2
详解通信数据转发程序:代理、网关、隧道
|
网络协议
HTTP 请求和响应为什么会被分成多个数据包进行传输?底层原理是什么?
HTTP 请求和响应为什么会被分成多个数据包进行传输?底层原理是什么?
1297 0
|
数据挖掘 Java
封装,分用、客户端服务器以及请求响应
封装,分用、客户端服务器以及请求响应
121 0
封装,分用、客户端服务器以及请求响应
privoxy自动请求转发到多个网络
有些时候我们需要通过不同的代理访问不同资源,比如某些ip或域名走本地网络,某些ip或域名走不可描述的代理等。当然这只是举个栗子! 我要解决的问题是:我的内网机器没有internet访问权限,但是我的应用程序有部分请求是要访问intranet网络,而部分请求要访问internet网络。
1897 0
45请求转发和请求重定向区别
45请求转发和请求重定向区别
92 0
45请求转发和请求重定向区别