【SpringBoot实战】优雅关闭服务

article/2025/6/18 18:26:20

文章目录

  • 一、什么是优雅关闭?
  • 二、优雅关闭的核心步骤
  • 三、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.hkcw.cn/article/qyQIgpKBXh.shtml

相关文章

Redis:功能特性和应用场景

🌈 个人主页:Zfox_ 🔥 系列专栏:Redis 本篇开始对于 Redis 进行正式介绍和学习 🔥 认识 Redis 在开始 Redis 学习前,要先认识一下 Redis Redis 的设计,是想要把它当做是一个数据库&#xff…

etcd详解

一、核心特性二、架构原理三、应用场景四、运维实践五、常见问题与解决方案六、与 ZooKeeper 和 Consul 的对比总结 etcd 是一个高可用的分布式键值存储系统,广泛应用于云原生领域,尤其作为 Kubernetes 的核心组件,用于存储集群的配置、状态和…

CTFHub-RCE 命令注入-综合练习

观察源代码 代码里面可以发现过滤了运算符、目录分隔符、分号、空格还有一些关键字也被过滤了 判断是Windows还是Linux 源代码中有 ping -c 4 说明是Linux 查看有哪些文件 用换行符的url值(%0a)代替分号注意:在url中输入 ?ip127.0.0.1%0a#…

网络编程1_网络编程引入

为什么需要网络编程? 用户再在浏览器中,打开在线视频资源等等,实质上说通过网络,获取到从网络上传输过来的一个资源。 与打开本地的文件类似,只是这个文件的来源是网络。相比本地资源来说,网络提供了更为…

性能优化 - 理论篇:性能优化的七类技术手段

文章目录 Pre引言性能优化的七类技术手段性能优化策略一览表1. 复用优化2. 计算优化2.1 并行执行2.2 变同步为异步2.3 惰性加载 3. 结果集优化3.1 数据格式与协议选择3.2 字段精简与按需返回3.3 批量处理与分页3.4 索引与位图加速 4. 资源冲突优化4.1 锁的分类与特点4.2 无锁与…

Android之ListView

1:简单列表(ArrayAdapter) 1:运行的结果: 2:首先在MyListView里面创建一个按钮,点击的时候进行跳转。 这里让我吃惊的是,Button里面可以直接设置onClick .java里面的方法。 也即是点击这个按钮之后就会去…

Unity程序集

对于Unity的程序集,具体内容可以参考Unity官方文档,程序集定义 - 预定义程序集 比如Unity的默认程序集,Assembly-CSharp.dll,还有其他的比如 Assembly-CSharp-Editor.dll,Assembly-CSharp-firstpass.dll 没有指定或…

【算法】递归与分治策略

一、算法整体思想 一般情况下,问题的规模越大,解题所需的计算时间越长,并且解题的难度可能会变得很大。 问题的规模越小,解题所需的计算时间往往越短,也比较容易处理。 当直接解决一个较大的问题时,有时是…

NVIDIA Mellanox BlueField-2 DPU(Data Processing Unit)智能网卡的调试和使用

专有名词 OOB: BMC: BFB: EMMC: 关键词解释eMMCEmbedded Multi-Media Card——把 NAND 闪存颗粒与控制器封装在一起的板载存储件,类似手机里的“内置储存” .deb:文件是​​Debian软件包格式​​的专…

(LeetCode 每日一题) 909. 蛇梯棋 (广度优先搜索bfs)

题目&#xff1a;909. 蛇梯棋 思路&#xff1a;广度优先搜索bfs队列&#xff0c;时间复杂度0(6*n^2)。 细节看注释 C版本&#xff1a; class Solution { public:int snakesAndLadders(vector<vector<int>>& board) {int nboard.size();// vis[i]&#xff1a;…

医疗多模态共情推理与学习一体化网络构成初探

1 引言:多模态共情推理的概念内涵与技术背景 在当今医疗人工智能领域,多模态共情推理正逐步成为突破临床决策支持系统瓶颈的关键范式。这一技术通过融合认知共情与情感共情的双重机制,模拟人类医生的综合诊断思维过程,实现对患者全方位健康状态的深度理解。医疗环境中的共…

RFID技术深度剖析:从原理、协议到S50卡与FM17550读写

知识点1【RFID的概述】 学习目标是学习对这个卡片的读写 用已有的手册实现对卡片内数据的读写操作 RFID&#xff1a;&#xff08;Radio Frequency Identification&#xff09;无线射频识别 通过无线识别目标&#xff0c;并读写相关数据&#xff0c;而无需接触 位于感知层&…

4-香豆酸:CoA连接酶晶体-文献精读138

Crystal structures of a Populus tomentosa 4-coumarate:CoA ligase shed light on its enzymatic mechanisms 杨树&#xff08;Populus tomentosa&#xff09;4-香豆酸&#xff1a;CoA连接酶的晶体结构揭示了其酶促机制 摘要 4-香豆酸&#xff1a;CoA连接酶&#xff08;4CL…

VTK|实现类似CloundCompare的测量功能

文章目录 CloundCompare在点、线、面三种模式下的显示内容✅ 图1&#xff1a;点模式✅ 图2&#xff1a;线模式✅ 图3&#xff1a;面模式 增加控制菜单栏实现测量功能类如何调用项目git链接 CloundCompare在点、线、面三种模式下的显示内容 点 线 面 三张图展示了 CloudComp…

Android15 userdebug版本不能remount

背景描述&#xff1a; 最近调试Android Vendor Hal的时候发现一个奇怪的现象: android userdebug版本刷到设备中&#xff0c;执行adb root没提示错误&#xff0c;但是没有获取到root权限。 Android设备运行的系统版本有三种情况&#xff1a;user版本、userdebug版本和eng版本…

伊朗外长:将适当回应美方核谈判提案

△伊朗外交部长阿拉格齐(资料图)当地时间5月31日,伊朗外交部长阿拉格齐在社交平台表示,当天阿曼外交大臣巴德尔访问伊朗并向其介绍了美方有关核谈判的提案。阿拉格齐表示,伊朗将根据原则、国家利益和伊朗人民的权利对此作出适当的回应。白宫新闻秘书莱维特当地时间31日表示…

27 C 语言编程核心:main 主函数(基本形式、返回值、参数、命令行传参)、多文件编程实践

1 main 主函数 1.1 主函数的作用 在 C 语言中&#xff0c;main 主函数是程序的入口函数&#xff0c;所有 C 程序必须包含一个名为 main 的函数。程序总是从该函数开始执行&#xff0c;没有它程序就无法启动。 主函数可以调用其他函数。其他函数不能调用主函数。主函数不能调用…

GIS常见数据及主要应用综述:类型解析、应用案例与未来趋势全景解读

&#x1f30f; GIS常见数据及主要应用综述&#xff1a;类型解析、应用案例与未来趋势全景解读 地理信息系统&#xff08;GIS&#xff09;是支撑空间决策、资源管理、城市治理的重要技术体系。本文从常见数据类型入手&#xff0c;结合中国及国际资源&#xff0c;梳理典型GIS应用…

系统性学习C语言-第十二讲-深入理解指针(2)

系统性学习C语言-第十二讲-深入理解指针&#xff08;2&#xff09; 1. const 修饰指针1.1 const 修饰变量1.2 const 修饰指针变量 2. 野指针2.1 野指针成因2.2 如何规避野指针2.2.1 指针初始化2.2.2 小心指针越界2.2.3 指针变量不再使用时&#xff0c;及时置 NULL &…

Linux安装redis

Linux redis路径 https://download.redis.io/releases/解压安装Redis 解压 tar -zvxf redis-6.0.5.tar.gz 由于redis是c语言编写的&#xff0c;所以我们需要先安装gcc&#xff0c;安装的命令如下&#xff1a; yum install gcc-c安装 输入命令&#xff1a; make PREFIX/usr/…