package com.kidgrow.ribbon; import com.kidgrow.ribbon.config.RestTemplateProperties; import org.apache.http.client.HttpClient; import org.apache.http.client.config.RequestConfig; import org.apache.http.config.Registry; import org.apache.http.config.RegistryBuilder; import org.apache.http.conn.socket.ConnectionSocketFactory; import org.apache.http.conn.socket.PlainConnectionSocketFactory; import org.apache.http.conn.ssl.SSLConnectionSocketFactory; import org.apache.http.impl.client.DefaultHttpRequestRetryHandler; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.http.client.ClientHttpRequestFactory; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.web.client.RestTemplate; /** * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020
* * @Description: Ribbon 扩展类配置 * @Project:
* @CreateDate: Created in 2020/2/21 13:31
* @Author: liuke */ @EnableConfigurationProperties(RestTemplateProperties.class) public class RestTemplateAutoConfigure { @Autowired private RestTemplateProperties restTemplateProperties; @LoadBalanced @Bean public RestTemplate restTemplate() { RestTemplate restTemplate = new RestTemplate(); restTemplate.setRequestFactory(httpRequestFactory()); return restTemplate; } /** * httpclient 实现的ClientHttpRequestFactory */ @Bean public ClientHttpRequestFactory httpRequestFactory() { return new HttpComponentsClientHttpRequestFactory(httpClient()); } /** * 使用连接池的 httpclient */ @Bean public HttpClient httpClient() { Registry registry = RegistryBuilder.create() .register("http", PlainConnectionSocketFactory.getSocketFactory()) .register("https", SSLConnectionSocketFactory.getSocketFactory()) .build(); PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(registry); // 最大链接数 connectionManager.setMaxTotal(restTemplateProperties.getMaxTotal()); // 同路由并发数20 connectionManager.setDefaultMaxPerRoute(restTemplateProperties.getMaxPerRoute()); RequestConfig requestConfig = RequestConfig.custom() // 读超时 .setSocketTimeout(restTemplateProperties.getReadTimeout()) // 链接超时 .setConnectTimeout(restTemplateProperties.getConnectTimeout()) // 链接不够用的等待时间 .setConnectionRequestTimeout(restTemplateProperties.getReadTimeout()) .build(); return HttpClientBuilder.create() .setDefaultRequestConfig(requestConfig) .setConnectionManager(connectionManager) .setRetryHandler(new DefaultHttpRequestRetryHandler(3, true)) .build(); } }