gateway出现Connection prematurely closed BEFORE response异常

1,178 阅读1分钟

背景

在进行12小时稳定性测试时,文件上传接口会出现Connection prematurely closed BEFORE response异常。

原因

SCG的连接线程池没有进行回收,后端的连接已经超时,当请求到这种连接时,就会导致异常。

类似于使用jdbc请求数据库时,从线程池中拿到了过期的jdbc连接。

时序图如下

7908692-747f6e7c3976e39c.webp

解决方式


第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回收请求在后端服务回收请求之前,就可以避免掉这个问题。