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

【SpringBoot实战】优雅关闭服务

文章目录

  • 一、什么是优雅关闭?
  • 二、优雅关闭的核心步骤
  • 三、SpringBoot优雅关闭实现
  • 四、关键注意事项
    • 1. 超时时间必须配置
    • 2. 信号支持局限性
    • 3. 特殊请求处理
  • 五、底层实现原理
  • 六、总结

一、什么是优雅关闭?

优雅关闭(Graceful Shutdown) 是指服务在关闭或重启时,先完成所有正在处理的请求,再安全终止进程的机制。这种机制能有效避免以下问题:

  • 用户请求突然中断导致的客户端报错
  • 数据库事务执行到一半被强制终止
  • 负载均衡将流量导向正在关闭的节点

下面来看典型的架构场景:
在这里插入图片描述
当对服务实例进行滚动更新时,若直接终止实例,正在处理的请求将失败。

二、优雅关闭的核心步骤

  1. 流量摘除
    CI/CD系统将目标节点从负载均衡(如Nginx)的后端服务器组中移除
  2. 接收终止信号
    进程接收到操作系统发送的终止信号(如SIGTERM)
  3. 停止接收新请求
    服务立即关闭端口监听,拒绝新请求进入
  4. 等待既有请求完成
    服务等待所有正在处理的请求完成(包括长任务)
  5. 进程安全退出
    资源清理后终止进程

三、SpringBoot优雅关闭实现

自 SpringBoot 2.3.0 起官方内置优雅关闭支持:
点击访问

在这里插入图片描述
翻译过来这句话的意思就是:

将 Web 服务的优雅关闭集成到应用程序上下文(ApplicationContext)的生命周期处理中

配置方式(application.yml)

server:shutdown: graceful  # 启用优雅关闭(支持Tomcat/Jetty/Undertow等Web容器)spring:lifecycle:timeout-per-shutdown-phase: 60s  # 最大等待时间(超时后强制关闭),生产环境必须设置!

四、关键注意事项

1. 超时时间必须配置

  • 为什么需要超时?
    防止因某些请求阻塞(如慢SQL、死循环)导致实例永远无法关闭
  • 推荐设置
    根据业务最长处理时间设定(通常 ≥ 最大请求超时时间 × 2)

2. 信号支持局限性

信号名称是否触发优雅关闭说明
SIGTERMkill -15(默认推荐)
SIGINTCtrl+C 或 kill -2
SIGKILLkill -9 立即强制终止

📌 生产环境应使用 SIGTERM 触发关闭

3. 特殊请求处理

  • 长轮询/WebSocket连接:需要业务层实现连接关闭通知
  • 批处理任务:建议拆分可中断任务,或记录任务状态

五、底层实现原理

SpringBoot 通过注册 Shutdown Hook 实现:

Runtime.getRuntime().addShutdownHook(new Thread(() -> {// 1. 关闭ServerSocket停止接收请求// 2. 检查活动请求计数器// 3. 等待计数器归零或超时
}));

六、总结

通过 SpringBoot 原生支持的优雅关闭机制,配合基础设施的流量控制,可实现服务的零中断发布。关键点在于:

  1. 正确配置 server.shutdown=graceful + 超时时间
  2. 使用 SIGTERM 而非 SIGKILL 终止进程
  3. 基础设施层保证流量摘除先于进程终止

生产环境发布效果对比:
未启用优雅关闭:发布期间错误率飙升
启用后:错误率曲线保持平稳 🚀

http://www.xdnf.cn/news/10169.html

相关文章:

  • 【NLP 78、手搓Transformer模型结构及实战】
  • 34.x64汇编写法(一)
  • stm32——I2C协议
  • 第三方软件评测机构如何助力软件品质提升及企业发展?
  • 微信小程序真机调试时如何实现与本地开发环境服务器交互
  • 27 C 语言编程核心:main 主函数(基本形式、返回值、参数、命令行传参)、多文件编程实践
  • 设计模式——面向对象设计六大原则
  • JavaScript 在 AcroForm 中的广泛应用
  • 设计模式——抽象工厂设计模式(创建型)
  • 【大模型部署】mac m1本地部署 ChatGLM3-6B 超详细教程
  • linux进程用户态内存泄露问题从进程角度跟踪举例
  • LG P5048 [Ynoi2019 模拟赛] Yuno loves sqrt technology III Solution
  • spring boot项目中的一些常用提示信息
  • 工业物联网中的事件驱动采样架构及优化
  • MySQL项目实战演练:搭建用户管理系统的完整数据库结构【MySQL系列】
  • 机器视觉2D定位引导一般步骤
  • 视频监控联网系统GB28181协议中事件通知流程详解以及通知失败常见原因
  • 目前主流图像分类模型的详细对比分析
  • 前端-不对用户显示
  • 小明的Java面试奇遇之互联网保险系统架构与性能优化
  • 鲲鹏Arm+麒麟V10 K8s 离线部署教程
  • C++ 栈(Stack)与队列(Queue)深度解析:从原理到实战
  • Python字符串格式化(三): t-string前瞻(Python 3.14 新特性)
  • 使用yocto搭建qemuarm64环境
  • C#获取磁盘容量:代码实现与应用场景解析
  • python训练 60天挑战-day41
  • day23-计算机网络-1
  • Java工厂方法模式详解
  • VR/AR 显示瓶颈将破!铁电液晶技术迎来关键突破
  • PostgreSQL性能监控双雄:深入解析pg_stat_statements与pg_statsinfo