HttpComponents HttpClient连接池-结构

Posted TA码字

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HttpComponents HttpClient连接池-结构相关的知识,希望对你有一定的参考价值。

在我们平时进行 http调用的时候经常使用apache httpclient这个组件,它提供了http连接池管理,这里我们对它的实现做分析。 另外除了httpclient组件,也可以使用spring的resttemplate组件,resttemplate一般也是整合 httpclient 组件来实现 http 调用。 对于比较老的httpclient 版本(3.x)建议不要使用,这里我们基于http components httpclient  4.5.9版本,包括一下内容:
  • httpclient连接池的关键类和数据结构

  • http连接的申请

  • http连接的释放

  • http连接的重用

  • http连接的keep alive

  • http连接的可用性检查

  • 空闲http连接的清理

  • http请求的retry

  • SSL请求的支持

  • 连接池中的长连接

httpclient 关键类和数据结构

CPool 代表 httpclient连接池,其里面存放 CpoolEntry 类型对象作为池化item,该对象包含ManagedHttpClientConnection类型对象,ManagedHttpClientConnection包装原始java socket作为http连接:

  • CPool==>httpclient 连接池

  • CPoolEntry==>连接池中的 item

  • ManagedHttpClientConnection==>包装 socket,代表 http 连接

  • PoolingHttpClientConnectionManager==>连接池管理器

  • HttpClientBuilder==>Builder 模式实现创建 httpclient
HttpComponents HttpClient连接池(1)-结构
  • httpclient 连接池对于每一个 fqdn + port 定义为唯一 route,对于每一个 route 都有一个 RouteSpecificPool 类型对象对应。这个对象也是一个连接池,既在 httpclient 连接池里,对每一个 route 访问都独立建立各自的连接池,从而实现不同 route 访问连接池隔离。在连接池对象 Cpool 里由 Map 存储,key 为 route,value 为RouteSpecificPool 对象。

  • 连接池对象里有 Set 类型集合 leased,代表 global 连接池里正在使用的连接集合。

  • 连接池对象实例里有 LinkedList 类型集合 available,代表 global 连接池里可用的连接集合,每次申请连接的时候优先从这个集合里获取。

  • 连接池对象里有 LinkedList 类型集合 pending,代表 global 连接池里已经没有可用连接的时候,正在等待申请的 items 集合。

  • 对于单独 route 的连接池,有Set类型集合 leased,代表 individual 连接池里正在使用的连接集合。

  • 对于单独 route 的连接池,有 LinkedList 类型集合 available,代表individual 连接池里可用的连接集合,每次申请连接的时候优先从这个集合里获取。

  • 对于单独 route 的连接池,有 LinkedList 类型集合 pending,代表 individual 连接池里已经没有可用连接的时候,正在等待申请的 items集合。

  • CpoolEntry 类型对象代表 global 连接池和 individual 连接池里的池化 item,主要属性有id,route 和 managedConnection。

  • ManagedHttpClientConnection 类型实例对象中包含AtomicReference<Socket> 类型对象,包装引用原始 socket,代表 http 连接。

目前先写到这里,在下一篇文章里我们开始介绍http连接的申请,释放,重用以及 keep alive。

以上是关于HttpComponents HttpClient连接池-结构的主要内容,如果未能解决你的问题,请参考以下文章

HttpComponents HttpClient连接池-结构

org.apache.httpcomponents.httpclient

org.apache.httpcomponents:httpclient 工具类

httpcomponents.httpclient 使用

org.apache.httpcomponents httpclient 发起HTTP JSON请求

Apache HttpComponents HttpClient 5.0 - Kerberos SPNEGO 客户端