RestTemplate调用REST接口遇Connection Reset,调长KeepAlive解决求原理
问题原因解析
核心本质:连接池复用了已被Azure基础设施关闭的空闲连接
你的问题根源在于客户端连接池的长连接存活时长与Azure网络组件的空闲连接超时不匹配,具体拆解如下:
- 云环境的连接回收机制:Azure的负载均衡器、应用网关或防火墙会主动回收长时间空闲的TCP连接(这类组件的默认空闲超时通常远大于10秒,比如230秒左右)。如果你的
KEEP_ALIVE_DURATION之前设置得比这个值长,连接池里的空闲连接会被Azure先关闭,但客户端还认为这些连接是可用的。 - 连接复用触发SSL握手异常:当RestTemplate从连接池取出已被Azure关闭的连接,尝试复用它发起请求时,会在SSL握手阶段(恢复旧SSL会话或重新握手)收到远端的RST重置包,直接抛出
java.net.SocketException: Connection Reset。 - 调短存活时长的作用:把
KEEP_ALIVE_DURATION设为10秒后,客户端会在Azure触发空闲超时前,主动关闭并丢弃池内的空闲连接。后续请求会重新建立新的TCP连接,自然不会遇到已被远端回收的无效连接,异常也就消失了。
额外补充:为何异常出现在SSL握手阶段
当复用已建立的SSL连接时,客户端会优先尝试恢复之前的SSL会话以提升性能。如果此时连接已经被远端关闭,这个会话恢复的过程(属于SSL握手的一部分)会直接触发连接重置,而非普通请求发送阶段的异常。
内容的提问来源于stack exchange,提问作者Marko Gila
相关产品推荐
相关产品推荐

