Connection prematurely closed BEFORE response异常解决办法

本文介绍了解决Reactor-Netty中出现的“连接过早关闭”异常的方法。通过调整JVM参数及Spring Cloud Gateway配置来减少此异常发生的概率,并提供了进一步排查建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

官网参考https://github.com/reactor/reactor-netty/issues,有些异常可以在这个网站中搜索

该异常翻译后是说:reactor.net .http.client. prematurecloseexception:在响应之前连接过早关闭,

是由于Reactor-Netty导致的bug.

解决方案:

第1步、加入JVM参数:
-Dreactor.netty.pool.leasingStrategy=lifo

第2步、SCG新增配置:
spring:
  cloud:
    gateway:
      httpclient:
        pool:
          maxIdleTime: 10000(根据需要调整)

第1步将获取连接策略由默认的FIFO变更为LIFO,因为LIFO能够确保获取的连接最大概率是最近刚被用过的,也就是热点连接始终是热点连接,而始终用不到的连接就可以被回收掉,LRU的思想。

第2步是设置空闲请求在空闲多久后会被回收,这样也就可以避免拿到旧连接刚好在请求途中被强行close了,这个时间的设置只要确保比你后端服务的connectTimeout小就行了,这样能够确保SCG回收请求在后端服务回收请求之前,就可以避免掉这个问题。

这样设置后还会偶发这个异常,请排查你的所有后端服务是否connectTimeout都比maxIdleTime大,或者尝试调整maxIdleTime。另外,本身这是个概率性偶发问题,如果你的架构是题主举的这个例子类似,题主这样设置后,几乎看不到这个异常出现了,彻底根除这个顽疾,请看懂时序图再提问题。另外,如果你的架构不太一样,你需要找到你的请求为什么在请求途中被突然关闭的原因,这可能不是Reactor-Netty的问题,而是你的服务的问题。

Reactor-Netty是在v0.9.5.RELEASE版本开始提供设置。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值