Spring BootのRest Template接続池の配置


記事の目次
  • Rest Template接続池構成
  • プロファイルクラス
  • 接続池の配置類
  • SSL
  • を無視する.
  • 配置類
  • Rest Template構成
  • Resct Template接続池の配置
    Restt TemplateはSpringが提供するResetサービスにアクセスするためのクライアントであり、Rest TemplateはリモートHttpサービスに便利にアクセスするための様々な方法を提供し、クライアントの作成効率を大幅に向上させることができる.
    Restit Templateのデフォルトの接続池はSimpleClientHttpRequestFactoryです.
    カスタム接続池は以下の通りです.
    ファイルクラスの設定
        /**
         * RestTemplate     Httpclient       
         *
         * @author fengxuechao
         * @version 0.1
         * @date 2019/11/12
         */
        @ConfigurationProperties(prefix = "http-pool")
        @Data
        public class HttpPoolProperties {
        
            /**
             *      
             */
            private Integer maxTotal = 20;
        
            /**
             *      
             */
            private Integer defaultMaxPerRoute = 10;
        
            /**
             *       (    )   
             */
            private Integer connectTimeout = 1000;
        
            /**
             *               
             */
            private Integer connectionRequestTimeout = 3000;
        
            /**
             *        (response)   
             */
            private Integer socketTimeout = 5000;
        
            /**
             *            
             */
            private Integer validateAfterInactivity = 7000;
        
            /**
             *        
             */
            private Boolean async = false;
        
        }
    
    接続池の配置クラス
    SSLを無視する
        /**
         * @author fengxuechao
         * @version 0.1
         * @date 2019/12/17
         */
        @Slf4j
        @Component
        public class HttpClientHelper {
        
            public SSLContext getSslContext() {
                //    SSL          ,    SSL
                X509TrustManager trustManager = new X509TrustManager() {
                    @Override
                    public X509Certificate[] getAcceptedIssuers() {
                        return null;
                    }
        
                    @Override
                    public void checkClientTrusted(X509Certificate[] xcs, String str) {
                    }
        
                    @Override
                    public void checkServerTrusted(X509Certificate[] xcs, String str) {
                    }
                };
                SSLContext ctx = null;
                try {
                    ctx = SSLContext.getInstance(SSLConnectionSocketFactory.TLS);
                    ctx.init(null, new TrustManager[]{trustManager}, null);
                } catch (NoSuchAlgorithmException | KeyManagementException e) {
                    log.error("   SSL   ", e);
                }
                assert ctx != null;
                return ctx;
            }
        
        }
    
    クラスの設定
        /**
         * HttpClient    
         *
         * @author fengxuechao
         * @version 0.1
         * @date 2019/11/12
         */
        @Slf4j
        @Configuration
        @ConditionalOnClass({HttpClient.class})
        @EnableConfigurationProperties(HttpPoolProperties.class)
        public class HttpClientConfig {
        
            @Autowired
            private HttpPoolProperties httpPoolProperties;
        
            @Autowired
            private HttpClientHelper helper;
        
            @Bean("httpRequestFactory")
            @ConditionalOnMissingBean
            public ClientHttpRequestFactory httpRequestFactory() {
                return new HttpComponentsClientHttpRequestFactory(httpClient());
            }
        
            @Bean("httpClient")
            @ConditionalOnMissingBean
            public HttpClient httpClient() {
                //    SSL          ,    SSL
                X509TrustManager trustManager = new X509TrustManager() {
                    @Override public X509Certificate[] getAcceptedIssuers() {
                        return null;
                    }
                    @Override public void checkClientTrusted(X509Certificate[] xcs, String str) {}
                    @Override public void checkServerTrusted(X509Certificate[] xcs, String str) {}
                };
                SSLConnectionSocketFactory socketFactory = null;
                try {
                    SSLContext ctx = helper.getSslContext();
                    ctx.init(null, new TrustManager[] { trustManager }, null);
                    socketFactory = new SSLConnectionSocketFactory(ctx, NoopHostnameVerifier.INSTANCE);
                } catch (KeyManagementException e) {
                    log.error("   SSL   ", e);
                }
        
                assert socketFactory != null;
                Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
                        .register("http", PlainConnectionSocketFactory.getSocketFactory())
                        .register("https", socketFactory)
                        .build();
                PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(registry);
                connectionManager.setMaxTotal(httpPoolProperties.getMaxTotal());
                connectionManager.setDefaultMaxPerRoute(httpPoolProperties.getDefaultMaxPerRoute());
                connectionManager.setValidateAfterInactivity(httpPoolProperties.getValidateAfterInactivity());
                RequestConfig requestConfig = RequestConfig.custom()
                        //       (response)   ,    read timeout
                        .setSocketTimeout(httpPoolProperties.getSocketTimeout())
                        //      (    )   ,    connect timeout
                        .setConnectTimeout(httpPoolProperties.getConnectTimeout())
                        //              ,          ,   org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool
                        .setConnectionRequestTimeout(httpPoolProperties.getConnectionRequestTimeout())
                        .build();
                return HttpClientBuilder.create()
                        .setDefaultRequestConfig(requestConfig)
                        .setConnectionManager(connectionManager)
                        .build();
            }
        }
    
    Restit Templateの設定
        /**
         * @author fengxuechao
         * @version 0.1
         * @date 2019/11/12
         */
        @Configuration
        @Import({HttpClientConfig.class})
        public class RestTemplateConfiguration {
        
            /**
             *     RestTemplate
             *
             * @return
             */
            @Bean("restTemplate")
            @ConditionalOnMissingBean
            @ConditionalOnBean(value = ClientHttpRequestFactory.class)
            public RestTemplate restTemplate(ClientHttpRequestFactory httpRequestFactory) {
                RestTemplate restTemplate = new RestTemplate(httpRequestFactory);
                restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));
                return restTemplate;
            }
        }