线上环境连第三方的HTTP服务时报连接被拒绝,单独通过curl命令发现也是返回连接被拒绝,把问题反馈给第三方后得到的答复是他们有设置最大连接数为300,要我方自查代码。

赶紧自查代码后发现确实代码有问题:

public static CloseableHttpClient newInstance(String ip_port, String userName, String password) {。。。。。此处省略无关代码CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(cm).setDefaultRequestConfig(defaultRequestConfig).setDefaultCredentialsProvider(provider).build();return httpClient;}}

上述代码在每次调用newInstance时都创建了一个 httpClient ,如果并发高的话会导致创建大量的连接请求,最终导致第三方拒绝请求,问题找到后,赶紧将httClient修改成了单例模式,一顿操作操作猛如虎,发布到SIT环境信心满满进行测试,结果连接数量似乎是控制住了,但是多刷几次页面后又报了Timeout waiting for connection from pool,看到这个错误后马上想到是池里的连接被占用没有释放出来,于是又自查代码如下:

try {。。。此处省略无关代码String responseXml = EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8);。。。此处省略无关代码} catch (Exception e) {throw e;}

使用了EntityUtils.toString对返回的body进行处理,追踪进入EntityUtils.toString的源码后,发现其有在finally中关闭流,到此似乎有点懵了,线索断了。只好再次深翻错误日志,发现在抛出Timeout waiting for connection from pool错误之前已经有抛出自定义的异常了,然后根据异常堆栈信息追查到代码处后豁然开朗:抛出异常后不会走上述代码的EntityUtils.toString自然也就没有释放连接了,最终修改如下:

try {。。。此处省略无关代码String responseXml = EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8);。。。此处省略无关代码} catch (Exception e) {throw e;}finally {EntityUtils.consumeQuietly(response.getEntity());}

再次测试OK。

总结一下:

在实际项目中如果没有考虑到对HttpClient或者CloseableHttpClient进行正确的释放连接操作,则会带来生产问题,后面的请求一直无法获取到连接资源,导致并发起不来。很多同学可能并没有遇到过这个问题是因为HttpClient或者CloseableHttpClient并不是单例的,而是每次使用时都创建新的实例,在正常情况下你可能正确地释放了连接,但一定要考虑到异常情况下的连接释放,正确的做法是确保释放连接的操作是在finally块中。

另外对于HttpClient或者CloseableHttpClient的创建还是不要太随意,尽量使用一个全局的(除非你有迫不得已的原因),同时设置好连接池等相关优化配置,这里着重解释下连接池配置的两个重要参数,MaxTotal表示池里最大的连接数量,DefaultMaxPerRoute按字面理解是每个路由的最大连接数(其实就是你对同一个目标服务器请求的最大连接数),此处千万不要被MaxTotal所迷惑,一定要结合DefaultMaxPerRoute参数来判断最大连数是多少。

另外CloseableHttpClient中的execute()有多个重载方法,而实际调用后能释放资源的execute必须是包含ResponseHandler<? extends T>这个属性的,否则和原有HttpClient方式是一样的。在使用EntityUtils.toString()方法时,虽然其底层调用会执行InputStream关闭流,但是这里也可能是坑之所在,当你请求第三方超时或其他异常时,会直接跳过,并没有执行上面的toString()方法,那么就不会释放连接资源。

针对CloseableHttpClient有下述两种释放连接的方案:

1、确保释放连接的操作是在finally块中。

2、使用包含ResponseHandler这个属性的execute方法

一次线上http连接被拒绝问题的排查相关推荐

  1. gta5线上显示无法连接服务器,gta5线上模式连接不上怎么回事_gta5线上模式进不去如何解决...

    最近有很多玩家都喜欢在电脑中玩这款gta5网络游戏, 但是在玩的时候经常会遇到一些问题,比如常见的gta5线上模式连接不上的现象,这是怎么回事呢,针对此问题,本文告诉大家gta5线上模式进不去解决方法 ...

  2. 原创|面试官:线上服务器CPU占用率高如何排查定位问题?

    国外开发者平台 HankerRank 发布的 2018 年开发者技能调查报告中有一项关于"雇主最看重哪些核心能力"的调查,结果显示如下: 排名前几的比较受重视的能力分别为:解决问题 ...

  3. 服务器定位cpu高占用率代码php,面试官:线上服务器CPU占用率高如何排查定位问题?,...

    面试官:线上服务器CPU占用率高如何排查定位问题?, 国外开发者平台 HankerRank 发布的 2018 年开发者技能调查报告中有一项关于"雇主最看重哪些核心能力"的调查,结果 ...

  4. 面试官:线上服务器CPU占用率高如何排查定位问题?

    开发十年,就只剩下这套架构体系了!! 国外开发者平台 HankerRank 发布的 2018 年开发者技能调查报告中有一项关于"雇主最看重哪些核心能力"的调查,结果显示如下:  ...

  5. 线上服务器CPU占用率高如何排查定位问题?

    (关联着看看这篇文章:https://blog.csdn.net/u011277123/article/details/103768939) 解决问题的能力以超高比例排名第一,这也是为什么很多面试过程 ...

  6. 线上服务Java进程假死快速排查、分析

    线上服务Java进程假死快速排查.分析 最近我们有一台服务器上的Java进程总是在运行个两三天后就无法响应请求了,具体现象如下: 请求业务返回状态码502,查看进程还在,意味着Java进程假死,无法响 ...

  7. mysql在线检测失败_一则线上MySql连接异常的排查过程

    Mysql作为一个常用数据库,在互联网系统应用很多.有些故障是其自身的bug,有些则不是,这里以前段时间遇到的问题举例. 问题## 当时遇到的症状是这样的,我们的应用在线上测试环境,JMeter测试过 ...

  8. 线上 mysql连接超时_线上环境数据库连接超时原因

    查看线上日志发现了如下的异常: ERROR 500.jsp - Error querying database.  Cause: com.mysql.jdbc.exceptions.jdbc4.Com ...

  9. 记一次线上应用连接池满的处理

    记一次线上应用dubbo-claim连接池满的处理 首先看到dubbo-claim应用突然大面积报错,基本反馈是冻结预算出问题了,看了看冻结预算的代码,发现写的非常复杂,果断放弃看代码来排查问题. C ...

最新文章

  1. fail-fast和fail-safe的介绍和区别
  2. 手动编写第一个javaWEB文件
  3. Rman duplicate数据库复制(单系统)
  4. Zuul1.0和2.0我们该如何选择?
  5. 最美四门轿跑车斯柯达Coupe面世,CC也害怕。
  6. RabbitMQ消息
  7. mysql与jmeter环境变量配置_Java开发技术大杂烩(一)之Redis、Jmeter、MySQL的那些事...
  8. 基于SpringMVC+EasyPoi,采用Excel模板方式实现Excel在线预览和导出(2021版)
  9. Adobe Reader 2019 Offline Installer, Free Download - Best PDF Reader
  10. learn from 德国老师
  11. android更新版本下载安装,Android版本更新下载apk自动安装的方法
  12. matlab中ix是什么意思,详解pandas中iloc, loc和ix的区别和联系
  13. 服务器的四个网卡虚拟一个网卡,一种物理网卡虚拟成多个虚拟网卡的方法及系统...
  14. SQL VIEW(视图)介绍
  15. 非常适合新手的一个Python爬虫项目: 打造一个英文词汇量测试脚本!
  16. 人人都是产品经理读书笔记
  17. Code bloat has become astronomical
  18. rust实现wss访问_改进 JavaScript 和 Rust 的互操作性并深入认识 wasm-bindgen 组件
  19. 前端 vue 制作一个日历(一)
  20. 【Proxyee-down】一款比IDM还强大的下载器!

热门文章

  1. 消费升级背景下零食行业发展报告_一份来自商务部的零食报告,2020年零食行业总产值规模将达3万亿!...
  2. Oracle CEO在耶鲁大学的演讲:退学吧!- - -
  3. c语言中文网中的字符s,strerror_s
  4. 华住旗下施柏阁将与保时捷设计打造联名奢华酒店;希尔顿酒店及度假村首次亮相长沙 | 全球旅报...
  5. 大佬的QT武林秘籍(整理)
  6. HTTPS网站发起HTTP请求
  7. 保本≠不亏钱!巴菲特教你如何平衡投资收益与风险
  8. nginx+rtmp实现视频直播
  9. JAVA日期转换工具类
  10. 神目推出3D结构光人脸识别模组