配置连接池
@Autowired
private RestTemplateBuilder restTemplateBuilder;
/**
* 让spring管理RestTemplate,参数相关配置
*
* @return
*/
@Bean
public RestTemplate restTemplate() {
RestTemplate restTemplate = restTemplateBuilder.build();
restTemplate.setRequestFactory(clientHttpRequestFactory());
return restTemplate;
}
/**
* 客户端请求链接策略
*
* @return
*/
private ClientHttpRequestFactory clientHttpRequestFactory() {
HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory();
clientHttpRequestFactory.setHttpClient(httpClientBuilder().build());
clientHttpRequestFactory.setConnectTimeout(60000); // 连接超时时间/毫秒
clientHttpRequestFactory.setReadTimeout(60000); // 读写超时时间/毫秒
clientHttpRequestFactory.setConnectionRequestTimeout(50000);// 请求超时时间/毫秒
return clientHttpRequestFactory;
}
/**
* 设置HTTP连接管理器,连接池相关配置管理
*
* @return 客户端链接管理器
*/
private HttpClientBuilder httpClientBuilder() {
HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
httpClientBuilder.setConnectionManager(poolingConnectionManager());
ConnectionKeepAliveStrategy connectionKeepAliveStrategy = (httpResponse, httpContext) -> 20 * 1000;
httpClientBuilder.setKeepAliveStrategy(connectionKeepAliveStrategy);
httpClientBuilder.setRetryHandler(new DefaultHttpRequestRetryHandler());
RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout(10 * 1000)
.setSocketTimeout(10 * 1000)
.setConnectionRequestTimeout(10 * 1000)
.build();
httpClientBuilder.setDefaultRequestConfig(requestConfig);
return httpClientBuilder;
}
/**
* 链接线程池管理,可以keep-alive不断开链接请求,这样速度会更快 MaxTotal 连接池最大连接数 DefaultMaxPerRoute
* 每个主机的并发 ValidateAfterInactivity
* 可用空闲连接过期时间,重用空闲连接时会先检查是否空闲时间超过这个时间,如果超过,释放socket重新建立
*
* @return
*/
private HttpClientConnectionManager poolingConnectionManager() {
PoolingHttpClientConnectionManager poolingConnectionManager = new PoolingHttpClientConnectionManager();
poolingConnectionManager.setMaxTotal(1000);
poolingConnectionManager.setDefaultMaxPerRoute(5000);
poolingConnectionManager.setValidateAfterInactivity(30000);
poolingConnectionManager.closeIdleConnections(30, TimeUnit.SECONDS);
poolingConnectionManager.closeExpiredConnections();
return poolingConnectionManager;
}