• restTemplate常见问题


    resttemplate是spring提供的用于访问rest服务的客户端,底层通过java.net包下单实现创建http请求,通过使用clientHttprequestfactory指定不同的http请求方式,主要提供两种实现:

            SimpleClientHttpRequestFactory(默认):

                    底层使用J2SE提供的方式,即java.net包提供的方式,创建底层的http请求;

                   主要方法是createRequest,每次都会创建一个新的连接,会引起极大的资源浪费,而且来接不能及时释放,会因为不能建立新的连接而导致后面的请求阻塞。

          HTTPComponentsClientHttpRequestFactory:

                底层使用httpclient访问远程的http服务。

    客户端每次请求都要建立新的连接,即三次握手,而这个过程是非常耗时的,因此需要配置http连接池来减少连接建立和释放的时间;spring的restTemplate是对httpclient进行封装的,而httpclient是支持池化机制的。

    加入以下配置文件

    1. @Configuration
    2. public class RestTemplateConfig {
    3. @Bean
    4. public RestTemplate restTemplate(ClientHttpRequestFactory requestFactory){
    5. return new RestTemplate(requestFactory);
    6. }
    7. // @Bean
    8. // public ClientHttpRequestFactory simpleClientHttpRequestFactory(){
    9. // SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
    10. // factory.setReadTimeout(10000);
    11. // factory.setConnectTimeout(10000);
    12. // return factory;
    13. // }
    14. @Bean
    15. public ClientHttpRequestFactory httpRequestFactory(){
    16. return new HttpComponentsClientHttpRequestFactory(httpClient());
    17. }
    18. @Bean
    19. public HttpClient httpClient(){
    20. Registry registry = RegistryBuilder.create()
    21. .register("http", PlainConnectionSocketFactory.getSocketFactory())
    22. .register("https", SSLConnectionSocketFactory.getSocketFactory())
    23. .build();
    24. PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(registry);
    25. //设置连接池最大是500个连接
    26. connectionManager.setMaxTotal(500);
    27. //MaxPerRoute是对maxtotal的细分,每个主机的并发最大是300,route是指域名
    28. connectionManager.setDefaultMaxPerRoute(300);
    29. /**
    30. * 只请求 class.net,最大并发300
    31. *
    32. * 请求 class.net,最大并发300
    33. * 请求 open1024.com,最大并发200
    34. * 两个一共不能超过500
    35. */
    36. RequestConfig requestConfig = RequestConfig.custom()
    37. //返回数据的超时时间
    38. .setSocketTimeout(20000)
    39. //连接上服务器的超时时间
    40. .setConnectTimeout(10000)
    41. //从连接池中获取连接的超时时间
    42. .setConnectionRequestTimeout(1000)
    43. .build();
    44. CloseableHttpClient closeableHttpClient = HttpClientBuilder.create().setDefaultRequestConfig(requestConfig)
    45. .setConnectionManager(connectionManager)
    46. .build();
    47. return closeableHttpClient;
    48. }
    49. }

  • 相关阅读:
    【力客热题HOT100】-【040】101 对称二叉树
    手把手教你搭建zookeeper和kafka集群(超级详细)
    MFC中窗口居中显示
    基于.NET6的简单三层管理系统
    深入剖析红黑树:优雅地平衡二叉搜索树
    Vue3 组合式 API:依赖注入(四)
    Docker
    ubuntu20.04 实测 机械式激光雷达与相机联合标定
    分布式事务解决方案
    Spring Boot 开启https访问(配置SSL证书)
  • 原文地址:https://blog.csdn.net/weixin_45063957/article/details/126808425