在我们平时进行 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
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。