
resttemplate 默认使用 httpclient 的连接池,其默认配置限制每个路由最多2个并发连接,导致第3个请求被阻塞;本文详解如何通过自定义 poolinghttpclientconnectionmanager 调整连接池大小,提升并发能力。
resttemplate 默认使用 httpclient 的连接池,其默认配置限制每个路由最多2个并发连接,导致第3个请求被阻塞;本文详解如何通过自定义 poolinghttpclientconnectionmanager 调整连接池大小,提升并发能力。
在 Spring 应用中,RestTemplate 是常用的 HTTP 客户端封装。但若未显式配置底层连接池,它将依赖 Apache HttpClient 的默认策略——每个目标路由(route)最多仅允许 2 个并发连接,总连接数上限也为 2。这会导致:当发起第 3 个同步请求时,线程被阻塞,直至前序请求释放连接,严重制约高并发场景下的服务调用性能。
根本原因在于 HttpClients.custom().build() 创建的客户端,默认使用了 BasicHttpClientConnectionManager(单连接)或未调优的 PoolingHttpClientConnectionManager。而正确做法是显式构建并配置连接池管理器:
@Bean
public RestTemplate restTemplate() throws Exception {
// 1. 配置 SSL(跳过证书校验,仅用于测试环境)
TrustStrategy acceptingTrustStrategy = (chain, authType) -> true;
SSLContext sslContext = SSLContextBuilder.create()
.loadTrustMaterial(null, acceptingTrustStrategy)
.build();
SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(sslContext);
// 2. 自定义连接池管理器(关键步骤)
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
connectionManager.setMaxTotal(100); // 全局最大连接数
connectionManager.setDefaultMaxPerRoute(20); // 每个 host:port 路由最大连接数
// 3. 构建 HttpClient 并注入连接池与 SSL 工厂
CloseableHttpClient httpClient = HttpClients.custom()
.setConnectionManager(connectionManager)
.setSSLSocketFactory(socketFactory)
.setConnectionManagerShared(true) // 推荐启用:允许多个 HttpClient 实例共享连接池
.build();
// 4. 绑定到 RestTemplate
HttpComponentsClientHttpRequestFactory factory =
new HttpComponentsClientHttpRequestFactory(httpClient);
factory.setConnectTimeout(5000);
factory.setReadTimeout(10000);
return new RestTemplate(factory);
}
✅ 关键参数说明:
- setMaxTotal(100):整个连接池可维护的最大连接总数(含所有目标主机);
- setDefaultMaxPerRoute(20):对任意 https://api.example.com:443 这类路由,默认最多保持 20 个活跃连接;也可通过 setMaxPerRoute(HttpRoute route, int max) 设置特定主机的独立上限;
- setConnectionManagerShared(true):确保连接池在多个 RestTemplate 或 CloseableHttpClient 实例间复用,避免资源浪费。
⚠️ 注意事项:
- 生产环境严禁无条件信任所有证书(如 acceptingTrustStrategy)。应使用受信 CA 证书或按需配置指定证书链;
- 连接数并非越大越好:需结合服务端承受能力、客户端线程模型及系统文件句柄限制综合评估;建议通过压测确定最优值;
- 若使用 Spring Boot 2.0+,推荐优先考虑 WebClient(基于 Netty,非阻塞、连接复用更高效),RestTemplate 已标记为 @Deprecated(自 Spring Framework 6.1 起);
- 记得为 RestTemplate 显式设置超时(connectTimeout/readTimeout),防止连接池因长阻塞请求而耗尽。
通过以上配置,可彻底解除“第 3 个请求被阻塞”的瓶颈,使 RestTemplate 真正支持生产级并发调用。










