优雅关闭(Graceful Shutdown) 是指服务在关闭或重启时,先完成所有正在处理的请求,再安全终止进程的机制。这种机制能有效避免以下问题:
下面来看典型的架构场景:
当对服务实例进行滚动更新时,若直接终止实例,正在处理的请求将失败。
自 SpringBoot 2.3.0 起官方内置优雅关闭支持:
点击访问
将 Web 服务的优雅关闭集成到应用程序上下文(ApplicationContext)的生命周期处理中
配置方式(application.yml)
server:
shutdown: graceful # 启用优雅关闭(支持Tomcat/Jetty/Undertow等Web容器)
spring:
lifecycle:
timeout-per-shutdown-phase: 60s # 最大等待时间(超时后强制关闭),生产环境必须设置!
信号名称 | 是否触发优雅关闭 | 说明 |
---|---|---|
SIGTERM | ✅ | kill -15(默认推荐) |
SIGINT | ✅ | Ctrl+C 或 kill -2 |
SIGKILL | ❌ | kill -9 立即强制终止 |
生产环境应使用 SIGTERM 触发关闭
SpringBoot 通过注册 Shutdown Hook 实现:
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
// 1. 关闭ServerSocket停止接收请求
// 2. 检查活动请求计数器
// 3. 等待计数器归零或超时
}));
通过 SpringBoot 原生支持的优雅关闭机制,配合基础设施的流量控制,可实现服务的零中断发布。关键点在于:
生产环境发布效果对比:
未启用优雅关闭:发布期间错误率飙升
启用后:错误率曲线保持平稳