All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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