RestTemplate配置httpcliet

yaml配置类

# http线程池
http-pool:
  # 一个服务每次能并行接收的请求数量
  maxPerRoute: 200
  # 服务一次最多接收的请求数量
  maxTotal: 1000
  # 从连接池获取连接
  connectionRequestTimeout: 10000
  # 连接超时
  connectTimeout: 5000
  # 数据读取超时时间
  socketTimeout: 10000
  # 最大存活时间(单位:分钟)
  maxIdleTime: 5
@Configuration
public class ClientHttpPoolConfiguration {
    @Autowired
    private HttpConnectionPoolConfiguration poolConfiguration;

    @Bean
    public PoolingHttpClientConnectionManager poolingHttpClientConnectionManager() {
        PoolingHttpClientConnectionManager result = new PoolingHttpClientConnectionManager();
        result.setDefaultMaxPerRoute(poolConfiguration.getMaxPerRoute());
        result.setMaxTotal(poolConfiguration.getMaxTotal());

        return result;
    }

    @Bean
    public RequestConfig requestConfig() {
        return RequestConfig.custom()
                .setConnectionRequestTimeout(poolConfiguration.getConnectionRequestTimeout())
                .setConnectTimeout(poolConfiguration.getConnectTimeout())
                .setSocketTimeout(poolConfiguration.getSocketTimeout())
                .build();
    }

    @Bean
    public CloseableHttpClient httpClient(PoolingHttpClientConnectionManager poolingHttpClientConnectionManager, RequestConfig requestConfig) {
        return HttpClientBuilder
                .create()
                .setConnectionManager(poolingHttpClientConnectionManager)
                // 配置RestTemplate以允许重定向
                .setRedirectStrategy(new LaxRedirectStrategy())
                .setDefaultRequestConfig(requestConfig)
                .evictExpiredConnections().evictIdleConnections(poolConfiguration.getMaxIdleTime(), TimeUnit.MINUTES)
                // KeepAlive策略 连接超过20s没有数据就主动断开与服务器的连接
                .setKeepAliveStrategy((response, context) -> Arrays.stream(response.getHeaders(HTTP.CONN_KEEP_ALIVE))
                        .filter(h -> StringUtils.equalsIgnoreCase(h.getName(), "timeout")
                                && StringUtils.isNumeric(h.getValue()))
                        .findFirst()
                        .map(h -> NumberUtils.toLong(h.getValue(), 20))
                        .orElse(20L) * 1000)
                .build();
    }
}
@Component
@ConfigurationProperties(prefix = "http-pool")
@Data
public class HttpConnectionPoolConfiguration {
    /**
     * 一个服务每次能并行接收的请求数量
     */
    private Integer maxPerRoute;
    /**
     * 服务一次最多接收的请求数量
     */
    private Integer maxTotal;
    /**
     * 从连接池获取连接
     */
    private Integer connectionRequestTimeout;
    /**
     * 连接超时
     */
    private Integer connectTimeout;
    /**
     * 数据读取超时时间
     */
    private Integer socketTimeout;
    /**
     * 最大存活时间
     */
    private Integer maxIdleTime;

}
@Configuration
@Slf4j
public class RestTemplateConfiguration {

    @Bean
    public RestTemplate restTemplate(HttpClient httpClient) {
        HttpComponentsClientHttpRequestFactory httpRequestFactory = new
                HttpComponentsClientHttpRequestFactory();
        httpRequestFactory.setHttpClient(httpClient);
        RestTemplate restTemplate = new RestTemplate(httpRequestFactory);
        // 支持中文编码
        restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));
        restTemplate.setErrorHandler(new MyResponseErrorHandler());

        return restTemplate;
    }

}
@Slf4j
public class MyResponseErrorHandler extends DefaultResponseErrorHandler {

    @Override
    public void handleError(URI url, HttpMethod method, ClientHttpResponse response) throws IOException {
        response.close();
        log.error("RestTemplate错误:url:{}, method:{},statusCode:{}", url.getPath(), method.name(), response.getStatusCode());
        this.handleError(response);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值