You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot RestTemplate出现Connection Reset异常排查求助

问题描述

使用Spring Boot RestTemplate调用REST API时,生产环境偶发以下异常:

org.springframework.web.client.ResourceAccessException: I/O error on POST request for "https://<host>/v2/graphql": Connection reset; nested exception is java.net.SocketException: Connection reset
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:785)
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:711)
    at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:602)

已知信息:

  • 请求已到达网关并转发至服务器,服务器已成功处理请求,但连接在5秒内被重置
  • RestTemplate的HTTP配置:
connectionRequestTimeoutMs: 3000
connectTimeoutMs: 3000
readTimeoutMs: 3000
maxConnectionsTotal: 100
maxConnectionsPerRoute: 100
  • 总计2300次请求中仅8次出现该错误,需排查问题原因。

可能的原因及排查方向

1. 客户端读取超时与服务器响应时机不匹配

你的readTimeoutMs设置为3000ms(3秒),但部分请求存在服务器处理完成后,响应传输到客户端的时间加上处理时间刚好超过这个阈值的情况。此时客户端会主动关闭连接,服务器后续尝试写入响应时就会触发Connection reset。

2. 远端服务/网关主动回收空闲连接

如果后端服务器或网关配置了空闲连接超时策略,当连接池中的连接被标记为可用但实际已被远端回收时,客户端复用该连接发送请求就会触发连接重置。这类问题通常是偶发的,只有当无效连接被选中复用时才会出现。

3. 中间网络设备中断连接

防火墙、负载均衡器等中间网络设备可能存在自身的超时规则,若请求处理过程中某个阶段连接长时间未传输数据,这些设备会主动切断连接。即使服务器已处理完成,也可能因网络层的断开导致客户端收到连接重置异常。

4. 连接池管理异常

虽然当前连接池的总连接数和单路由连接数设置为100,但如果存在连接泄漏(请求完成后未正确释放连接),可能导致连接池中存在无效连接。当客户端复用这些无效连接时,就会触发连接重置错误。


排查与解决建议
  • 调整读取超时配置:将readTimeoutMs适当调大(例如设置为6000ms),覆盖服务器处理加响应传输的最长耗时,验证是否还会出现该错误。
  • 检查远端服务的连接超时策略:确认后端服务器、网关的空闲连接超时时间,配置客户端连接池的空闲连接回收时间短于远端超时时间,避免复用已被关闭的连接。
  • 启用连接有效性校验:若使用Apache HttpClient作为RestTemplate的底层客户端,配置validateAfterInactivity参数,在复用连接前检查连接状态,过滤无效连接。
  • 排查网络设备日志:查看防火墙、负载均衡器的日志,确认是否存在主动切断连接的记录,调整其超时策略以匹配业务请求耗时。
  • 添加重试机制:针对偶发的连接重置异常,使用Spring Retry为RestTemplate配置重试策略,自动重试这类异常,降低业务影响。

内容的提问来源于stack exchange,提问作者Shivshankar Nagarsoge

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 13:42:22