Spring AI 1.1.2 BUG排行榜:RST_STREAM错误修复
Spring AI 异常排查:RST_STREAM 内部错误根源解析
使用 Spring AI 的开发者或许会遇到一个令人困惑的运行时异常:应用在正常运行一段时间后,毫无预警地抛出 RST_STREAM: Internal error。从表面看,这个错误极易被误判为服务端故障,导致排查方向偏差。
该错误并非启动即现,而是通常出现在持续运行或并发请求增加之后。通过抓包分析,发现 TCP 连接挥手过程中,服务端主动向客户端发送了 RST 标志。服务端工程师坚称自身逻辑无误,一度使问题陷入死胡同。
问题解决路径
既然疑点指向客户端,需从底层源码开始排查。阅读 Spring AI 源码可知,其默认底层通信依赖 WebClient 客户端。
而 WebClient 在默认配置下会启用连接池。连接池本意是提升性能,但恰恰在此埋下了隐患。
临时规避方案
禁用连接池
@Bean
public WebClient.Builder webClientBuilder() {
ConnectionProvider noPoolProvider = ConnectionProvider.newConnection();
HttpClient httpClient = HttpClient.create(noPoolProvider)
.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 9000)
.doOnConnected(conn ->
conn.addHandlerLast(new ReadTimeoutHandler(9000))
);
return WebClient.builder().clientConnector(new ReactorClientHttpConnector(httpClient));
}
此修改快速解决了问题,但仅能作为临时应急手段。核心疑问依然存在:为何连接池会触发异常,而禁用后则正常?
深度根因分析
经过反复验证,最终定位到一个隐藏在 Netty 代码库中的严重缺陷。
最终修复策略:
问题的根本原因是 Netty 的一个已知漏洞(CVE-2025-55163),受影响的版本范围如下:
io.netty:netty-codec-http2版本 <= 4.1.123.Finalio.netty:netty-codec-http2版本 >= 4.2.0.Alpha1, <= 4.2.3.Final
解决方案十分直接:升级 Spring AI 项目所依赖的 Netty 版本,避开上述缺陷版本。推荐升级至 4.1.131.Final。
io.netty
netty-all
4.1.131.Final
在 Spring Boot 环境下,需特别注意依赖声明的顺序。Netty BOM 必须置于 Spring Boot BOM 之前,否则会被后者覆盖,导致升级失效。
org.springframework.cloud
spring-cloud-dependencies
${spring-cloud.version}
pom
import
io.netty
netty-bom
${netty.version}
pom
import
org.springframework.boot
spring-boot-dependencies
${spring-boot.version}
pom
import
org.springframework.ai
spring-ai-bom
${spring-ai.version}
pom
import
这个隐藏的坑位虽然不易察觉,但只要理清依赖优先级与 Netty 版本锁定,问题便能彻底化解。
