HttpClient
2020-12-11 16:18:34 0 举报
HttpClient源码解析相关核心流程图
作者其他创作
大纲/内容
发送请求
17:当前线程进入pending挂起等待唤醒
得到有效连接ManagedHttpClientConnection
RouteSpecificPool
否
1:getEntity
avaliable移除连接leased加入连接
挂起当前线程,将当前线程获取连接的PoolEntityFuture放入pending队列
10:getPoolEntryBlocking
9
ConnectionKeepAliveStrategy长连接策略
RedirectExec
19:close
16:creturn conn
是
HttpRequestExecutor
15: 13产生的conn入池
ServiceUnavailableRetryExec
HttpRequestBaseHttpGet、HttpPost都继承该类
MainClientExec
7:EofSensorWatchestreamClose
8:leaseConnection
MainClientExec创建主要的请求执行器,并将上面9个配置塞入该执行器其基于责任链模式
routeToPool 中 avaliable是否有可用连接
RedirectExecspan style=\"font-size: inherit;\
关闭连接
13:create
TargetAuthenticationStrategy目标身份认证策略
HttpResponseProxy
唤醒routeToPool中的pending队列的第一个PoolEitryFuture,将其从pending中删除,并将其从外层的CPool的pending队列中删除
用户释放连接
14:free
Feture<CPoolEntity>外层循环体
连接是否过期
从缓存中获取当前路由对应的连接池routeToPool,如果没有创建对应连接池并放缓存
17
释放连接时序图
15
超时
从两个循环体来看,最终用户拿到的连接有三种:新创建的;未过期的短连接;间隔检查的永久链接需要注意,间隔检查的永久链接, 如果在间隔时间(这里是2s)内,socket连接出现什么问题,是不知道的,因为没有进行检测。另外,检查链接是否可用的方法 isStale ,并不是100%靠谱的,即检测时出现SocketTimeoutException时,认为是可用的。而这时候,很有可能连接不可用,比如服务端关闭链接的情况。通过establishRoute(),建立socket连接并与ManagedHttpClientConnection
每个路由有各自的连接池CPool缓存所有路由连接池
PublicSuffixMatcher公共后缀列表匹配器用在共同顶级域名下的子域名,保证SSL证书不误用
获取连接时序图
11:releaseConnection
18:return coon
HttpEntity
connFactory创建对应路由连接,连接入routeToPoolleased加入连接
HttpClient
否,被正常唤醒
HttpClientBuilder.build()
UserAgentuserAgent请求头,默认Apache-HttpClient
用户
12:creturn CPoolEntry
9:get
连接是否有效
PoolingHttpConnectionManager
ProtocolExec
13:release
ConnectionHolder
3
CPool
4:returnFuture<CPoolEntry>
连接是否关闭
ProxyAuthenticationStrategy代理身份认证策略
无空闲连接,且池中没达到最大连接数
Future<CPoolEntry>
创建默认实例:HttpClients.createDefault() 或者 自定义各配置的实例:HttpClients.custom().set...build()
计算并设置获取连接的超时时间(如果有设置的话)
Lookup<AuthSchemeProvider> ,目标认证机制Lookup<CookieSpecProvider>,cookie配置CredentialsProvider,证书提供者配置List<Closeable>,连接过期回收配置
HttpRoute
8:close
ConnectionRequest
10:releaseConnection
21
5:return Future<CPoolEntry>
从外层CPool中的leased集合删除,并放入 avaliable 队列首部
在读route下有空闲连接时
释放连接核心逻辑
ProtocolExec添加一下列 HttpProcessor 处理链进行消息编码解码等操作持有MainClientExec引用,责任链
7:get
获取连接核心逻辑
2:getEntity
BackoffStrategyExec
16
BackoffStrategyExec降级执行器,ConnectionBackoffStrategy配置策略,BackoffManager配置管理器持有RedirectExec引用,责任链
14:creturn conn
1:requestConnection
尝试从连接池获取可用连接
19:return coon
avaliable移除链接,routeToPool将该链接设为不可复用
ConnFactory
InternalHttpClient.ClientExecChain
InternalHttpClient 上述所有配置及责任链都塞入该类,设置请求配置同时返回该实例
5:consume or close stream
4
获取一个连接
返回连接
6:close
20
ResponseEntityProxy
RetryExec重试执行器,可自定义重试处理器HttpRequestRetryHandler持有ProtocolExec引用,责任链
6:return ConnectionRequest
2:lease
UserTokenHandler用户令牌处理器
是否超过validateAfterInactivity检查时间
ServiceUnavailableRetryExec重试执行器,请求不可达时,使用HttpRoutePlanner配置的路由规则持有RetryExec引用,责任链
HttpRoutePlannerHttp路由规则,请求不可达时使用
HttpResponse
12:reset
分别从routeToPool 和 外层CPool 中删除改连接,并关闭连接
3:new
HttpRequestExecutor请求执行器
从routeToPool中的leased集合删除,并放入 avaliable 队列首部
routeToPool 的连接数是否没达到MaxPerRoute限制,且全局连接数没达到MaxTotal
getPoolEntryBlocking 内层循环体
EofSensorInputStream
抛出超时异常
RetryExec
HttpClientConnectionManager连接池管理器
11:getFree
从routeToPool中租借连接
否,关闭该连接,并重新租借
ConnectionReuseStrategy连接重用策略
CPool 继承 AbstractConnPool
连接是否被标记为重用
无空闲连接,且池中已达到最大连接数
18
收藏
收藏
0 条评论
回复 删除
下一页