
com.cloud.lego.web.spring.boot.autoconfigure.RestTemplateConfiguration Maven / Gradle / Ivy
package com.cloud.lego.web.spring.boot.autoconfigure;
import com.cloud.lego.log.spring.boot.core.Log;
import org.apache.hc.client5.http.classic.HttpClient;
import org.apache.hc.client5.http.config.RequestConfig;
import org.apache.hc.client5.http.impl.DefaultHttpRequestRetryStrategy;
import org.apache.hc.client5.http.impl.classic.HttpClientBuilder;
import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager;
import org.apache.hc.client5.http.socket.ConnectionSocketFactory;
import org.apache.hc.client5.http.socket.LayeredConnectionSocketFactory;
import org.apache.hc.client5.http.socket.PlainConnectionSocketFactory;
import org.apache.hc.client5.http.ssl.NoopHostnameVerifier;
import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactory;
import org.apache.hc.core5.http.config.Registry;
import org.apache.hc.core5.http.config.RegistryBuilder;
import org.apache.hc.core5.ssl.SSLContexts;
import org.apache.hc.core5.ssl.TrustStrategy;
import org.apache.hc.core5.util.Timeout;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.http.converter.FormHttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.client.DefaultResponseErrorHandler;
import org.springframework.web.client.RestTemplate;
import javax.net.ssl.SSLContext;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.TimeUnit;
/**
* 构建默认的RestTemplate
*
* @author Andy
*/
@AutoConfiguration
public class RestTemplateConfiguration {
/**
* rest template请求
*
* @return RestTemplate
*/
@Bean
public RestTemplate restTemplate() {
// https支持
TrustStrategy acceptingTrustStrategy = (x509Certificates, authType) -> true;
SSLContext sslContext = null;
try {
sslContext = SSLContexts.custom().loadTrustMaterial(null, acceptingTrustStrategy).build();
} catch (Exception e) {
Log.error(" init rest template sslContext error", e);
}
LayeredConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(sslContext, new NoopHostnameVerifier());
Registry registry = RegistryBuilder.create()
.register("http", PlainConnectionSocketFactory.getSocketFactory())
.register("https", sslConnectionSocketFactory).build();
// http连接池管理
PoolingHttpClientConnectionManager poolingHttpClientConnectionManager = new PoolingHttpClientConnectionManager(registry);
// 设置整个连接池最大连接数 根据自己的场景决定
poolingHttpClientConnectionManager.setMaxTotal(2000);
// 路由是对maxTotal的细分
poolingHttpClientConnectionManager.setDefaultMaxPerRoute(100);
// httpClient config
RequestConfig requestConfig = RequestConfig.custom()
.setResponseTimeout(Timeout.of(30L, TimeUnit.SECONDS))
.setConnectionRequestTimeout(Timeout.of(10L, TimeUnit.SECONDS)) //从连接池中获取连接的超时时间,超过该时间未拿到可用连接,会抛出org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool
// .setSocketTimeout(30000) //服务器返回数据(response)的时间,超过该时间抛出read timeout
// .setConnectTimeout(30000)//连接上服务器(握手成功)的时间,超出该时间抛出connect timeout
// .setConnectionRequestTimeout(10000)
.build();
// 构建httpClient
HttpClient httpClient = HttpClientBuilder.create()
.setDefaultRequestConfig(requestConfig)
.setConnectionManager(poolingHttpClientConnectionManager)
.setRetryStrategy(new DefaultHttpRequestRetryStrategy())
.build();
// 构建http restTemplate
RestTemplate restTemplate = new RestTemplate();
restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory(httpClient));
restTemplate.setErrorHandler(new DefaultResponseErrorHandler());
// 中文乱码问题
restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));
restTemplate.getMessageConverters().add(new FormHttpMessageConverter());
return restTemplate;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy