原文链接:https://www.cnblogs.com/x-x-736880382/p/11591906.html

以前我们项目都是基于Apache HttpClient 连接池进行web 接口调用,后来用spring-boot, 发现 RestTemplate 挺好用。

简单介绍下:

什么是RestTemplate?

RestTemplate是Spring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率。
调用RestTemplate的默认构造函数,RestTemplate对象在底层通过使用java.net包下的实现创建HTTP 请求,可以通过使用ClientHttpRequestFactory指定不同的HTTP请求方式。
ClientHttpRequestFactory接口主要提供了两种实现方式

一种是SimpleClientHttpRequestFactory,使用J2SE提供的方式(既java.net包提供的方式)创建底层的Http请求连接。
第二种方式是使用HttpComponentsClientHttpRequestFactory方式,底层使用HttpClient访问远程的Http服务,使用HttpClient可以配置连接池和证书等信息。
RestTemplate默认是使用SimpleClientHttpRequestFactory,内部是调用jdk的HttpConnection,默认超时为-1

下面我介绍下spring-boot 如何配置RestTemplate连接池(github):

 
import org.apache.http.client.HttpClient;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.config.Registry;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.conn.socket.ConnectionSocketFactory;
import org.apache.http.conn.socket.PlainConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
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() {
return new RestTemplate(httpRequestFactory());
} @Bean
public ClientHttpRequestFactory httpRequestFactory() { return new HttpComponentsClientHttpRequestFactory(httpClient()); } @Bean
public HttpClient httpClient() {
Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
.register("http", PlainConnectionSocketFactory.getSocketFactory())
.register("https", SSLConnectionSocketFactory.getSocketFactory())
.build();
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(registry);
//设置整个连接池最大连接数 根据自己的场景决定
connectionManager.setMaxTotal(200);
//路由是对maxTotal的细分
connectionManager.setDefaultMaxPerRoute(100);
RequestConfig requestConfig = RequestConfig.custom()
.setSocketTimeout(10000) //服务器返回数据(response)的时间,超过该时间抛出read timeout
.setConnectTimeout(5000)//连接上服务器(握手成功)的时间,超出该时间抛出connect timeout
.setConnectionRequestTimeout(1000)//从连接池中获取连接的超时时间,超过该时间未拿到可用连接,会抛出org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool
.build();
return HttpClientBuilder.create()
.setDefaultRequestConfig(requestConfig)
.setConnectionManager(connectionManager)
.build();
}
}

最新文章

  1. linux下添加mysql用户并授权
  2. Jquery ajax提交表单几种方法
  3. Unity3D 文字滚动跑马灯效果
  4. (转)innerHTML、innerText和outerHTML、outerText的区别
  5. Java读取图片并修改像素,创建图片
  6. On Memory Leaks in Java and in Android.
  7. C++工厂方法模式
  8. 求解释一个蛋疼的bug
  9. 自己封装的一个js方法用于获取显示的星期和日期时间
  10. Caused by: java.lang.ClassNotFoundException: flex.messaging.io.BeanProxy
  11. 升级 mysql5.6 配置文件my.cnf sql_mode 解析与设置问题
  12. C# Task.Run 和 Task.Factory.StartNew 区别
  13. mac下编译node源码
  14. SQL Server -- 回忆笔记(一):初见数据库
  15. test6
  16. php中DateTime、diff
  17. Demo005 小学四则运算自动生成程序
  18. 让人一看就懂的excel相对引用和绝对引用案例解析
  19. bzoj 2752
  20. git一些命令

热门文章

  1. Git上手教程
  2. 2.2 在resources目录下,新建applicationContext.xml
  3. 只会Jquery,后端程序员如何学会前端(webpack,react,babel,es5,es6)
  4. PHP中的超级变量
  5. quasar+vue、Input组件绑定两个值
  6. linux启用ipv4转发功能
  7. C++ 手动创建二叉树,并实现前序、中序、后序、层次遍历
  8. shell脚本自动过滤尝试多次连接ip并添加到系统黑名单
  9. 在端点0由GET_REPORT类请求上传报表
  10. rabbitMq客户端连接超时