一 为什么 HttpClient 需要连接池
一次创建连接是一次 TCP 进行三次握手的操作,一次销毁连接是一次 TCP 进行四次挥手的操作。采用连接池技术管理连接,连接可以得到复用,能给减少在创建连接和销毁连接所花的时间,减少服务器资源的消耗,能够达到较高的并发。
二 HttpClient 连接池的配置
public class HttpClientUtils {
// 客户端从服务端读取数据的超时时间
private static final int HTTP_TIMEOUT = 500;
// 客户端与服务器建立连接的超时时间
private static final int HTTP_CON_TIMEOUT = 200;
// 客户端从连接池中获取连接的超时时间
private static final int HTTP_CON_REQ_TIMEOUT = 100;
// 路由的默认最大连接
private static final int HTTP_MAX_PERROUTE = 500;
// 整个连接池连接的最大值
private static final int HTTP_MAX_TOTAL = 1000;
private static RequestConfig defaultRequestConfig = null;
private static CloseableHttpClient httpClient = null;
static {
// 创建连接池管理器
PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager();
// 设置socket配置
SocketConfig socketConfig = SocketConfig.custom()
.setTcpNoDelay(true)
.build();
connManager.setDefaultSocketConfig(socketConfig);
connManager.setMaxTotal(HTTP_MAX_TOTAL);
connManager.setDefaultMaxPerRoute(HTTP_MAX_PERROUTE);
// 设置获取连接超时时间、建立连接超时时间、从服务端读取数据的超时时间
defaultRequestConfig = RequestConfig.custom()
.setSocketTimeout(HTTP_TIMEOUT)
.setConnectTimeout(HTTP_CON_TIMEOUT)
.setConnectionRequestTimeout(HTTP_CON_REQ_TIMEOUT)
.build();
// 创建httpclient实例
httpClient = HttpClients.custom()
.setConnectionManager(connManager)
.setDefaultRequestConfig(defaultRequestConfig)
.build();
}
}