SpringBoot之RestTemplate使用Apache的HttpClient连接池

SpringBoot自带的RestTemplate是没有使用连接池的,只是SimpleClientHttpRequestFactory实现了ClientHttpRequestFactory、AsyncClientHttpRequestFactory 2个工厂接口,因此每次调用接口都会创建连接和销毁连接,如果是高并发场景下会大大降低性能。因此,我们可以使用Apache的HttpClient连接池。

pom.xml

复制代码
		<!-- RestTemplate使用Apache的HttpComponentsClientHttpRequestFactory替换掉Spring SimpleClientHttpRequestFactory 以使用Apache HttpClient的连接池。 -->
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
        </dependency>

RestTemplate配置类

java 复制代码
import org.apache.http.client.HttpClient;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;

@Configuration
public class RestTemplateConfig {

    @Bean
    public RestTemplate restTemplate() {
        PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
        connectionManager.setMaxTotal(50);
        connectionManager.setDefaultMaxPerRoute(20);

        RequestConfig requestConfig = RequestConfig
                .custom()
                .setConnectionRequestTimeout(5000) // timeout to get connection from pool
                .setSocketTimeout(5000) // standard connection timeout
                .setConnectTimeout(5000) // standard connection timeout
                .build();

        HttpClient httpClient = HttpClientBuilder.create()
                .setConnectionManager(connectionManager)
                .setDefaultRequestConfig(requestConfig).build();

        ClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient);

        return new RestTemplate(requestFactory);
    }

}

调用

java 复制代码
	@Autowired  
	private RestTemplate restTemplate;  
  
	public Res getData(Dto dto) {
		String url = "https://xxx.com/api/xxx";
		//封装请求头参数.
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        headers.set("Content-Type", "application/json;charset=utf-8");
        headers.set("自定义请求头key","自定义请求头value");
		Res res = restTemplate.postForEntity(url, new HttpEntity<>(dto, headers), Res.class).getBody();
    	return res;
	}

注意

在Spring Boot中,RestTemplate已经过时,建议使用更现代的RestTemplateBuilder和WebClient。

使用RestTemplateBuilder

java 复制代码
import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.web.reactive.function.client.WebClient;  
  
@Service  
public class HttpClientService {  
  
    private final RestTemplateBuilder restTemplateBuilder;  
  
    @Autowired  
    public HttpClientService(RestTemplateBuilder restTemplateBuilder) {  
        this.restTemplateBuilder = restTemplateBuilder;  
    }  
  
    public String getData(String url) {  
        return restTemplateBuilder.build().getForObject(url, String.class);  
    }
}

使用WebClient自定义连接池

java 复制代码
import org.springframework.beans.factory.annotation.Value;  
import org.springframework.http.HttpMethod;  
import org.springframework.stereotype.Service;  
import org.springframework.web.reactive.function.client.WebClient;  
  
@Service  
public class CustomHttpClientService {  
  
    private final WebClient webClient;  
  
    @Autowired  
    public CustomHttpClientService(@Value("${custom.pool.size:10}") int poolSize) {  
        this.webClient = WebClient.builder()  
                .poolSize(poolSize) // 设置连接池大小等其它参数,这里不在一一赘述。
                .build();  
    }  
  
    public String getData(String url) {  
        return webClient.method(HttpMethod.GET).uri(url).retrieve().bodyToMono(String.class).block();  
    }  
}
相关推荐
树獭叔叔14 小时前
PyTorch学习阶段一:前向传播 - Tensor 的内存模型与高性能算子
后端·aigc·openai
CoderLiu14 小时前
Agent 沙箱架构深度解析:从 Pattern 选型到生产级框架设计
前端·人工智能·后端
神奇小汤圆15 小时前
Java内存模型(JMM)与 volatile 底层实现全解析
后端
宸津-代码粉碎机15 小时前
SpringBoot 任务执行链路追踪实战:TraceID 透传全解析,实现从调度到执行的全链路可观测
开发语言·人工智能·spring boot·后端·python
FelixBitSoul15 小时前
拒对着 Docker 进度条发呆:深度优化 AI 应用的构建与模型加载
后端
IT_陈寒15 小时前
SpringBoot项目启动速度提升300%?这5个隐藏配置太关键了!
前端·人工智能·后端
段小二15 小时前
为什么 Claude 不用 RAG?——理解 RAG 的真实边界,再用 Spring AI 落地三种架构(Java 架构师的 AI 工程笔记 06)
后端
Mr.456715 小时前
Spring Boot 3 + EasyExcel 3.x 实战:构建高效、可靠的Excel导入导出服务
spring boot·后端·excel
匆匆忙忙之间游刃有余15 小时前
Openclaw 为什么突然火了?我拆完它的架构后,发现它正在把 AI 助手变成“数字分身”
人工智能·后端