概要介绍
某制造业客户采用汉得工业物联网平台管理工厂设备,通过集星獭中间件实现API统一透传。
集星獭内部API默认使用feign调用,feign默认使用HttpClient进行API透传,HttpClient原生实现存在连接池设计约束: ◆ 非共享连接池机制导致频繁创建/销毁连接; ◆ 线程竞争引发连接池异常关闭(典型报错表现为"Connection pool shut down"); ◆ 传统共享连接池方案需侵入式修改源码,维护成本高。
一、连接池异常分析
◆ 业务流程-IoT设备处理流程
如下是一个IoT设备数据处理业务流程,IoT系统负责数据采集,MES系统负责设备监控,集星獭负责数据传输,采用动态feign进行API透传。
◆ 故障现象-连接池异常关闭复现
通过Apifox调用集星獭发布的透传API,调试调用和并发调用API时都正常;
但是自行开发HTTP调用程序,获取spring注册的client进行HTTP请求调用,调用完成关闭client时(关闭资源),此时再进行集星獭透传API调用会发生连接池异常。
下面模拟异常现象:
-
如下为IoT业务服务,通过SDK调用集星獭发布的API:
-
如下为模拟自行开发的HTTP请求调用程序,调用完成关闭连接资源:
当自行开发的HTTP调用程序关闭client资源时,再进行SDK方式调用集星獭API时,连接池发生异常关闭报错。
报错异常链路显示:采用HttpClient执行http请求,而从连接池获取client连接时,因连接池关闭导致调用失败。
◆ 根因定位-非共享连接池原理分析
依赖说明: org.springframework.cloud.openfeign版本为3.0.6,平台没有对feign注入进行调整。
通过debug找到client创建方式如下(HttpClientFeignConfiguration),没有指定使用共享连接池(默认方式)。
而没有指定使用共享连接池时,具体逻辑为:关闭连接时,连接池也会关闭,后续再次调用API就会报错。
◆ 传统方案-共享连接池改造
可以通过修改Client创建方式,使用共享连接池解决这一问题:
重启服务后,先调用自行开发的HTTP请求,再调用集星獭发布的API,不会发送报错,通过共享连接池可以解决上述问题。
当然,我们还可以在IoT业务服务中,全局搜索client资源关闭的地方,全部取消关闭,这些方案都需要调整源码,侵入性较强,加上这个问题发生在客户的生产环境,需要尽快的解决问题,调整源码需要发版验证,耗时较长,因此集星獭选择切换client实现方式,无侵入、高效快速地解决这一问题。
解决方案-切换OkHttp
◆ 核心优势
无感切换三大优势: 1. 零侵入: 代码无改造,业务代码保持原状,接口定义及调用方式无需任何修改。 2. 高性能: 原生支持连接复用,自动维护存活连接池;OkHttp采用多路复用技术,规避了HttpClient的线程竞争问题,提高并发能力。 3. 易维护: 全部参数通过Spring标准配置项管理。
◆ 实施步骤
切换OkHttp实现方式,仅需三步:
切换完成后,再次调用API,后台debug查看调用链路,转储的线程快照中,OkHttp生效,重复上述调用操作,不会发生异常。
该制造业客户采用切换OkHttp方案,解决连接池异常问题。
集星獭支持无感切换Client的实现方式,将HttpClient切换为性能更高的OkHttpClient,从而告别连接池异常问题,同时API调用方式不变,保证系统稳定运行。
总结
本方案通过"依赖替换+配置驱动"的创新思路,实现三大突破:
- 技术无痛升级:保持业务代码纯净性,规避改造风险。
- 性能跨越提升:利用OkHttp原生连接复用机制根治并发顽疾。
- 运维效能革命:将复杂连接池管理转化为标准化配置项。
汉得企业级系统集成平台(中文名集星獭,英文名JeeStar),是一站式多系统集成、多云集成、多端集成、多协议集成、多设备集成、数据集成、页面集成的全域集成解决方案。集成平台沉淀了汉得多年ToB项目实施的系统集成经验,在消除企业信息孤岛、数据孤立、打通多源多端的数据断链及混合云对接等场景中提供了高效便捷的功能及策略方案。
联系我们
-
如果您想了解集星獭更详细的功能介绍和产品信息,请查阅我们的产品文档。 移动端 👉:集星獭产品文档 PC端 👉:open.hand-china.com/document-ce…
-
如果您有疑问或者建议,可以通过开放平台进行工单反馈,问题分类请选择【产品/集星獭JeeStar】 👉 open.hand-china.com
-
相关产品咨询或更多信息了解,欢迎联系我们 邮箱:jeestar@sys.hand-china.com