SpringBoot 优雅停机

目录

      • linux常用的 kill 指令
      • springboot 优雅停机
      • /actuator/shutdown 端点
      • 不停机更新方案

 

linux常用的 kill 指令

  • kill -15:kill指令默认就是-15,只是发送一个 SIGTERM 信号通知进程终止,由进程自行决定怎么做,即进程不一定会终止。
  • kill -9:强制终止进程,进程会被立刻终止
  • kill -2:类似 Ctrl+C 退出,会先保存相关数据再终止进程。

一般不直接使用 kill -15,因为不一定能终止进程。

kill -9 过于暴力,往往会出现事务执行、业务处理中断的情况,导致数据库中存在脏数据、系统中存在残留文件等情况。如果要用kill -9,尽量先使用 kill -15 给进程一个处理善后的机会。

kill -2 稍微温和一些,立刻终止正在执行的代码 -> 保存数据 -> 终止进程,只是在进程终止之前会先保存相关数据,依然会出现事务执行、业务处理中断的情况,做不到优雅停机。

 

springboot 优雅停机

优雅停机是springboot的特性之一,在收到终止信号后,不再接受、处理新请求,但会在终止进程之前预留一小段缓冲时间,以完成正在处理的请求。
 

需要注意的是,优雅停机需要 tomcat 的 9.0.33 及其之后的版本才支持

Graceful shutdown with Tomcat requires Tomcat 9.0.33 or later.

springboot内置的tomcat版本都比较高,一般是满足的。
 

yml

server:
  #启用优雅停机。graceful 优雅、优美。默认为 immediate 立刻终止
  shutdown: graceful

spring:
  lifecycle:
    ##设置优雅停机的缓冲时间
    timeout-per-shutdown-phase: 30s

缓冲时间用完了,不管请求有没有执行完毕,都会终止进程。
 

终止进程使用 kill -2。

不能使用kill -9,使用kill -9会立刻杀死进程,优雅停机不会起作用。
 

对应的日志如下

#正在执行方法

#收到 kill -2 的终止信号,开始优雅停机,不再接受新请求,等待正在处理的请求执行完毕
2021-10-20 15:46:46.880  INFO 13988 --- [extShutdownHook] o.s.b.w.e.tomcat.GracefulShutdown        : Commencing graceful shutdown. Waiting for active requests to complete

#继续处理尚未处理完毕的请求

#缓冲时间已到,优雅停机结束,终止进程
2021-10-20 15:46:59.562  INFO 13988 --- [tomcat-shutdown] o.s.b.w.e.tomcat.GracefulShutdown        : Graceful shutdown complete
2021-10-20 15:46:59.594  INFO 13988 --- [extShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor  : Shutting down ExecutorService 'applicationTaskExecutor'

 

/actuator/shutdown 端点

如果集成了 actuator,可以用 /actuator/shutdown 端点来代替 kill -2 关闭应用。

生产环境禁止暴露 /actuator/shutdown 这种高风险端点,谁都可以发一个POST请求来关闭我们服务器上的应用,那还了得。springboot默认也没有启用 /actuator/shutdown 端点,这种方式一般不用,此处只是简单介绍一下。
 

yml

management:
  #暴露actuator的全部全部端点
  endpoints:
    web:
      exposure:
        include: "*"
  #启用shutdown端点,默认false    
  endpoint:
    shutdown:
      enabled: true

POST 请求 /actuator/shutdown 端点即可关闭应用,作用和 kill -2 相同,也可以实现优雅停机。

 

不停机更新方案

这里说的不停机,是指不停止对外服务,并非不停止应用|web容器。

公司有钱的话,可以部署2套生产环境,更新时先切换到另一套环境,更新完毕再切回来。

你可能感兴趣的:(SpringBoot,SpringBoot,优雅停机,graceful,shutdown,kill)