RestTemplateConfig.java 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. package com.ydtech.config.resttemplate;
  2. import java.security.KeyManagementException;
  3. import java.security.NoSuchAlgorithmException;
  4. import java.util.concurrent.TimeUnit;
  5. import cn.hutool.core.net.SSLContextBuilder;
  6. import org.apache.http.client.HttpClient;
  7. import org.apache.http.client.config.RequestConfig;
  8. import org.apache.http.config.Registry;
  9. import org.apache.http.config.RegistryBuilder;
  10. import org.apache.http.conn.HttpClientConnectionManager;
  11. import org.apache.http.conn.socket.ConnectionSocketFactory;
  12. import org.apache.http.conn.socket.PlainConnectionSocketFactory;
  13. import org.apache.http.conn.ssl.NoopHostnameVerifier;
  14. import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
  15. import org.apache.http.impl.client.DefaultHttpRequestRetryHandler;
  16. import org.apache.http.impl.client.HttpClientBuilder;
  17. import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
  18. import org.springframework.context.annotation.Bean;
  19. import org.springframework.context.annotation.Configuration;
  20. import org.springframework.context.annotation.Primary;
  21. import org.springframework.http.client.ClientHttpRequestFactory;
  22. import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
  23. import org.springframework.web.client.RestTemplate;
  24. import java.util.Collections;
  25. @Configuration
  26. public class RestTemplateConfig {
  27. // 连接池最大连接数
  28. private static final int MAX_TOTAL = 6400;
  29. // 默认每条路线的最大值
  30. private static final int DEFAULT_MAX_PER_ROUTE = 3200;
  31. // 每个主机的并发
  32. private static final int VALIDATE_AFTER_INACTIVITY = 30000;
  33. private static final int IDLE_CONNECTIONS = 30;
  34. // 返回数据的超时时间
  35. private static final int SOCKET_TIMEOUT = 180 * 1000;
  36. // 连接上服务器的超时时间
  37. private static final int CONNECT_TIMEOUT = 3 * 1000;
  38. // 从连接池中获取连接的超时时间
  39. private static final int CONNECTION_REQUEST_TIMEOUT = 1000;
  40. @Bean("restTemplate")
  41. @Primary
  42. public RestTemplate restTemplate() throws NoSuchAlgorithmException, KeyManagementException {
  43. RestTemplate restTemplate = new RestTemplate(httpRequestFactory());
  44. restTemplate.setErrorHandler(new CustomResponseErrorHandler());
  45. restTemplate.setInterceptors(Collections.singletonList(new RestTemplateRequestInterceptor()));
  46. return restTemplate;
  47. }
  48. @Bean
  49. public ClientHttpRequestFactory httpRequestFactory() throws NoSuchAlgorithmException, KeyManagementException {
  50. return new HttpComponentsClientHttpRequestFactory(httpClient());
  51. }
  52. @Bean
  53. public HttpClient httpClient() throws NoSuchAlgorithmException, KeyManagementException {
  54. RequestConfig requestConfig = RequestConfig.custom()
  55. .setSocketTimeout(SOCKET_TIMEOUT) //返回数据的超时时间
  56. .setConnectTimeout(CONNECT_TIMEOUT) //连接上服务器的超时时间
  57. .setConnectionRequestTimeout(CONNECTION_REQUEST_TIMEOUT) //从连接池中获取连接的超时时间
  58. .build();
  59. return HttpClientBuilder.create()
  60. .setDefaultRequestConfig(requestConfig)
  61. .setConnectionManager(poolingConnectionManager())
  62. // 设置重试策略和重试次数
  63. .setServiceUnavailableRetryStrategy(new RestTemplateServiceUnavailableRetryStrategy())
  64. .setRetryHandler(new DefaultHttpRequestRetryHandler(3, true))
  65. .build();
  66. }
  67. /**
  68. * 绕过ssl对证书进行验证,无需将证书导出到jdk管理仓库
  69. */
  70. @Bean("restTemplateIgnoreSSL")
  71. public RestTemplate restTemplateIgnoreSSL() throws NoSuchAlgorithmException, KeyManagementException {
  72. IgnoreSSLRequestFactory requestFactory = new IgnoreSSLRequestFactory(httpClient());
  73. requestFactory.setConnectTimeout(60000); //连接上服务器(握手成功)的时间
  74. requestFactory.setReadTimeout(60000); //返回数据时间
  75. RestTemplate restTemplate = new RestTemplate(requestFactory);
  76. return restTemplate;
  77. }
  78. private HttpClientConnectionManager poolingConnectionManager() throws NoSuchAlgorithmException, KeyManagementException {
  79. SSLContextBuilder contextBuilder = new SSLContextBuilder();
  80. SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(contextBuilder.build(), NoopHostnameVerifier.INSTANCE);
  81. Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
  82. .register("http", new PlainConnectionSocketFactory())
  83. .register("https", socketFactory).build();
  84. // Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create().register("http",
  85. // PlainConnectionSocketFactory.getSocketFactory()).register("https", SSLConnectionSocketFactory.getSocketFactory()).build();
  86. PoolingHttpClientConnectionManager poolingConnectionManager = new PoolingHttpClientConnectionManager(registry);
  87. poolingConnectionManager.setMaxTotal(MAX_TOTAL);
  88. poolingConnectionManager.setDefaultMaxPerRoute(DEFAULT_MAX_PER_ROUTE);
  89. poolingConnectionManager.setValidateAfterInactivity(VALIDATE_AFTER_INACTIVITY);
  90. poolingConnectionManager.closeIdleConnections(IDLE_CONNECTIONS, TimeUnit.SECONDS);
  91. poolingConnectionManager.closeExpiredConnections();
  92. return poolingConnectionManager;
  93. }
  94. }