ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# HttpClient实战三:Spring整合HttpClient连接池 # 简介 在微服务架构或者REST API项目中,使用Spring管理Bean是很常见的,在项目中HttpClient使用的一种最常见方式就是:使用Spring容器XML配置方式代替Java编码方式进行HttpClient连接池的管理,然后将HttpClient的doGet()和doPost()等操作封装成工具类或者Service注入到其他服务中进行调用。 # Spring集成HttpClient过程 首先创建一个使用Spring的web项目,在Resources资源文件中添加springContext-httpclient.xml文件 ![](https://img.kancloud.cn/fe/51/fe5100f97c06efb32dc0061546921bca_712x504.png) springContext-httpclient.xml 然后,创建属性文件httpclient.properties ~~~bash httpclient.properties http.maxTotal=200 http.defaultMaxPerRoute=20 http.connectTimeout=1000 http.connectionRequestTimeout=500 http.socketTimeout=10000 http.staleConnectionCheckEnabled=true ~~~ 最后,在启动Spring容器时,加载属性文件和springContext-httpclient.xml配置文件即可。 ![](https://img.kancloud.cn/a0/7c/a07c1c85940cbe1f1bf5c163988e7281_621x294.png) # springContext-httpclient.xml配置文件解析 **1\. 创建连接池管理器对象**,并设置最大连接数和每个主机地址并发数,下图所示配置bean的id=httpClientConnectionManager,即对应使用Java代码创建的对象cm。 ![](https://img.kancloud.cn/ec/b3/ecb35ce58fc2d5b098b585ac3333f5c6_817x238.png) 创建连接池管理器bean **2.创建HttpClient对象并配置请求参数** HttpClient接口和CloseableHttpClient实现类层次结构 ![](https://img.kancloud.cn/48/18/4818cdccc62e63a1826777d926ce2e91_304x217.png) HttpClients源码中使用custom()方法构建HttpClientBuilder对象 ![](https://img.kancloud.cn/71/b5/71b5d08cdf7992f498d6155783034ac0_788x244.png) HttpClients源码 HttpClientBuilder实现在build()方法获取HttpClient对象,先从连接池中获取,如果连接池为空就进行一系列默认的配置并创建连接池对象;如果连接池不为空,就判断连接的可重用性,获取有效连接。HttpClientBuilder部分源码如下: ![](https://img.kancloud.cn/75/ed/75ed671e764baad1a3cb5c6744bc7e1c_537x608.png) HttpClientBuilder部分源码 **创建httpClientBuilder的过程如下:** ![](https://img.kancloud.cn/c9/82/c98228e5d5171cf4f8273aa1cae7d4f1_679x196.png) **请求参数RequestConfig的配置如下:** ![](https://img.kancloud.cn/96/01/96014d0b4607a9f59e388a17942fc3de_708x482.png) 请求参数RequestConfig **3.开启线程定时清理无效连接** ![](https://img.kancloud.cn/c1/2d/c12d37ee7b0d9778d0c5e058039e7840_771x340.png) # 总结 Spring整合HttpClient连接池的过程很简单,其实就是将《HttpClient实战二》中使用Java代码方式实现的HttpClient连接池方式,修改成Spring容器管理Bean的方式,这样就不必每次都创建一个信息连接池对象,而是从Spring容器中注入即可。