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

每次发布都会收到几条 502 报警?很可能是应用没有「优雅」地停下来。
什么是优雅停机
收到停止信号后:
- 不再接收新请求;
- 等待进行中的请求处理完成(带超时);
- 关闭线程池、连接池等资源;
- 进程退出。
开启配置
Spring Boot 2.3+ 内置支持:
server: shutdown: graceful
spring: lifecycle: timeout-per-shutdown-phase: 30s默认是 immediate,即立即关闭。
配合负载均衡
仅仅应用内优雅还不够。流量还在往一个即将退出的实例上打,就会出错。一个稳妥的顺序是:
- 先把实例从负载均衡中摘除(或让就绪探针失败);
- 等待几秒,让流量完全切走;
- 再发送
SIGTERM,触发优雅停机。
在 Kubernetes 中可以用 preStop 钩子留出缓冲时间:
lifecycle: preStop: exec: command: ["sh", "-c", "sleep 10"]terminationGracePeriodSeconds: 60注意:terminationGracePeriodSeconds 必须大于 preStop 时间加上应用的停机超时。
自己的资源也要收尾
对于自己创建的线程池、消息消费者,要在 @PreDestroy 或 SmartLifecycle 中显式停止:
@PreDestroypublic 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/相关文章智能推荐
1
开了十二年服,我总结的 Paper 服务器调优清单
Minecraft从 JVM 参数到区块加载,从实体清理到定时任务,一份来自十二年运维经验的 Minecraft 服务器调优清单。
2
Java 虚拟线程实战:用同步写法扛住十万并发
Java虚拟线程让「一请求一线程」重新变得可行。本文从原理、用法到踩坑,讲清楚它在后端服务里该怎么用。
3
MySQL 索引与执行计划:从 EXPLAIN 看懂慢查询
Java学会读 EXPLAIN,理解最左前缀、覆盖索引与索引失效场景,让慢查询无处遁形。
4
Redis 分布式锁:从 SETNX 到 Redisson 的坑
Java一把分布式锁要考虑的事情远比想象中多:原子性、过期时间、误删、续期。本文逐个拆解。
5
和 AI 结对编程:我的日常工作流
AI不是让 AI 替你写代码,而是让它成为你的搭档。分享我在日常开发中使用 AI 工具的几条原则与技巧。
随机文章随机推荐









