RestTemplate是Spring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率。
ClientHttpRequestFactory
RestTemplate可以通过使用ClientHttpRequestFactory指定不同的HTTP请求方式。
ClientHttpRequestFactory接口主要提供了两种实现方式:
-
SimpleClientHttpRequestFactory,使用J2SE提供的方式(既java.net包提供的方式)创建底层的Http请求连接。
-
HttpComponentsClientHttpRequestFactory方式,底层使用HttpClient访问远程的Http服务,使用HttpClient可以配置连接池和证书等信息。
HttpComponentsClientHttpRequestFactory方式
HttpClient配置连接池
@Component("httpClientFactory")public class HttpClientFactoryBean extends DefaultConnectionKeepAliveStrategy implements FactoryBean, Runnable, InitializingBean, DisposableBean{/** * 保持最多的连接数 */private static final int CONNECTION_MAX_TOTAL = 50;/** * domain最多连接数 */private static final int CONNECTION_MAX_ROUTE = 10;/** * 空闲时间 */private static final int IDLE_TIMEOUT = 30 * 1000;private ScheduledExecutorService service;private PoolingHttpClientConnectionManager connectionManager;private HttpClient httpClient;@Overridepublic HttpClient getObject(){ HttpClientBuilder builder = HttpClients.custom(); builder.setKeepAliveStrategy(this); builder.setConnectionManager(connectionManager); httpClient = builder.build(); return httpClient;}@Overridepublic void afterPropertiesSet(){ service = new ScheduledThreadPoolExecutor(1, new ThreadFactoryBuilder().setNameFormat("httpclient-%d").build()); service.scheduleWithFixedDelay(this, 60, 60, TimeUnit.SECONDS); connectionManager = new PoolingHttpClientConnectionManager(); connectionManager.setDefaultSocketConfig(SocketConfig.custom().setSoTimeout(10 * 1000).build()); connectionManager.setDefaultConnectionConfig(ConnectionConfig.custom().setBufferSize(8 * 1024) .setFragmentSizeHint(8 * 1024).build()); connectionManager.setMaxTotal(CONNECTION_MAX_TOTAL); connectionManager.setDefaultMaxPerRoute(CONNECTION_MAX_ROUTE);}@Overridepublic void destroy() { service.shutdownNow(); connectionManager.close();}@Overridepublic Class getObjectType() { return HttpClient.class;}@Overridepublic boolean isSingleton() { return true;}@Overridepublic void run() { if (connectionManager == null) { return; } connectionManager.closeExpiredConnections(); connectionManager.closeIdleConnections(IDLE_TIMEOUT, TimeUnit.SECONDS);}复制代码
}
配置RestTemplate
@Componentpublic class RestRequest extends RestTemplate {@Autowired@Qualifier("httpClientFactory")private HttpClientFactoryBean httpClientFactory;@PostConstructpublic void init() throws Exception { HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(httpClientFactory.getObject()); setRequestFactory(factory); List> converters = new ArrayList >(); converters.add(new FastJsonHttpMessageConverter4()); setMessageConverters(converters); setErrorHandler(new ResponseErrorHandler());}复制代码
}