导致关闭连接设置使用了连接池(连接网关大姚设置空闲)「关闭的连接」

bug描述2023-11-16 12:52:29 钉钉群里抛出Connection prematurely closed BEFORE response的问题原因分析从skywalking查看本次调用,发现请求到达网关后就直接抛出异常,并没有实际转发给下游业务服务;从报错内容看,并不是业务代码的问题,那么就是框架本身的问题,或者框架配置的问题,按照这个思路先去看看github上的springcloud的issue,果然有相关的问题。
然后就看到这个实际上并不是gateway本身的问题,而是Reactor-Netty的问题。
跟随gateway官方文档的说明发现问题的根源是:

导致关闭连接设置使用了连接池(连接网关大姚设置空闲)

gateway底层的netty连接池中默认连接是没有存活时间限制的,而下游的业务服务使用的tomcat连接池是有空闲存活时间的,超出空闲时间就会关闭连接。
出现上面问题是请求来的时候刚好网关使用了与下游服务对应的连接,而这个连接刚好在这时候因为超出空闲时间主动关闭了解决方案按照上面的原因分析,既然是因为网关使用了下游已关闭的连接,那么只需要网关使用存活的连接进行请求就可以解决问题了。
那么基于这种思路只需要做两点设置网关层的最大空闲时间小于下游业务服务的最大空闲时间,已知tomcat默认的最大空闲时间是20s,那么网关把这个值设置的比20s小就可以,具体数值需要根据实际情况下,这里我设置为15s。
设置网关获取连接的策略为LIFO,因为这种策略可以保证获取的连接最大程度上是最近刚被使用过的,也就是热点连接始终是热点连接,而始终用不到的连接就会被回收,借鉴LRU的思想。

联系我们

在线咨询:点击这里给我发消息