jiaji's blog

httpClient参数设置

httpClient是一个不考虑向下兼容的库,从3.x到4.x,几乎每个版本都有较大差异。本文使用的是4.5.2。

httpClient是一个比较常用的库,客户端使用它,或者以它为底层的网络库来向服务端发http请求。通常为了简单,每次需要请求的时候都会new一个HttpClient实例出来,拿到结果后再close掉这个实例。

但是对于服务端来说,在高并发的时候,每次new实例出来,在性能上是不可接受的。所以考虑所有的请求只用一个httpClient实例来搞定,这时候就需要好好check下这个httpClient的参数。

参数设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
private HttpClient httpClient;
@PostConstruct
void init() {
//连接池配置
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
//最大并发连接数
connectionManager.setMaxTotal(500);
//每个url支持的并发连接数
connectionManager.setDefaultMaxPerRoute(200);
//超时配置
RequestConfig requestConfig = RequestConfig.custom()
//从连接池中取连接
.setConnectionRequestTimeout(1000)
//进行连接
.setConnectTimeout(5000)
//socket读
.setSocketTimeout(5000).build();
httpClient = HttpClients.custom()
.setDefaultRequestConfig(requestConfig)
.setConnectionManager(connectionManager)
.build();
}

默认情况下,Per default this implementation will create no more than than 2 concurrent connections per given route and no more 20 connections in total。所以需要设置下总的连接数和每个route支持的连接数,否则当并发量大时,从连接池中取连接时会取不到,导致请求失败。

使用httpClient最怕发生阻塞且没有超时返回的情况,所以需要根据自己的需求配置三个超时时间。