一、背景
今天業務方調用我們的網關服務報錯:
Connection prematurely closed BEFORE response
二、原因分析
三、解決方案
第一步:
增加 SCG 服務的JVM啟動參數,調整連接獲取策略。
將連接池獲取策略由默認的 FIFO(先進先出)變更為 LIFO(后進先出)。
基于 LRU(最近最少使用)算法思想,LIFO 策略可確保當前最活躍的"熱點連接"優先被復用,而長期未被使用的空閑連接將自然沉淀至隊列末端,便于后續回收機制處理。
-Dreactor.netty.pool.leasingStrategy=lifo
第二步:
修改 SCG服務的空閑連接回收閾值
設置空閑連接的存活時間(maxIdleTime)需滿足:
空閑時間閾值 < 后端服務連接超時時間(connectTimeout)。
使連接池的回收動作先于后端服務的強制斷連,防止獲取到即將被后端主動關閉的"僵尸連接",避免出現請求中途因連接被重置導致的異常
spring:cloud:gateway:httpclient:pool:maxIdleTime: 10000(根據需要調整)
設置之后觀察線上環境,沒有再發生報錯