我想知道 RestTemplate 是否默认使用连接池,还是每次都建立一个新的连接?
我想知道 RestTemplate 是否默认使用连接池,还是每次都建立一个新的连接?
是的,Spring RestTemplateBuilder
使用 Apache HttpClient 进行连接池管理 (用途)。
RestTemplateBuilder
创建 HttpComponentsClientHttpRequestFactory
并使用 HttpClientBuilder
。
HttpClientBuilder
默认每个路由(主机)设置为5个连接,总连接数为10个 (来源):
s = System.getProperty("http.maxConnections", "5");
int max = Integer.parseInt(s);
poolingmgr.setDefaultMaxPerRoute(max);
poolingmgr.setMaxTotal(2 * max);
要检查连接池日志,请按以下方式设置日志级别:
org.apache.http.impl.conn.PoolingHttpClientConnectionManager=TRACE
我认为RestTemplate
在发送请求时并不使用连接池,它使用一个SimpleClientHttpRequestFactory
来包装标准的JDK
的HttpURLConnection
以打开和关闭连接。
确实,您可以配置RestTemplate
使用像HttpComponentsClientHttpRequestFactory
之类的池化实现,但很可能您还需要配置一些设置以防止请求超时。
我已经在Troubleshooting Spring's RestTemplate Requests Timeout中发表了关于这个问题的博客文章。
默认情况下,RestTemplate每次创建新的Http连接,并在完成后关闭该连接。
如果您需要在rest模板下进行连接池管理,则可以使用不同的ClientHttpRequestFactory实现来对连接进行池化。
new RestTemplate(new HttpComponentsClientHttpRequestFactory())
您可以为RestTemplate
创建一个Bean并在那里进行配置:
@Bean
public RestTemplate restTemplate() {
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
connectionManager.setMaxTotal(100);
connectionManager.setDefaultMaxPerRoute(20);
RequestConfig requestConfig = RequestConfig
.custom()
.setConnectionRequestTimeout(5000) // timeout to get connection from pool
.setSocketTimeout(5000) // standard connection timeout
.setConnectTimeout(5000) // standard connection timeout
.build();
HttpClient httpClient = HttpClientBuilder.create()
.setConnectionManager(connectionManager)
.setDefaultRequestConfig(requestConfig).build();
ClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient);
return new RestTemplate(requestFactory);
}
你可以进行很多配置。请参阅https://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/impl/client/HttpClientBuilder.html
编辑
如果你想使用micrometer指标,你还应该使用RestTemplateBuilder来构建RestTemplate。
org.apache.httpcomponents:httpclient
库)默认情况下,已配置由PoolingHttpClientConnectionManager管理的连接池。
连接的默认并发设置(您可以在此处找到有关默认设置的更多信息:https://hc.apache.org/httpcomponents-client-4.5.x/current/tutorial/html/connmgmt.html):
PoolingHttpClientConnectionManager在每个路由和总体上维护连接数的最大限制。默认情况下,此实现将不会为给定路由创建超过2个并发连接,并且总共不会超过20个连接。对于许多真实世界的应用程序来说,这些限制可能过于约束,特别是如果它们使用HTTP作为其服务的传输协议。
https://www.bytesville.com/changing-httpclient-in-spring-resttemplate/