千家信息网

怎么使用HTTPclient保持长连接

发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,本篇内容介绍了"怎么使用HTTPclient保持长连接"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
千家信息网最后更新 2025年02月01日怎么使用HTTPclient保持长连接

本篇内容介绍了"怎么使用HTTPclient保持长连接"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

目录
  • HTTPclient保持长连接

    • 首先解释一下什么是长连接

    • 如何在java中实现一个长连接呢

  • httpclient因为保持永久长连接造成连接吊死的问题

    • 添加策略后,问题解决

HTTPclient保持长连接

首先解释一下什么是长连接

当我们向一台服务器发起请求时,我们需要和对方建立一条通道,去传输数据,所谓的短连接,就是说我们建立起了通道,然后在传输完数据,就把通道摧毁,下次需要的时候再重新去建立通道。

长连接呢,就是指,我们建立了一条通道,传递完数据后,先不摧毁,下次如果还需要传输数据,就复用这条通道。

因为通道的建立是需要花费时间的,所以长连接的优势就在于响应速度快,但是服务器压力大,因为同时有很多人在向服务器建立通道,即便有些通道已经传输完数据了,由于长连接的原因,通道也不会被摧毁;短连接呢,则是,响应速度慢,服务器压力小。

由于现在更多的是强调用户的体验,所以长连接目前是最常见的。

如何在java中实现一个长连接呢

其实很简单,只需要在请求的请求头中加入特定的参数 :"Connection":"keep-alive"即可。这样如果对方支持长连接的话,那么这个连接就会保持长连接了。

问题的关键就来了,在一次压测某个https请求响应速度的代码中,我发现了,当对方响应数据为null,也就是responseBody中带的数据为null时,响应速度特别快,大概在5ms左右,但是一旦对方返回了响应数据,本次响应就可能达到了20ms。

然后请运维同事抓包,发现每次连接,都会耗费时间在用户认证上,其实也就是从某个方面反应出,每次都是新建立了一个连接。

HttpPost httpPost = new HttpPost("xxxxx");httpPost.addHeader("Connection", "keep-alive");CloseableHttpClient httpClient = null;for(int i =0 ;i<5000;i++){    long t1 = System.currentTimeMillis();        CloseableHttpResponse response = httpClient.execute(httpPost);        long t2 = System.currentTimeMillis();}

上了一段简单的代码,表示一下大概的逻辑,实际的压测代码还包括了线程池,连接池的完整参数等等,如果需要的可以留言或者翻看本人的其他的博客,有写线程池和连接池。

就是这样一段代码,导致每次连接都是新建立的连接,那么原因是什么呢,我们先上代码:

for (int i = 0; i<5000;i++){     long t1 = System.currentTimeMillis();      CloseableHttpResponse response = httpClient.execute(httpPost);      if(null != response.getEntity()){           EntityUtils.consume(response.getEntity());      }      long t2 = System.currentTimeMillis(); }

我们只需要简单加上三行代码,就可以解决这个问题了,这是为什么呢,让我们点进去源码看一下

这么一看, 其实这个方法也并没有做什么,只是简单的取到了流去关闭,为什么就保持长连接了呢。

后来仔细读http连接的原理才得知,当一个连接建立,响应数据时,会封装CloseableHttpResponse这个对象里面,其中的Entity对象就是包含着响应体的数据,我们需要用流去获取。如果你不去获取,那么这个数据就会存在于这个对象中,连接池就会认为,这个通道里有未处理的数据,然后它不会去复用这个通道,而是选择重建一个通道。这就完美解释了为什么压测时,对方返回null时,响应速度特别快,而携带返回数据时,响应速度特别慢了。

那么再仔细想想,为什么我们平常不知道这个知识点,却从来没有报过错呢,那是因为正常情况下,我们都是需要会对response做处理,比如String responseContent = EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8); 类似这种,我们点进源码看,其实也是取到了流,并做了关闭操作。平常还是要多阅读源码,想想源码。

httpclient因为保持永久长连接造成连接吊死的问题

httpclient使用了连接池,如果没有设置keep-alive策略,PoolingHttpClientConnectionManager会默认使用永久连接。

最近在调用京东api时,发现一个请求开始是可以获取到数据的,但隔了两分钟后再请求就会出现read timeout异常。

对比请求成功和请求失败的日志后发现,请求成功的有以下日志"Connection: keep-alive","Connection can be kept alive indefinitely";但请求失败的却打印"Shutdown connection","Connection discarded"。

每次失败后再请求都会成功。因此推测中应该是对方服务器端禁止长连接,当连接到达一定时间会就会断开。

后来上网找到keep-alive策略的代码。

添加策略后,问题解决

ConnectionKeepAliveStrategy keepAliveStrategy = new ConnectionKeepAliveStrategy() {            @Override            public long getKeepAliveDuration(HttpResponse response, HttpContext context) {                HeaderElementIterator it = new BasicHeaderElementIterator(response.headerIterator(HTTP.CONN_KEEP_ALIVE));                while (it.hasNext()) {                    HeaderElement he = it.nextElement();                    String param = he.getName();                    String value = he.getValue();                    if (value != null && param.equalsIgnoreCase("timeout")) {                        try {                            return Long.parseLong(value) * 1000;                        }                        catch (NumberFormatException ignore) {                        }                    }                }                HttpHost target = (HttpHost) context.getAttribute(HttpClientContext.HTTP_TARGET_HOST);                if ("bizapi.jd.com ".equalsIgnoreCase(target.getHostName())) {                    return 60 * 1000;                }                else {                    return 300 * 1000;                }   CloseableHttpClient httpClient = httpClientBuilder.setConnectionManager(pollingConnectionManager)                .setKeepAliveStrategy(keepAliveStrategy).setDefaultRequestConfig(defaultRequestConfig).build();

"怎么使用HTTPclient保持长连接"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

数据 通道 代码 对方 速度 问题 服务器 服务 就是 源码 策略 传输 成功 对象 时间 更多 知识 永久 解释 平常 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 盈实互联网络科技被抓 数据库删除表中的属性 主服务器连接异常 软件开发有技校吗 网络安全走进乡村课堂 网络安全高校赛 多台服务器磁盘集群 学校一般使用什么数据库 上海有哪些网络技术有限公司 没有文凭可以学计算机软件开发吗 华为服务器后台管理ip 数据库系统怎么构建 株洲快速软件开发哪家好 计算机网络技术工作场景 vf数据库记录号函数 汽车车载网络技术的应用 宿城区门若霆网络技术工作室 刘威无线网络技术思考题 逍遥法外电影观后感网络安全 网状数据库用什么来描述关系 互联网科技有限公司招聘信息 猎鹿人下载软件开发 贵州软件开发怎么选 单位网络安全要考虑的问题 hive表如何清理数据库 移动数据库默认端口安全吗 中专网络技术专业开设课程 开票系统服务器设置辽宁省服务器 网络安全系统测试方案 网络安全软件有中文版
0