Spring Boot 默认 Tomcat 在 HTTP/2 连接建立 20 秒后主动发送 GOAWAY 帧,可通过 server.tomcat.keepAliveTimeout=-1 禁用该超时行为,实现长连接持久化。
spring boot 默认 tomcat 在 http/2 连接建立 20 秒后主动发送 goaway 帧,可通过 `server.tomcat.keepalivetimeout=-1` 禁用该超时行为,实现长连接持久化。
在基于 Spring Boot 构建的 HTTP/2 服务中,开发者常遇到连接在空闲约 20 秒后被服务端强制终止的现象——表现为客户端收到 GOAWAY 帧(错误码 NO_ERROR 或 ENHANCE_YOUR_CALM),连接关闭。该行为并非 Spring Boot 自定义逻辑,而是底层嵌入式 Tomcat(v10.1.7+)对 HTTP/2 连接生命周期的默认管控策略。
根本原因在于 Tomcat 的 keepAliveTimeout 参数:它不仅控制 HTTP/1.1 的 Keep-Alive 超时,在 HTTP/2 模式下也统一用于限制整个连接的空闲存活时间(即从连接建立到无任何帧交互的最大等待时长)。其默认值为 20 秒,因此触发 GOAWAY 是预期行为。
✅ 解决方案:调整 keepAliveTimeout
在 application.properties 中显式配置:
# 禁用连接空闲超时(永久保持) server.tomcat.keepAliveTimeout=-1 # 或设为更长的合理值(如 5 分钟) # server.tomcat.keepAliveTimeout=300000
⚠️ 注意事项:
- -1 表示禁用超时,连接将一直保持直至客户端主动断开或发生网络异常。生产环境需谨慎评估资源占用(如连接数、内存、文件描述符);
- 此配置仅影响 Tomcat 的连接层空闲超时,不影响应用层请求处理超时(如 server.tomcat.connection-timeout)或 SSL 会话超时;
- 若使用 Jetty 或 Netty 作为 Web 容器,配置方式完全不同(例如 Jetty 需通过 JettyServletWebServerFactory 设置 HttpConfiguration.setIdleTimeout());
- 启用 HTTP/2 前请确保已正确配置 TLS(JDK 17+ 支持 ALPN,且证书有效),否则协议协商失败将回退至 HTTP/1.1,keepAliveTimeout 行为亦随之变化。
? 总结:GOAWAY 并非故障,而是 Tomcat 对 HTTP/2 连接健康度的主动管理机制。通过合理配置 server.tomcat.keepAliveTimeout,可在稳定性与资源效率间取得平衡。建议结合监控(如 Actuator 的 /actuator/metrics/http.server.requests)与压测验证调优效果。


















