您当前的位置:首页 > 电脑百科 > 网络技术 > 网络技术

httpclient连接池管理,你用对了?

时间:2020-06-13 10:32:46  来源:  作者:
httpclient连接池管理,你用对了?

 

一、前言

为何要用http连接池那?因为使用它我们可以得到以下好处:

因为使用它可以有效降低延迟和系统开销。如果不采用连接池,每当我们发起http请求时,都需要重新发起Tcp三次握手建立链接,请求结束时还需要四次挥手释放链接。而链接的建立和释放是有时间和系统开销的。另外每次发起请求时,需要分配一个端口号,请求完毕后在进行回收。

使用链接池则可以复用已经建立好的链接,一定程度的避免了建立和释放链接的时间开销。

二、连接池使用

public static void init() {
    //1.创建连接池管理器
    PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(60000,//1.1
            TimeUnit.MILLISECONDS);
    connectionManager.setMaxTotal(1000);//1.2
    connectionManager.setDefaultMaxPerRoute(50);//1.3
    
    //2.创建httpclient对象
    httpClient = HttpClients.custom()
            .setConnectionManager(connectionManager)//2.1
            .disableAutomaticRetries()//2.2
            .build();
}

如上代码1,我们创建了一个连接池管理器,
ClientConnectionPoolManager会维护每个路由维护和最大连接数限制。默认情况下,此实现将为每个给定路由创建不超过2个并发连接,并且总共不超过20个连接。对于许多现实应用程序,这些限制可能证明过于严格。但是,我们可以自由来调整连接限制。

另外构造函数中可以设置持久链接的存活时间TTL(timeToLive),其定义了持久连接的最大使用时间,超过其TTL值的链接不会再被复用。

如上代码1.1我们设置TTL为60s(Tomcat服务器默认支持保持60s的链接,超过60s,会关闭客户端的链接)。代码1.2我们设置连接器最多同时支持1000个链接,代码1.3设置每个路由最多支持50个链接。注意这里路由是指IP+PORT或者指域名。如果使用域名来访问则每个域名有自己的链接池,如果使用IP+PORT访问,则每个IP+PORT有自己的链接池。

如上代码2我们基于连接池管理器创建了一个httpClient对象,下面我们就可以使用它发起http请求了。

CloseableHttpResponse response = null;
try {
    
    //3.创建请求对象
    final HttpGet httpGet = new HttpGet("http://127.0.0.1:8080/test");
    
    RequestConfig.Builder builder = RequestConfig.custom();
    builder.setSocketTimeout(3000)//3.1设置客户端等待服务端返回数据的超时时间
           .setConnectTimeout(1000)//3.2设置客户端发起TCP连接请求的超时时间
           .setConnectionRequestTimeout(3000);//3.3设置客户端从连接池获取链接的超时时间
    httpGet.setConfig(builder.build());

    //4.发起请求
    response = httpClient.execute(httpGet);

    //5.成功则解析结果
    if (200 == response.getStatusLine().getStatusCode()) {
        String strResult = EntityUtils.toString(response.getEntity());
        System.out.println(strResult);
    }

} catch (ClientProtocolException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
} finally {
    //5.回收链接到连接池
    if (null != response) {
        try {
            EntityUtils.consume(response.getEntity());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

如上代码3创建了一个HttpGet对象,并创建RequestConfig对象来设置请求参数。

代码3.3设置客户端从连接池获取链接的超时时间,如果在该时间内没能从连接池获取到连接,则抛出
ConnectionPoolTimeoutException异常。

代码3.2设置客户端发起TCP连接请求的超时时间,也就是创建TCP连接时候等待的时间,如果该时间内还没完成TCP三次握手,则抛出ConnectTimeoutException异常。

代码3.1设置客户端等待服务端返回数据的超时时间,也就是请求发出去后,如果等待该时间服务端还没返回结果,则抛出SocketTimeoutException异常。

代码4则发起http请求,代码5发现请求OK,则使用自带工具类EntityUtils.toString解析返回值(内部读取流结束后,会自动返还链接到连接池)

代码5则当请求结束后做一个兜底链接归还(如果返回状态值不是200,则需要在这里处理链接归还),注意这里不能调用response.close();因为其不是归还链接到连接池,而是关闭链接。

三、总结

本文简单介绍了如何使用链接池,使用连接池时需要注意合理设置最大链接数和每个路由(比如域名)对应的链接数,另外特别需要注意设置
setConnectionRequestTimeout参数,其决定了从连接池拿链接的超时时间。

另外需要注意使用链接池时,请求结果回来后,要记得归还链接,如果链接得不到归还,则首先会把连接池打满,然后新来的请求从连接池拿不到链接会抛出
ConnectionPoolTimeoutException异常。

另外归还链接不要调用response对象的close()方法,因为其是关闭链接,而不是把链接返回到链接池。需要调用EntityUtils中方法或者自己从response.getEntity().getContent()获取流,读取完毕(读取完毕后会自动归还链接)或者不读取时主动调用流的close()来显示归还链接到连接池。

知识扩展:自http1.1后,http默认支持keep-alive。对于Tomcat服务器默认保持客户端的链接60s,我们httpclient这边也可以设置链接存活时间,最终链接的存活时间是取两者中最小的。

对于过期链接的处理,当Tomcat主动关闭链接时,httpclient 4.4之前是每次在复用链接前进行检查链接是否可用,http4.4后,是自上次使用连接以来所经过的时间超过已设置的超时时(默认超时设置为2000ms),才检查连接。如果发现链接不可用,则从链接池剔除,在创建新的链接。

当客户端设置的TTL到期时(此时Tomcat容器没有主动关闭链接时),在每次发起请求时,会检查链接是否已经过期,如果过期(虽然链接本身是可以用的),则也主动关闭链接,然后从链接池剔除,在创建新的链接。

另外我们可以实现自己的
ConnectionKeepAliveStrategy来给不同的域名设置不同的链接存活策略。



Tags:httpclient   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
以京训钉开发平台接口文档为例,使用HttpClient类请求调用其接口,对数据进行增删改查等操作。 文档地址: https://www.yuque.com/bjjnts/jxd/bo1oszusing System;using System.C...【详细内容】
2021-12-28  Tags: httpclient  点击:(1)  评论:(0)  加入收藏
简介本文将展示如何使用“全部接受”SSL支持配置Apache HttpClient 4。目标很简单 - 使用没有有效证书的HTTPS URL。SSLPeerUnverifiedException如果不使用HttpClient配置SS...【详细内容】
2021-04-01  Tags: httpclient  点击:(202)  评论:(0)  加入收藏
HttpClient有三种超时时间设置,在RequestConfig配置类中定义的,分别为connectionRequestTimeout、connectTimeout和socketTimeout,如下图,然后分开讲解。RequestConfig三种超时...【详细内容】
2020-09-10  Tags: httpclient  点击:(1253)  评论:(0)  加入收藏
httpClient 请求接口失败要重试,一般人想到的可能是 做try catch 然后循环请求,但是这种方法写起来很麻烦,而且不优雅。今天就说下另外一种重试的方法,就是引入Microsoft.Extens...【详细内容】
2020-09-07  Tags: httpclient  点击:(332)  评论:(0)  加入收藏
自从HttpClient诞生依赖,它的使用方式一直备受争议,framework版本时代产生过相当多经典的错误使用案例,包括Tcp链接耗尽、DNS更改无感知等问题。有兴趣的同学自行查找研究。在....【详细内容】
2020-08-19  Tags: httpclient  点击:(119)  评论:(0)  加入收藏
【前言】你是否也曾羡慕过有些 phython 大神有着如下的神操作: 他们就轻轻的执行一串代码,就能循环的抓取很多自己想要的数据。其实不用太羡慕他们,因为不光 phython 能实现,我...【详细内容】
2020-08-13  Tags: httpclient  点击:(55)  评论:(0)  加入收藏
一、前言为何要用http连接池那?因为使用它我们可以得到以下好处:因为使用它可以有效降低延迟和系统开销。如果不采用连接池,每当我们发起http请求时,都需要重新发起Tcp三次握手...【详细内容】
2020-06-13  Tags: httpclient  点击:(83)  评论:(0)  加入收藏
▌简易百科推荐
写一个shell获取本机ip地址、网关地址以及dns信息。经常会遇到取本机ip、网关、dns地址,windows一个命令ipconfig /all全部获取到,但linux系统却并非如此。linux系统都自带ifc...【详细内容】
2021-12-27  K佬食古    Tags:shell   点击:(2)  评论:(0)  加入收藏
步骤1、配置 /etc/sysconfig/network-scripts/ifcfg-eth0 里的文件。it动力的CentOS下的ifcfg-eth0的配置详情:[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifc...【详细内容】
2021-12-24  忆梦如风    Tags:网卡   点击:(10)  评论:(0)  加入收藏
1、查找当前目录下所有以.tar结尾的文件然后移动到指定目录find . -name “*.tar” -execmv {}./backup/ ;注解:find –name 主要用于查找某个文件名字,-exec 、xargs可...【详细内容】
2021-12-17  郭主任    Tags:运维   点击:(20)  评论:(0)  加入收藏
对于经常上网的朋友来说,除了手机购物上网,pc端玩网页游戏还是很多小伙伴首选的,但是有时候明明宽带链接上了,打开浏览器却出现上不了网的现象,下面小编要来跟大家说说电脑有网络...【详细内容】
2021-12-16  小白系统    Tags:网页无法打开   点击:(28)  评论:(0)  加入收藏
在访问像github、gitlab这样的外国网站时,很有可能会出现页面加载不出来或找不到页面的错误。这时候有的朋友就会以为是网络的问题,于是把Wifi断掉连上自己手机的热点,结果却还...【详细内容】
2021-12-15  启施技术IT狼叔    Tags:外网   点击:(16)  评论:(0)  加入收藏
网络地址来源:获取公网IP地址 https://ipip.yy.com/get_ip_info.phphttp://pv.sohu.com/cityjson?ie=utf-8http://www.ip168.com/json.do?view=myipaddress...【详细内容】
2021-12-15  韦廷华12    Tags:外网ip   点击:(15)  评论:(0)  加入收藏
准备好软件IPOP、用ENSP模拟一下华为交换机 启动交换机 <Huawei>sysEnter system view, return user view with Ctrl+Z.[Huawei]sysname FTPClient[FTPClient]interface vla...【详细内容】
2021-12-15  思源Edward    Tags:交换机   点击:(24)  评论:(0)  加入收藏
我们经常用到netstat命令查看主机连接状况,包括连接ip、端口、状态等,今天就练习下shell分析netsat结果。描述假设netstat命令运行的结果我们存储在nowcoder.txt里,格式如下:Pro...【详细内容】
2021-12-14  K佬食古    Tags:netstat   点击:(19)  评论:(0)  加入收藏
什么是滑动窗口?窗口是操作系统开辟的一块缓存空间,发送方在收到接收方ACK应答之前,必须在缓冲区保留已发送的数据,如果按期收到确认应答,数据就可以从缓冲区移除。什么是滑动窗...【详细内容】
2021-12-14  DifferentJava    Tags:TCP   点击:(30)  评论:(0)  加入收藏
概述日常管理华为路由设备过程中,难为会忘记设备登录密码,那么该如何重置设备登录密码吗?本期文章将全面向各位小伙伴总结分享。重置华为设备登录密码思路先行 采用console登录...【详细内容】
2021-12-10  onme0    Tags:   点击:(27)  评论:(0)  加入收藏
相关文章
    无相关信息
最新更新
栏目热门
栏目头条