Spring WebClient响应期间连接提前关闭错误的原因排查问询
问题结论
该报错不是客户端自身逻辑问题,也不是你配置了心跳的WebFlux服务端主动断开连接导致的,问题出在链路中间的AWS ELB负载均衡节点主动断开了闲置连接。
原因排查
你配置的WebFlux服务端20秒心跳仅能保证WebFlux服务端 -> Spring Cloud Gateway段的连接不会因闲置被断开,但覆盖不到整条链路:
- AWS ELB的默认闲置超时阈值为60秒,而Spring Cloud Gateway、消费端WebClient的默认连接池均会长期持有存活连接,不会主动淘汰闲置连接
- 当连接闲置时长超过ELB的超时阈值后,ELB会直接向两端发送RST包断开连接,但此时客户端连接池仍判定该连接为可用状态
- 闲置20~30分钟后首次发起请求时,客户端会复用连接池里已经被ELB断开的旧连接,直接触发
PrematureCloseException报错
修复方案
方案1:调整ELB超时配置
将AWS ELB的闲置超时时间设置为大于消费端WebClient、Spring Cloud Gateway连接池的最大闲置时间,从上层避免中间节点主动断连。
方案2:客户端配置连接闲置淘汰规则
在消费端WebClient层配置连接池最大闲置时间,小于ELB的闲置超时阈值,自动淘汰即将过期的连接,避免用到已经被ELB断开的无效连接,配置示例:
// 配置连接池最大闲置时间为45秒,小于ELB默认60秒的超时阈值 ConnectionProvider connectionProvider = ConnectionProvider.builder("custom-pool") .maxIdleTime(Duration.ofSeconds(45)) .build(); HttpClient httpClient = HttpClient.create(connectionProvider); WebClient webClient = WebClient.builder() .clientConnector(new ReactorClientHttpConnector(httpClient)) .build();
内容的提问来源于stack exchange,提问作者m2w
相关产品推荐
相关产品推荐

