当前位置: 首页 > news >正文

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配置类

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 {@Beanpublic 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);}}

调用

	@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

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自定义连接池

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();  }  
}
http://www.lryc.cn/news/149954.html

相关文章:

  • 第49节:cesium 倾斜模型osgb转3dtiles,并加载(含源码+视频)
  • 零信任安全模型详解:探讨零信任安全策略的原理、实施方法和最佳实践,确保在网络中实现最小特权原则
  • 01_nodejs简介
  • 企业架构LNMP学习笔记4
  • 探索UniApp分包
  • uniapp 支持图片放大
  • Oracle数据泵备份恢复(导出导入)详细语句
  • 【JS案例】JS实现积分抽奖(内附源码)
  • angular抛出 ExpressionChangedAfterItHasBeenCheckedError错误分析
  • 动态链接库的__declspec(dllexport)关键字的概念
  • 群晖NAS:DS Video、Jellyfin等视频电影电视剧海报、背景墙搜刮器
  • WEBGL(3):鼠标动态绘制点
  • Sass基础
  • Java中的消息队列有哪些?
  • 多维时序 | Matlab实现GRU-Adaboost和GRU多变量时间序列预测对比
  • 测试用例编写规范参考
  • unity3d:功能验证,收集开源项目的工程合集
  • plotly_beforehover 用法:
  • 利用 AI 赋能云安全,亚马逊云科技的安全技术创新服务不断赋能开发者
  • 18. 填坑Ⅰ
  • CSS 实现平面圆点绕椭圆动画
  • docker login : x509: certificate signed by unknown authority
  • 金蝶云星空二开,插件查看工具
  • error: ‘std::_hypot‘ has not been declared using std::hypot;
  • 介绍 Apache Spark 的基本概念和在大数据分析中的应用。
  • Java设计模式:四、行为型模式-09:模板模式
  • 【前端】Vue2 脚手架模块化开发 -快速入门
  • 【广州华锐互动】AR昆虫认知学习系统实现对昆虫形态的捕捉和还原
  • nginx压缩ttf文件 mine.types的作用
  • 【云原生】Kubernetes容器编排工具