resttemplate是spring提供的用于访问rest服务的客户端,底层通过java.net包下单实现创建http请求,通过使用clientHttprequestfactory指定不同的http请求方式,主要提供两种实现:
SimpleClientHttpRequestFactory(默认):
底层使用J2SE提供的方式,即java.net包提供的方式,创建底层的http请求;
主要方法是createRequest,每次都会创建一个新的连接,会引起极大的资源浪费,而且来接不能及时释放,会因为不能建立新的连接而导致后面的请求阻塞。
HTTPComponentsClientHttpRequestFactory:
底层使用httpclient访问远程的http服务。
客户端每次请求都要建立新的连接,即三次握手,而这个过程是非常耗时的,因此需要配置http连接池来减少连接建立和释放的时间;spring的restTemplate是对httpclient进行封装的,而httpclient是支持池化机制的。
加入以下配置文件
- @Configuration
- public class RestTemplateConfig {
-
- @Bean
- public RestTemplate restTemplate(ClientHttpRequestFactory requestFactory){
- return new RestTemplate(requestFactory);
- }
-
-
- // @Bean
- // public ClientHttpRequestFactory simpleClientHttpRequestFactory(){
- // SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
- // factory.setReadTimeout(10000);
- // factory.setConnectTimeout(10000);
- // return factory;
- // }
-
- @Bean
- public ClientHttpRequestFactory httpRequestFactory(){
- return new HttpComponentsClientHttpRequestFactory(httpClient());
- }
-
- @Bean
- public HttpClient httpClient(){
-
-
- Registry
registry = RegistryBuilder.create() - .register("http", PlainConnectionSocketFactory.getSocketFactory())
- .register("https", SSLConnectionSocketFactory.getSocketFactory())
- .build();
-
- PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(registry);
-
-
- //设置连接池最大是500个连接
- connectionManager.setMaxTotal(500);
- //MaxPerRoute是对maxtotal的细分,每个主机的并发最大是300,route是指域名
- connectionManager.setDefaultMaxPerRoute(300);
- /**
- * 只请求 class.net,最大并发300
- *
- * 请求 class.net,最大并发300
- * 请求 open1024.com,最大并发200
- * 两个一共不能超过500
- */
-
- RequestConfig requestConfig = RequestConfig.custom()
- //返回数据的超时时间
- .setSocketTimeout(20000)
- //连接上服务器的超时时间
- .setConnectTimeout(10000)
- //从连接池中获取连接的超时时间
- .setConnectionRequestTimeout(1000)
- .build();
-
-
- CloseableHttpClient closeableHttpClient = HttpClientBuilder.create().setDefaultRequestConfig(requestConfig)
- .setConnectionManager(connectionManager)
- .build();
-
- return closeableHttpClient;
- }
- }