spring boot 2.3+ 原生支持优雅关闭:需配置 server.shutdown=graceful 和 spring.lifecycle.timeout-per-shutdown-phase(如45s),配合actuator shutdown端点或业务逻辑主动触发;禁用kill -9、确保k8s terminationgraceperiodseconds与超时匹配,并同步下线负载均衡节点。

Spring Boot 实现优雅关闭服务,核心是让应用在退出前停止接收新请求、处理完正在执行的请求、再安全释放资源。从 2.3 版本起,框架已原生支持,无需手写钩子或扩展容器。
配置内置优雅停机(最常用)
只需两行配置,适用于 Tomcat、Jetty、Undertow 所有内嵌容器:
-
开启 Web 层优雅停机:设置
server.shutdown=graceful -
设定最大等待时间:用
spring.lifecycle.timeout-per-shutdown-phase控制缓冲期,默认 30 秒,建议按业务最长响应时间设为45s或60s
示例(application.yml):
server:
shutdown: graceful
spring:
lifecycle:
timeout-per-shutdown-phase: 45s
通过 Actuator 远程触发关闭
适合发布平台、CI/CD 脚本或运维批量操作:
- 引入依赖:
spring-boot-starter-actuator - 启用并暴露
shutdown端点(注意生产环境需鉴权):
management:
endpoints:
web:
exposure:
include: shutdown,health
endpoint:
shutdown:
enabled: true
调用方式:curl -X POST http://localhost:8080/actuator/shutdown
配合业务逻辑主动关闭(如定时检查下线指令)
当需要根据外部信号(如数据库标记、配置中心开关)控制停机时,不能直接调 SpringApplication.exit(),否则会中断调度线程池、连接池清理流程。
- 应先显式关闭强依赖资源,例如 Hikari 数据源、ScheduledThreadPoolExecutor
- 再调用
applicationContext.close()或SpringApplication.exit() - 推荐封装成服务类,注入具体数据源类型(如
HikariDataSource),避免接口抽象导致关闭失效
必须避开的坑
以下操作会让优雅停机完全失效:
- 使用
kill -9 PID—— JVM 不执行任何关闭钩子,@PreDestroy、连接池回收、事务回滚全被跳过 - 未配置
server.shutdown=graceful却依赖默认行为 —— Spring Boot 2.3+ 之前默认立即关闭,2.3+ 默认仍是immediate - K8s 环境中未配
terminationGracePeriodSeconds,导致 Pod 在 Spring 完成关闭前就被系统强制终止 - 负载均衡器未配合下线(如 Nginx 未调用
upstream健康检查摘除节点),新流量仍持续涌入











