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