dubbo与springBoot如何实现优雅停机

425 阅读2分钟
1.操作系统层面提供了kill -15(sigterm)两种停机策略
1)kill pid(默认为kill -15) 与kill -15 pid
系统会发送一个sigterm的信号给对应的程序,当程序接收该sinal后将会发生以下事情:
程序立刻停止;当程序释放相应的资源后再停止;程序可能仍然继续运行
大部分程序接收到sigterm信号后,会先释放资源再停止.但是也有程序可能接收可能接收信号后 做一些其他事情
2)Kill -9 系统给对应程序发送的信号是sigkill 即exit,exit信号不会被系统阻塞,能顺利杀掉进程
2.语言层面,Java 应用有 JVM shutdown hook 这样的概念
3.框架层面,Spring Boot 提供了 actuator 的下线 endpoint
4.容器层面,Docker :当执行 docker stop 命令时,容器内的进程会收到 SIGTERM 信号,那么 Docker Daemon 会在 10s 后,发出 SIGKILL 信号;K8S 在管理容器生命周期阶段中提供了 prestop 钩子方法

dubbo优雅停机

1.在Dubbo2.5.x之前的停机方案 时序如下:

1.Registry 注销

2.等待 -Ddubbo.service.shutdown.wait 秒,等待消费方收到下线通知

3.Protocol 注销

DubboProtocol 注销

NettyServer 注销

等待处理中的请求完毕

停止发送心跳

关闭 Netty 相关资源

NettyClient 注销

停止发送心跳

等待处理中的请求完毕

关闭 Netty 相关资源

Spring容器下的Dubbo优雅停机

上述的方案在不使用 Spring 时的确是无懈可击的,但由于现在大多数开发者选择使用 Spring 构建 Dubbo 应用,上述的方案会存在一些缺陷。
由于 Spring 框架本身也依赖于 shutdown hook 执行优雅停机,并且与 Dubbo 的优雅停机会并发执行,而 Dubbo 的一些 Bean 受 Spring 托管,当 Spring 容器优先关闭时,会导致 Dubbo 的优雅停机流程无法获取相关的 Bean,从而优雅停机失效.

增加ShutdownHookListener

Spring 如此受欢迎的原因之一便是它的扩展点非常丰富,例如它提供了 ApplicationListener 接口,开发者可以实现这个接口监听到 Spring 容器的关闭事件,为解决 shutdown hook 并发执行的问题,在 Dubbo 2.6.3 中新增了 ShutdownHookListener 类,用作 Spring 容器下的关闭 Dubbo 应用的钩子。

以上摘自:www.cnkirito.moe/dubbo-grace…

springBoot的优雅停停机方案

1.actuator/shutdown of Spring boot

#访问路径,配置后就和1.x版本路径一样

management.endpoints.web.base-path=/management

#暴露所有,也可以暴露单个或多个

management.endpoints.web.exposure.include=*

#开启shutdown

management.endpoint.shutdown.enabled=true

但测试结果很失望,并没有是想优雅的停机功能 ,注意:要使用post请求:localhost:9090/actuator/shutdown
可摘除在nacos中的注册信息

针对tomcat的解决方案

详情见: www.jianshu.com/p/0c49eb23c… 亲测有效,可以解决shutdown接口无法进行优雅下线的问题

2./service-registry 端点进行优雅下线

没有亲测 /service-registry端点无法打开