rest-template是spring对httpclient的逻辑封装,它底层还是基于httpclient,所以一些配置其实跟httpclient是强相关的。
基本配置
rest-template可以不带参数,使用默认配置,也可以指定ClientHttpRequestFactory参数,ClientHttpRequestFactory是一个interface,其具体实现有:
- HttpComponentsClientHttpRequestFactory,包含一个apache的HttpClient实例
- OkHttp3ClientHttpRequestFactory,包含一个OkHttpClient的实例
以HttpComponentsClientHttpRequestFactory为例,它接受一个apache的HttpClient实例,我们可以定制其配置,样例代码如下:
return HttpClients.custom()
.setMaxConnTotal(10000) // 连接池的最大连接数
.evictIdleConnections(10, TimeUnit.MINUTES) // 连接池内的连接空闲超出该时间即销毁
.setMaxConnPerRoute(2000) //单域名允许的最大连接数
.setDefaultRequestConfig(buildRequestConfig()) // 连接配置见下
.setRetryHandler(new DefaultHttpRequestRetryHandler(2, true)) //失败后重试次数;重试时是否需要重新发送请求
.build();
RequestConfig属于基本的连接配置,如下:
return RequestConfig.custom()
.setConnectTimeout(5) // TCP连接超时
.setConnectionRequestTimeout(60) //从连接池获取连接的超时
.setSocketTimeout(60) // 请求等待超时
.build();
顺带说一下一个TCP连接耗费的内存数(参考这里),使用
sysctl -A | grep net | grep mem
命令可以查看一个TCP连接的读写缓存默认大小,在我的ubuntu上大约200~300K,注意只是默认大小,随着连接数增大,读写缓存大小是会降低的。像上面的例子,若10000个连接都是忙碌的,内存应该会达到G级别(实际则不会,总有部分连接是空闲的)。