高性能RestTemplate配置

简述RestTemplate

  • Spring框架中的RestTemplate是访问Rest服务的客户端

  • 底层通过使用java.net包实现创建HTTP请求

  • 通过使用ClientHttpRequestFactory指定不同的HTTP请求方式,主要提供了两种实现方式

    • ​ SimpleClientHttpRequest(默认)

      • 底层使用J2SE通过的方法(java.net包提供的方法),创建底层的HTTP请求
      • 其实核心的createRequest方法,每次调用都会创建一个新的连接,造成极大的资源浪费,而且若连接未及时释放,会因为无法建立新的连接导致后面的请求阻塞
    • HttpComponentsClientHttpRequestFactory

      • 底层使用HttpClient访问远程的HTTP访问(HttpClient支持HTTP连接池,HttpClient有性能优化)

RestTemplateConfig配置类 (采用HttpComponentsClientHttpRequestFactory)

@Configuration
public class RestTemplateConfig {

    @Bean
    public RestTemplate restTemplate(ClientHttpRequestFactory httpRequestFactory){
        return new RestTemplate(httpRequestFactory);
    }
    
//	  默认的
//    @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<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
                .register("http", PlainConnectionSocketFactory.getSocketFactory())
                .register("https", SSLConnectionSocketFactory.getSocketFactory())
                .build();

        PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(registry);


        //设置连接池最大是500个连接
        connectionManager.setMaxTotal(500);
        //每个主机请求一个域名的最大并发为300
        //每个主机请求多个域名的并发和最大为500
        connectionManager.setDefaultMaxPerRoute(300);


        RequestConfig requestConfig = RequestConfig.custom()
                //返回数据的超时时间
                .setSocketTimeout(20000)
                //连接上服务器的超时时间
                .setConnectTimeout(10000)
                //从连接池中获取连接的超时时间
                .setConnectionRequestTimeout(1000)
                .build();


        return HttpClientBuilder.create().setDefaultRequestConfig(requestConfig)
                .setConnectionManager(connectionManager)
                .build();
    }

}

posted @ 2023-07-16 20:22  xietingweia  阅读(438)  评论(0编辑  收藏  举报