发布于2026-05-23 阅读(0)
扫一扫,手机访问

在基于 Spring Boot 构建的 HTTP/2 服务时,不少开发者都遇到过这样一个现象:连接在空闲了大约20秒后,就被服务端主动切断了。客户端通常会收到一个 GOAWAY 帧(错误码可能是 NO_ERROR 或 ENHANCE_YOUR_CM),然后连接就关闭了。这其实不是 Spring Boot 自己搞的什么特殊逻辑,而是它底层默认使用的嵌入式 Tomcat(版本 v10.1.7 及以上)对 HTTP/2 连接生命周期的一套默认管理策略。
问题的根源,就出在 Tomcat 的一个参数上:keepAliveTimeout。这个参数大家可能不陌生,它通常用来控制 HTTP/1.1 的 Keep-Alive 超时时间。但关键点在于,在 HTTP/2 模式下,它同样扮演着“连接总空闲计时器”的角色。也就是说,从连接建立开始算起,如果超过这个时间没有任何数据帧交互,Tomcat 就会认为这个连接该结束了,于是发送 GOAWAY 帧。而这个参数的默认值,正好就是 20 秒。所以,触发 GOAWAY 完全是预期之中的行为,并非系统故障。
要改变这个行为,方法很直接,就是在 Spring Boot 的配置文件里调整这个参数。打开你的 application.properties 文件,加入以下配置之一:
# 方案一:彻底禁用连接空闲超时(连接将永久保持,直到客户端主动关闭或网络异常) server.tomcat.keepAliveTimeout=-1 # 方案二:设置为一个更长的、合理的值(例如5分钟,单位是毫秒) # server.tomcat.keepAliveTimeout=300000
当然,调整配置的同时,有几个细节必须得留意:
keepAliveTimeout 配置的是 Tomcat 连接层的空闲超时,它不影响应用层处理单个请求的超时(那是 server.tomcat.connection-timeout 管的事),也和 SSL 会话超时没有关系。JettyServletWebServerFactory 去设置 HttpConfiguration.setIdleTimeout()。keepAliveTimeout 的行为也会跟着变。Spring Boot 默认 Tomcat 在 HTTP/2 连接建立 20 秒后主动发送 GOAWAY 帧,可通过 server.tomcat.keepAliveTimeout=-1 禁用该超时行为,实现长连接持久化。
说到底,服务端主动发送 GOAWAY 帧并不是什么坏事,它是 Tomcat 为了维护 HTTP/2 连接健康度的一种主动管理机制。通过合理配置 server.tomcat.keepAliveTimeout/actuator/metrics/http.server.requests 端点)和压力测试来验证效果,做到心中有数。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8