特性说明
优雅停机是指服务实例能安全平稳的停止,对进行中的业务不产生影响。
SpringBoot的优雅停机
从Spring Boot 2.3开始,Spring Boot现在支持所有四个嵌入式Web服务器(Tomcat、Jetty、Undertow和Netty)的优雅关机功能。
要启用优雅关机,我们要做的就是在application.properties文件中把server.shutdown属性设置为graceful。
server.shutdown=graceful
然后,Tomcat、Netty和Jetty将停止接受网络层的新请求。另一方面,Undertow将继续接受新的请求,但立即向客户端发送503服务不可用的响应。
默认情况下,这个属性的值等于立即,这意味着服务器会立即被关闭。
有些请求可能会在优雅关闭阶段开始之前被接受。在这种情况下,服务器将等待这些活动的请求完成它们的工作,直到指定的时间。我们可以使用spring.lifecycle.timeout-per-shutdown-phase配置属性来配置这个宽限期。
spring.lifecycle.timeout-per-shutdown-phase=1m
如果我们添加这个,服务器将最多等待一分钟来完成活动请求。该属性的默认值是30秒。
参考说明:Web Server Graceful Shutdown in Spring Boot | Baeldung
Dubbo的优雅停机
一个Dubbo服务可能既作为服务提供者,又是服务消费者,当服务停止时:
- 消费者不会再请求已停止的服务实例
- 该服务实例正在处理的请求能正常处理完成
使用方法
-
使用dubbo的qos offline命令向注册中心注销服务,然后等待30秒,使正在执行的数据库或者IO操作处理完成
telnet localhost 22222dubbo> offline -
通过
kill PID停止服务, 不能使用kill -9 PID等强制关闭指令,如果使用强制关闭指令是不会执行优雅停机的 -
设置优雅停机超时时间,缺省超时时间是 10 秒,如果超时则强制关闭。 该参数可在 dubbo.properties 文件里配置,例如:配置为 30 秒。
# 停止服务等待时间,单位:毫秒 dubbo.service.shutdown.wait=30000如果使用的是springboot,application.properties 对应的配置,如下:
dubbo: application: shutwait: 30000 qos-enable: true
注意事项
-
Dubbo 是通过 JDK 的 ShutdownHook 来完成优雅停机的,所以如果用户使用
kill -9 PID等强制关闭指令,是不会执行优雅停机的,只有通过kill PID时,才会执行。 -
验证是否执行了 Dubbo 的 ShutdownHook 可在日志文件中查找关键字:
Run shutdown hook now. -
如果使用了 Spring,请升级 4.2 及以上版本,建议使用 5 以上版本
-
如果使用了 SpringBoot,Dubbo 的 ShutdownHook 会在 SpringBoot 的 ShutdownHook 之前执行, 如果使用 SpringBoot 2.3及以上版本,建议配合 SpringBoot 的优雅停机使用,在配置文件 applicaion.yml 中配置:
server: shutdown: graceful -
如果 ShutdownHook 不能生效,可根据具体场景自行调用:
ApplicationModel.defaultModel().destroy();
官方文档说明:
如果这篇文章帮助到了你,欢迎评论、点赞、转发。