【SpringBoot实战】优雅关闭服务

06-01 1311阅读

文章目录

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

      一、什么是优雅关闭?

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

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

        下面来看典型的架构场景:

        【SpringBoot实战】优雅关闭服务

        当对服务实例进行滚动更新时,若直接终止实例,正在处理的请求将失败。

        二、优雅关闭的核心步骤

        1. 流量摘除

          CI/CD系统将目标节点从负载均衡(如Nginx)的后端服务器组中移除

        2. 接收终止信号

          进程接收到操作系统发送的终止信号(如SIGTERM)

        3. 停止接收新请求

          服务立即关闭端口监听,拒绝新请求进入

        4. 等待既有请求完成

          服务等待所有正在处理的请求完成(包括长任务)

        5. 进程安全退出

          资源清理后终止进程

        三、SpringBoot优雅关闭实现

        自 SpringBoot 2.3.0 起官方内置优雅关闭支持:

        点击访问

        【SpringBoot实战】优雅关闭服务

        翻译过来这句话的意思就是:

        将 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. 基础设施层保证流量摘除先于进程终止

            生产环境发布效果对比:

            未启用优雅关闭:发布期间错误率飙升

            启用后:错误率曲线保持平稳 🚀

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

目录[+]

取消
微信二维码
微信二维码
支付宝二维码