Spring Boot 优雅停机:发布时不再丢请求

328 字
2 分钟
Spring Boot 优雅停机:发布时不再丢请求
Spring Boot 优雅停机:发布时不再丢请求

每次发布都会收到几条 502 报警?很可能是应用没有「优雅」地停下来。

什么是优雅停机#

收到停止信号后:

  1. 不再接收新请求;
  2. 等待进行中的请求处理完成(带超时);
  3. 关闭线程池、连接池等资源;
  4. 进程退出。

开启配置#

Spring Boot 2.3+ 内置支持:

server:
shutdown: graceful
spring:
lifecycle:
timeout-per-shutdown-phase: 30s

默认是 immediate,即立即关闭。

配合负载均衡#

仅仅应用内优雅还不够。流量还在往一个即将退出的实例上打,就会出错。一个稳妥的顺序是:

  1. 先把实例从负载均衡中摘除(或让就绪探针失败);
  2. 等待几秒,让流量完全切走;
  3. 再发送 SIGTERM,触发优雅停机。

在 Kubernetes 中可以用 preStop 钩子留出缓冲时间:

lifecycle:
preStop:
exec:
command: ["sh", "-c", "sleep 10"]
terminationGracePeriodSeconds: 60

注意:terminationGracePeriodSeconds 必须大于 preStop 时间加上应用的停机超时。

自己的资源也要收尾#

对于自己创建的线程池、消息消费者,要在 @PreDestroy 或 SmartLifecycle 中显式停止:

@PreDestroy
public void shutdown() {
executor.shutdown();
try {
if (!executor.awaitTermination(20, TimeUnit.SECONDS)) {
executor.shutdownNow();
}
} catch (InterruptedException e) {
executor.shutdownNow();
Thread.currentThread().interrupt();
}
}

小结#

优雅停机是「应用 + 基础设施」共同的事。把它配置好,发布就不再是一件提心吊胆的事情。

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

Spring Boot 优雅停机:发布时不再丢请求
https://www.s9mc.cn/posts/spring-boot-graceful-shutdown/
作者
南柯一梦
发布于
2026-08-28
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
南柯一梦
三年 Java 后端 · 十二年 MC 服主 · AI 驱动开发
公告
欢迎来到南柯一梦!这里记录 Java、Minecraft 服务器与 AI 的折腾日常。
分类
标签
最新动态
站点统计
文章
6
分类
3
标签
17
总字数
2,494
运行时长
0 天
最后活动
0 天前
站点信息
构建平台
Vercel
博客版本
v6.16.8
文章许可
CC BY-NC-SA 4.0
文章目录
微信二维码
微信扫码添加
QQ:1649721249