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
相关产品推荐
相关产品推荐

