极简版的实现,核心架构的原初模型
从MinimalHttpClient从名字可以看出,是一个极简可以用的版本,是核心设计的原初模型。所以我们就从最精简的开始分析。
核心元素只有三个,一个参数 params,一个执行器 requestExecutor,一个连接管理器 connManager。
HttpClientConnectionManager(@since 4.3):
连接池组件,管理连接的整个生命周期。连接在连接池中创建、复用以及移除。Connection manager封装了对连接池的具体操作,比如向连接池租用和归还连接。
Connection被创建出来后处于闲置状态,由连接池管理,调用时会校验是否是open状态,不是的话会进行connect。connect的过程就是 基于不同schema(主要是http和https)创建不同的socket连接(ssl和plain)并且将http请求(连接)绑定到socket。同时连接也会因为心跳或者过期等原因被close变成stale状态,直至被下一次get到时或者连接满时被清理出去。
同时连接池还能对连接进行限流–全局和单route连接数。
ClientExecChain:
代表一次完整的调用执行过程,它是一个包装类,类似于java io类,每个包装类完成一个特定的功能,多层嵌套完成一个系统性的功能,比如处理协议范畴的例如cookie、报文解析等,又比如处理自动重试的,等等。
|
再来看核心的执行方法
@Override
protected CloseableHttpResponse doExecute(
final HttpHost target,
final HttpRequest request,
final HttpContext context) throws IOException, ClientProtocolException {
Args.notNull(target, "Target host");
Args.notNull(request, "HTTP request");
HttpExecutionAware execAware = null;
if (request instanceof HttpExecutionAware) {
execAware = (HttpExecutionAware) request;
}
try {
final HttpRequestWrapper wrapper = HttpRequestWrapper.wrap(request);
final
HttpClientContext localcontext = HttpClientContext.adapt(
context != null ? context : new BasicHttpContext());
final
HttpRoute route = new HttpRoute(target);
RequestConfig config = null;
if (request instanceof Configurable) {
config = ((Configurable) request).getConfig();
}
if (config != null) {
localcontext.setRequestConfig(config);
}
return this.re
|