当前位置: 首页 > news >正文

SpringBoot 应用优雅停机:正确关闭服务的 3 种方式

线上发布、重启服务时,你是不是直接kill -9一把梭?
后果往往是:

  • 正在处理的请求直接中断,前端报错 502;

  • 事务没提交,导致数据不一致;

  • 线程池、连接池暴力关闭,资源泄漏;

  • MQ 消息消费一半,出现重复/丢失。

所谓优雅停机(Graceful Shutdown),就是让应用在关闭前:

  • 停止接收新请求;

  • 把正在处理的请求执行完;

  • 释放线程池、连接池、MQ 消费者等资源;

  • 最后再安全退出。

今天讲清楚 SpringBoot 优雅停机的3 种标准方案,生产直接抄配置。


一、什么是优雅停机?

简单说 4 件事:

  1. 不再接收新的 HTTP 请求 / 新消息

  2. 等待正在执行的业务执行完毕

  3. 自动关闭线程池、数据库连接、Redis 连接

  4. 安全退出 JVM,不丢数据、不中断事务

SpringBoot 2.3+ 已经内置支持,不用自己写复杂钩子。


二、方式1:配置文件开启内置优雅停机

1)application.yml 配置

1server: 2# 优雅停机最大等待时间(单位为秒) 3shutdown: graceful 4 5spring: 6 lifecycle: 7# 所有 Bean 关闭的最大等待时间 8timeout-per-shutdown-phase: 30s
  • server.shutdown: graceful

    :开启 Web 容器优雅停机

  • timeout-per-shutdown-phase: 30s

    :给 30 秒缓冲时间

2)支持的容器

  • Tomcat

  • Jetty

  • Undertow

全都通用,不用改代码。


三、方式2:Actuator 优雅停机

适合:发布平台、脚本自动化重启

1)引入依赖

1<dependency> 2<groupId>org.springframework.bootgroupId> 3<artifactId>spring-boot-starter-actuatorartifactId> 4dependency>

2)开启 shutdown 端点

1management: 2 endpoints: 3 web: 4 exposure: 5include: shutdown,health 6 endpoint: 7 shutdown: 8enabled:true

3)远程调用关闭

1curl-X POST http://localhost:8080/actuator/shutdown

应用会优雅停机,不是暴力杀进程。

4)生产安全提醒

  • 一定要配合 Spring Security 权限控制

  • 只对内网开放,不要暴露到公网

  • 不要在生产随意打开/actuator/shutdown


四、方式3:kill + 信号优雅停机

最常用、最推荐的生产方式。

正确命令

1kill PID 2# 或者 3kill-15 PID

绝对禁止

1kill-9 PID # 暴力杀,不优雅,会丢数据!

SpringBoot 会捕获SIGTERM信号,自动执行优雅停机流程。


五、如何保证自己的业务也“优雅”?

如果你有:

  • 自定义线程池

  • MQ 消费者

  • 定时任务

  • socket 长连接

需要加一个关闭钩子,保证资源释放。

1@Component 2publicclassAppShutdownHook{ 3 4@PreDestroy 5publicvoiddestroy(){ 6// 关闭线程池、消费者、连接等 7System.out.println("应用正在优雅关闭:清理自定义资源"); 8} 9}

或者实现DisposableBean


六、优雅停机完整流程

  1. 收到关闭信号(kill / actuator / 控制台停止)

  2. Web 容器不再接受新请求

  3. 等待正在执行的 HTTP 请求完成

  4. 关闭 Spring 容器,执行@PreDestroy

  5. 关闭线程池、数据源、MQ 客户端

  6. JVM 安全退出

整个过程在timeout时间内完成。


七、生产最佳实践

  1. 一律用 kill PID,禁止 kill -9
  2. 配置优雅停机超时 20~30s

  3. 发布脚本先切流量,再停机

  4. 自定义线程池/消费者必须加关闭钩子

  5. 用 Actuator 做自动化发布时开启权限

  6. 日志里观察停机日志,确认是 graceful 关闭


八、常见坑

  1. 超时时间太短

    长接口、大事务没执行完就被关闭 → 加大timeout

  2. 用 kill -9

    等于直接拔电源,任何优雅机制都失效

  3. 自定义线程池没关闭

    应用关了,线程还在跑 → 用@PreDestroy关闭

  4. Actuator 未授权暴露 shutdown

    被人恶意调用,直接关服务


http://www.jsqmd.com/news/536510/

相关文章:

  • Java学习笔记_Day14
  • ChatGPT模型排名实战指南:如何选择最适合业务场景的AI模型
  • 开源项目依赖管理:从架构设计到实战落地
  • DNS负载均衡:架构、优化与故障排查指南
  • 百川2-13B模型微调指南:提升OpenClaw自动化任务准确率
  • 木马与恶意软件深度实战:查杀原理 + 免杀对抗全攻略(2026 珍藏版)
  • 2026制造业机房报废设备回收厂家排行榜:机房存储设备回收/机房旧设备回收/机房服务器回收/机房机柜回收/机房淘汰设备回收/选择指南 - 优质品牌商家
  • 嵌入式NMEA-0183零内存分配解析器设计与实现
  • 如何快速构建轻量Windows 11系统:tiny11builder完整指南
  • Qwen3-4B模型微调指南:提升OpenClaw任务准确率
  • 自动机:创意编码动画引擎的终极实现方案
  • 中文语义相似度计算新范式:技术演进与实践路径
  • ChatGPT工作原理简述:从Transformer到AI辅助开发的实践指南
  • 嵌入式Linux多线程资源占用排查方法
  • 深入解析cosyvoice接口:从技术原理到高效集成实践
  • RTX4090D显存管理:OpenClaw长时间运行Qwen3-32B的稳定性技巧
  • Kimi-K2.5开源:15万亿tokens构建多模态智能体
  • OpenClaw性能监控:GLM-4.7-Flash响应延迟可视化方案
  • OpenClaw飞书机器人:GLM-4.7-Flash实现智能问答助手
  • 上海本凡科技引领小程序开发行业,凭实力成为最受欢迎的公司
  • 网安大佬推荐!新手小白学习路线图,照着走就对了
  • 通信工程毕设项目推荐:面向新手的5个可落地实战选题与技术实现路径
  • 如何快速搭建国标28181视频平台:实战部署完整指南
  • OpenClaw故障排查:Qwen3-VL:30B飞书连接常见问题解决
  • 基于Chrome WebRTC与语音大模型的端到端AI辅助开发实战
  • 打造企业级安全防线:WeKnora文档权限控制与数据隔离的5种实践
  • OpenClaw+Qwen3-32B私有部署:RTX4090D 24G显存一键体验指南
  • 计算机毕业设计实战:基于时序模型的农产品销量预测系统构建与避坑指南
  • 基于STM32的智能鱼缸毕设任务书:新手入门实战指南与系统架构详解
  • 跨平台对比:Windows/macOS下OpenClaw连接星图Qwen3-VL:30B的差异