2026/10/10 5:10:44

RestTemplate配置httpcliet

RestTemplate配置httpcliet yaml配置类# http线程池 http-pool:# 对同一个目标域名/IP:端口最多建立多少个连接 maxPerRoute:200# 当前应用调用所有下游服务时连接池最多保留多少个连接 maxTotal:1000# 从连接池租借连接的最长等待时间单位毫秒 connectionRequestTimeout:10000#TCP建连超时单位毫秒 connectTimeout:5000# 建连后等待下游响应数据的超时时间单位毫秒 socketTimeout:10000# 空闲连接回收时间单位分钟 maxIdleTime:5ConfigurationpublicclassClientHttpPoolConfiguration{privatestaticfinallongDEFAULT_KEEP_ALIVE_MILLIS20_000L;AutowiredprivateHttpConnectionPoolConfigurationpoolConfiguration;BeanpublicPoolingHttpClientConnectionManagerpoolingHttpClientConnectionManager(){PoolingHttpClientConnectionManagerresultnewPoolingHttpClientConnectionManager();result.setDefaultMaxPerRoute(poolConfiguration.getMaxPerRoute());result.setMaxTotal(poolConfiguration.getMaxTotal());returnresult;}BeanpublicRequestConfigrequestConfig(){returnRequestConfig.custom().setConnectionRequestTimeout(poolConfiguration.getConnectionRequestTimeout()).setConnectTimeout(poolConfiguration.getConnectTimeout()).setSocketTimeout(poolConfiguration.getSocketTimeout()).build();}BeanpublicCloseableHttpClienthttpClient(PoolingHttpClientConnectionManagerconnectionManager,RequestConfigrequestConfig){returnHttpClientBuilder.create().setConnectionManager(connectionManager).setDefaultRequestConfig(requestConfig).setKeepAliveStrategy((response,context)-{HeaderElementIteratoriteratornewBasicHeaderElementIterator(response.headerIterator(HTTP.CONN_KEEP_ALIVE));while(iterator.hasNext()){HeaderElementelementiterator.nextElement();Stringnameelement.getName();Stringvalueelement.getValue();if(timeout.equalsIgnoreCase(name)StringUtils.isNumeric(value)){returnLong.parseLong(value)*1000L;}}returnDEFAULT_KEEP_ALIVE_MILLIS;}).evictExpiredConnections().evictIdleConnections(poolConfiguration.getMaxIdleTime(),TimeUnit.MINUTES).build();}BeanpublicPoolingHttpClientConnectionManagerpoolingHttpClientConnectionManager(){PoolingHttpClientConnectionManagermanagernewPoolingHttpClientConnectionManager();manager.setDefaultMaxPerRoute(poolConfiguration.getMaxPerRoute());manager.setMaxTotal(poolConfiguration.getMaxTotal());// 连接空闲超过 2 秒再借出前进行有效性校验manager.setValidateAfterInactivity(2_000);returnmanager;}}ComponentConfigurationProperties(prefixhttp-pool)DatapublicclassHttpConnectionPoolConfiguration{/** * 对同一个目标域名/IP:端口最多建立多少个连接 */privateIntegermaxPerRoute;/** * 当前应用调用所有下游服务时连接池最多保留多少个连接 */privateIntegermaxTotal;/** * 从连接池租借连接的最长等待时间单位毫秒 */privateIntegerconnectionRequestTimeout;/** * TCP 建连超时单位毫秒 */privateIntegerconnectTimeout;/** * 建连后等待下游响应数据的超时时间单位毫秒 */privateIntegersocketTimeout;/** * 空闲连接回收时间单位分钟 */privateIntegermaxIdleTime;/** * 连接空闲超过 2 秒再借出前进行有效性校验 */privateIntegervalidateAfterInactivity;}ConfigurationSlf4jpublicclassRestTemplateConfiguration{BeanpublicRestTemplaterestTemplate(HttpClienthttpClient){HttpComponentsClientHttpRequestFactoryfactorynewHttpComponentsClientHttpRequestFactory(httpClient);RestTemplaterestTemplatenewRestTemplate(factory);restTemplate.getMessageConverters().removeIf(converter-converterinstanceofStringHttpMessageConverter);restTemplate.getMessageConverters().add(0,newStringHttpMessageConverter(StandardCharsets.UTF_8));restTemplate.setErrorHandler(newMyResponseErrorHandler());returnrestTemplate;}}Slf4jpublicclassMyResponseErrorHandlerextendsDefaultResponseErrorHandler{OverridepublicvoidhandleError(URIurl,HttpMethodmethod,ClientHttpResponseresponse)throwsIOException{log.error(RestTemplate调用失败, url{}, method{}, statusCode{},url,method.name(),response.getStatusCode().value());super.handleError(url,method,response);}}