全部产品
云市场

Dubbo 应用优雅下线

更新时间:2019-08-28 17:52:08

对于任何一个线上应用,如何在服务更新部署过程中保证客户端无感知是开发者必须要解决的问题,即从应用停止到重启恢复服务这个阶段不能影响正常的业务请求。在应用执行部署、停止、回滚、缩容、重置时,需要通过优雅下线的配置来保证应用正常关闭。

背景信息

优雅下线是指在执行部署应用、停止应用、回滚应用、应用缩容、重置应用时,执行的一系列保证应用正常关闭的操作,优雅下线可以避免非正常关闭应用导致数据异常或丢失、应用调用异常等问题。

如何保证从应用停止到恢复服务期间不影响正常运行的消费者的业务请求?理想条件下,在整个服务没有请求的时候再进行更新是最安全可靠的。但实际情况下,无法保证在服务下线的同时完全没有任何调用请求。传统的解决方式是通过将应用更新流程划分为手工摘流量、停应用、更新重启三个步骤,由人工操作实现客户端无对更新感知。

如果在容器/框架级别提供某种自动化机制,来自动进行摘流量并确保处理完以到达的请求,不仅能保证业务不受更新影响,还可以极大地提升更新应用时的运维效率。这个机制就是优雅下线。

EDAS 将优雅下线的流程整合在发布流程中,对 EDAS 的 ECS 集群中的应用进行停止、部署、回滚、缩容、重置等操作时,优雅下线会自动执行。

Dubbo 服务优雅下线配置说明

本章节将会介绍开源 Dubbo 中跟优雅停机相关的配置说明。

服务的优雅停机

在 Dubbo 中,优雅停机是默认开启的,默认停机等待时间为 10000 毫秒。您可以通过配置 dubbo.service.shutdown.wait 来修改等待时间。例如将等待时间设置为 20 秒可通过增加以下配置实现:

  1. dubbo.service.shutdown.wait=20000

优雅下线不保证会等待所有已发送/到达请求结束,为了保证处理中的请求不被中断,Dubbo 提供了该参数作为一个关闭应用前的缓冲时间,请根据业务方法的处理时间合理设置关闭应用时的等待时间。

容器的优雅停机

当使用 org.apache.dubbo.container.Main这种容器方式来使用 Dubbo 时,也可以通过配置 dubbo.shutdown.hooktrue 来开启优雅停机。

通过 QoS 优雅下线

基于 ShutdownHook 方式的优雅停机无法确保所有关闭流程一定执行完,所以 Dubbo 推出了多段关闭的方式来保证服务完全无损。

多段关闭即将停止应用分为多个步骤,通过运维自动化脚本或手工操作的方式来保证脚本每一阶段都能执行完毕。

在关闭应用前,首先通过 QoS 的 offline 指令下线所有服务,由于服务已经在注册中心下线,故当前应用不会有新的请求,然后等待一定时间确保到达的请求已经全部处理完毕。这时再执行真正的关闭( SIGTERM 或 SIGINT)流程,就能保证服务无损。

QoS 可通过 telnet 或 HTTP 方式使用,具体说明请参见 Dubbo-QOS命令使用说明

EDAS Dubbo 优雅下线

Dubbo 框架本身提供的优雅下线能力在系统运行期间,需要运维系统去搭配框架使用,才能使该功能生效。Dubbo 应用在 EDAS 上部署后,可以在 EDAS 上进行 Dubbo 应用的应用生命周期管理,在 EDAS 内执行 Dubbo 框架应用的停机操作时,均可以在应用变更单中查看优雅下线的记录。

  1. 登录 EDAS 控制台,在页面左上角选择地域。

  2. 在左侧导航栏选择应用管理 > 应用列表,在应用列表中单击 ECS 集群中 Dubbo 应用的应用名。

  3. 在应用详情页面进行以下操作,均会触发 EDAS 上的 Spring Cloud 应用的优雅下线流程。

    • 在页面右上角单击停止应用部署应用回滚应用
    • 在执行完停止应用后,在页面右侧单击批量操作实例,在批量操作实例页面勾选要缩容的实例,单击批量缩容
    • 实例部署信息页签的应用实例的操作列,单击重置
  4. 在应用详情页左上角会提示应用有变更流程正在执行,处于执行中状态,单击该提示右侧的查看详情

  5. 变更详情页面可以查看优雅下线的变更记录详情。

    1. 在应用变更单中的应用平滑下线阶段,会将服务从 Nacos 注册中心注销。
    2. 执行应用停止流程中,会检测 Dubbo 应用是否开启了 QoS 端口,如已开启,则调用offline指令下线服务,停止应用的进程接收到指令后执行下线操作。

      1. 2019-08-19 15:01:46.629 INFO 31887 --- [ qos-worker-3-1] o.apache.dubbo.qos.command.impl.Offline : [DUBBO] receive offline command, dubbo version: 2.7.3, current host: 30.5.121.2
      2. 2019-08-19 15:01:46.630 INFO 31887 --- [ qos-worker-3-1] o.a.dubbo.registry.nacos.NacosRegistry : [DUBBO] Unregister: dubbo://30.5.121.2:20883/com.alibaba.middleware.sp.dubbo.samples.DemoApi?anyhost=true&application=dubbo-nacos-provider-from-d&bean.name=demo1&deprecated=false&dubbo=2.0.2&dynamic=true&generic=false&group=DUBBO&interface=com.alibaba.middleware.sp.dubbo.samples.DemoApi&methods=hi,echo,test1,plus&pid=31887&register=true&release=2.7.3&revision=1.0

注意

  • 使用 kill -9 pid 关闭应用不会执行优雅停机,建议使用 EDAS 控制台提供的停止应用功能;

  • 配置的优雅停机等待时间 timeout 不是所有步骤等待时间的总和,而是每一个 destroy 执行的最大时间。例如配置等待时间为 5 秒,则关闭 Server、关闭 Client 等步骤会分别等待 5 秒。

  • EDAS 会尝试访问机器的 22222 端口,调用 qos 指令,用户需要配置开启 qos 指令并且暴露默认端口号:22222