商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > Spring Boot HTTP/2 服务器 GOAWAY 超时配置详解

Spring Boot HTTP/2 服务器 GOAWAY 超时配置详解

  发布于2026-05-23 阅读(0)

扫一扫,手机访问

Spring Boot HTTP/2 服务器 GOAWAY 超时配置详解

Spring Boot HTTP/2 服务器 GOAWAY 超时配置详解

在基于 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 完全是预期之中的行为,并非系统故障。

解决方案:调整 keepAliveTimeout

要改变这个行为,方法很直接,就是在 Spring Boot 的配置文件里调整这个参数。打开你的 application.properties 文件,加入以下配置之一:

# 方案一:彻底禁用连接空闲超时(连接将永久保持,直到客户端主动关闭或网络异常)
server.tomcat.keepAliveTimeout=-1

# 方案二:设置为一个更长的、合理的值(例如5分钟,单位是毫秒)
# server.tomcat.keepAliveTimeout=300000

当然,调整配置的同时,有几个细节必须得留意:

  • 关于“-1”:设置为 -1 意味着禁用超时机制,连接会一直挂着。这在生产环境需要格外小心,得评估好服务器资源(如最大连接数、内存、文件描述符)是否扛得住。
  • 分清层次:这个 keepAliveTimeout 配置的是 Tomcat 连接层的空闲超时,它不影响应用层处理单个请求的超时(那是 server.tomcat.connection-timeout 管的事),也和 SSL 会话超时没有关系。
  • 容器差异:如果你用的不是 Tomcat,而是 Jetty 或 Netty 等其他 Web 容器,那配置方式就完全不同了。比如在 Jetty 里,你需要通过 JettyServletWebServerFactory 去设置 HttpConfiguration.setIdleTimeout()
  • 协议前提:别忘了,要想让 HTTP/2 生效,TLS 配置必须正确无误(JDK 17+ 自带 ALPN 支持,且证书有效)。如果协议协商失败,连接会回退到 HTTP/1.1,那时 keepAliveTimeout 的行为也会跟着变。
Spring Boot 默认 Tomcat 在 HTTP/2 连接建立 20 秒后主动发送 GOAWAY 帧,可通过 server.tomcat.keepAliveTimeout=-1 禁用该超时行为,实现长连接持久化。

说到底,服务端主动发送 GOAWAY 帧并不是什么坏事,它是 Tomcat 为了维护 HTTP/2 连接健康度的一种主动管理机制。通过合理配置 server.tomcat.keepAliveTimeout/actuator/metrics/http.server.requests 端点)和压力测试来验证效果,做到心中有数。

本文转载于:https://www.php.cn/faq/2407394.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注