註冊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;
}
}