|
6 | 6 | import org.apache.http.config.RegistryBuilder; |
7 | 7 | import org.apache.http.conn.socket.ConnectionSocketFactory; |
8 | 8 | import org.apache.http.conn.socket.PlainConnectionSocketFactory; |
| 9 | +import org.apache.http.conn.ssl.NoopHostnameVerifier; |
9 | 10 | import org.apache.http.conn.ssl.SSLConnectionSocketFactory; |
| 11 | +import org.apache.http.conn.ssl.TrustStrategy; |
| 12 | +import org.apache.http.impl.client.DefaultHttpRequestRetryHandler; |
10 | 13 | import org.apache.http.impl.client.HttpClientBuilder; |
11 | 14 | import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; |
| 15 | +import org.apache.http.ssl.SSLContextBuilder; |
| 16 | +import org.slf4j.Logger; |
| 17 | +import org.slf4j.LoggerFactory; |
12 | 18 | import org.springframework.boot.web.client.RestTemplateBuilder; |
13 | 19 | import org.springframework.context.annotation.Bean; |
14 | 20 | import org.springframework.context.annotation.Configuration; |
15 | 21 | import org.springframework.http.client.ClientHttpRequestFactory; |
16 | 22 | import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; |
| 23 | +import org.springframework.web.client.DefaultResponseErrorHandler; |
17 | 24 | import org.springframework.web.client.RestTemplate; |
18 | 25 |
|
| 26 | +import javax.net.ssl.HostnameVerifier; |
| 27 | +import javax.net.ssl.SSLContext; |
| 28 | +import java.security.KeyManagementException; |
| 29 | +import java.security.KeyStoreException; |
| 30 | +import java.security.NoSuchAlgorithmException; |
| 31 | +import java.security.cert.CertificateException; |
| 32 | +import java.security.cert.X509Certificate; |
| 33 | + |
19 | 34 | /** |
20 | 35 | * RestTemplate客户端连接池配置 |
21 | 36 | * |
|
26 | 41 | @Configuration |
27 | 42 | public class RestClientConfig { |
28 | 43 | @Bean |
29 | | - public ClientHttpRequestFactory httpRequestFactory() { |
30 | | - return new HttpComponentsClientHttpRequestFactory(httpClient()); |
31 | | - } |
32 | | - |
33 | | - @Bean |
34 | | - public RestTemplate restTemplate(RestTemplateBuilder builder) { |
35 | | - return new RestTemplate(httpRequestFactory()); |
| 44 | + public RestTemplate restTemplate() { |
| 45 | + RestTemplate restTemplate = new RestTemplate(); |
| 46 | + restTemplate.setRequestFactory(clientHttpRequestFactory()); |
| 47 | + restTemplate.setErrorHandler(new DefaultResponseErrorHandler()); |
| 48 | + return restTemplate; |
36 | 49 | } |
37 | 50 |
|
38 | 51 | @Bean |
39 | | - public HttpClient httpClient() { |
40 | | - Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create() |
41 | | - .register("http", PlainConnectionSocketFactory.getSocketFactory()) |
42 | | - .register("https", SSLConnectionSocketFactory.getSocketFactory()) |
43 | | - .build(); |
44 | | - PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(registry); |
45 | | - connectionManager.setMaxTotal(5); |
46 | | - connectionManager.setDefaultMaxPerRoute(5); |
47 | | - |
48 | | - RequestConfig requestConfig = RequestConfig.custom() |
49 | | - .setSocketTimeout(8000) |
50 | | - .setConnectTimeout(8000) |
51 | | - .setConnectionRequestTimeout(8000) |
52 | | - .build(); |
53 | | - |
54 | | - return HttpClientBuilder.create() |
55 | | - .setDefaultRequestConfig(requestConfig) |
56 | | - .setConnectionManager(connectionManager) |
57 | | - .build(); |
| 52 | + public HttpComponentsClientHttpRequestFactory clientHttpRequestFactory() { |
| 53 | + try { |
| 54 | + HttpClientBuilder httpClientBuilder = HttpClientBuilder.create(); |
| 55 | + SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() { |
| 56 | + public boolean isTrusted(X509Certificate[] arg0, String arg1) throws CertificateException { |
| 57 | + return true; |
| 58 | + } |
| 59 | + }).build(); |
| 60 | + httpClientBuilder.setSSLContext(sslContext); |
| 61 | + HostnameVerifier hostnameVerifier = NoopHostnameVerifier.INSTANCE; |
| 62 | + SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(sslContext, hostnameVerifier); |
| 63 | + Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create() |
| 64 | + .register("http", PlainConnectionSocketFactory.getSocketFactory()) |
| 65 | + .register("https", sslConnectionSocketFactory).build();// 注册http和https请求 |
| 66 | + // 开始设置连接池 |
| 67 | + PoolingHttpClientConnectionManager poolingHttpClientConnectionManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry); |
| 68 | + poolingHttpClientConnectionManager.setMaxTotal(500); // 最大连接数500 |
| 69 | + poolingHttpClientConnectionManager.setDefaultMaxPerRoute(100); // 同路由并发数100 |
| 70 | + httpClientBuilder.setConnectionManager(poolingHttpClientConnectionManager); |
| 71 | + httpClientBuilder.setRetryHandler(new DefaultHttpRequestRetryHandler(3, true)); // 重试次数 |
| 72 | + HttpClient httpClient = httpClientBuilder.build(); |
| 73 | + HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory(httpClient); // httpClient连接配置 |
| 74 | + clientHttpRequestFactory.setConnectTimeout(20000); // 连接超时 |
| 75 | + clientHttpRequestFactory.setReadTimeout(30000); // 数据读取超时时间 |
| 76 | + clientHttpRequestFactory.setConnectionRequestTimeout(20000); // 连接不够用的等待时间 |
| 77 | + return clientHttpRequestFactory; |
| 78 | + } catch (KeyManagementException | NoSuchAlgorithmException | KeyStoreException e) { |
| 79 | + log.error("初始化HTTP连接池出错", e); |
| 80 | + } |
| 81 | + return null; |
58 | 82 | } |
59 | 83 | } |
0 commit comments