Springboot配置RestTemplate整合HttpClient

註冊RestTemplate Bean,HttpComponentsClientHttpRequestFactory 實現了 DisposableBean 接口這塊就註冊爲Bean交由Spring管理就行,HttpClient這裏的配置比較簡單,可以根據具體業務需求詳細化配置。

package com.weizhong.metrocard.config;

import org.apache.http.client.config.RequestConfig;
import org.apache.http.impl.client.HttpClients;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;

/**
 * RestTemplate 配置
 *
 * @author yh
 * @since 2020/12/8 下午 09:48
 */
@Configuration
public class RestTemplateConfiguration {

    /**
     * RestTemplate配置
     *
     * @return
     */
    @Bean
    public RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder) {
        return restTemplateBuilder
                // 請求工廠配置
                .requestFactory(this::clientHttpRequestFactory)
                // 攔截器
                .interceptors(new RestTemplateLogInterceptor())
                .build();
    }

    /**
     * 請求工廠配置
     *
     * @return
     */
    @Bean
    public HttpComponentsClientHttpRequestFactory clientHttpRequestFactory() {
        return new HttpComponentsClientHttpRequestFactory(HttpClients.custom()
                // 使用系統屬性
                .useSystemProperties()
                // 最大連接數
                .setMaxConnTotal(200)
                // 每個路由最大連接數
                .setMaxConnPerRoute(100)
                // 請求配置
                .setDefaultRequestConfig(requestConfig())
                .build());
    }

    /**
     * 請求配置
     *
     * @return
     */
    private RequestConfig requestConfig() {
        return RequestConfig.custom()
                // 從連接池獲取連接超時時間5秒
                .setConnectionRequestTimeout(5_000)
                // 建立請求連接超時時間10秒
                .setConnectTimeout(10_000)
                // 等待響應超時時間20秒
                .setSocketTimeout(20_000)
                .build();
    }

}

RestTemplate攔截器,可以做日誌處理等等

package com.weizhong.metrocard.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpRequest;
import org.springframework.http.client.ClientHttpRequestExecution;
import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.http.client.ClientHttpResponse;

import java.io.IOException;

/**
 * RestTemplate 攔截器
 *
 * @author yh
 * @since 2020/12/9 上午 11:51
 */
@Slf4j
public class RestTemplateLogInterceptor implements ClientHttpRequestInterceptor {

    @Override
    public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
        log.info("restTemplate request:{}\t{}", request.getMethodValue(), request.getURI());
        ClientHttpResponse response = execution.execute(request, body);
        log.info("restTemplate response:{}\t{}", response.getRawStatusCode(), response.getStatusText());
        return response;
    }

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章