Springs RestTemplate 默认连接池

Springs RestTemplate default connection pool

只是想知道开箱即用的 RestTemplate 是使用连接池还是每次都只是建立一个新连接?

默认情况下,RestTemplate 每次都会创建新的 Httpconnection,并在完成后关闭连接。

如果您需要在 rest 模板下有一个连接池,那么您可以使用 ClientHttpRequestFactory 的不同实现来池化连接。

new RestTemplate(new HttpComponentsClientHttpRequestFactory())

我相信 RestTemplate 不使用连接池发送请求,它使用 SimpleClientHttpRequestFactory 包装标准 JDKHttpURLConnection 打开和关闭连接。

您确实可以配置 RestTemplate 以使用诸如 HttpComponentsClientHttpRequestFactory 之类的池化实现,但您很可能还需要配置一些设置以防止请求超时。

我在 Troubleshooting Spring's RestTemplate Requests Timeout

上写了关于这个问题的博客

是的,Spring RestTemplateBuilder 使用 Apache HttpClient 进行池化 (usage)。 RestTemplateBuilder 创建 HttpComponentsClientHttpRequestFactory 并使用 HttpClientBuilder.

HttpClientBuilder,默认情况下,将每个路由(主机)的池大小设置为 5,总池大小设置为 10 (source):

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

我们可以在spring的rest模板下使用okhttpclient来使用连接池。下面有详细的博客

https://www.bytesville.com/changing-httpclient-in-spring-resttemplate/

您可以为 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

编辑

如果您想使用千分尺指标,您还应该使用 来构建 RestTemplate。