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

注意

MSE治理中心暂不支持如下应用无损下线:

  • 暂不支持消费端为Spring Cloud LoadBalancer负载均衡应用的下游应用的无损下线。
  • 暂不支持提供端应用为WebFlux或者其他非SpringMVC应用的无损下线。
  • 暂不支持消费端为非微服务应用的下游提供者应用的无损下线。
  • 暂不支持非Java应用体系的无损下线。

视频教程

无损下线功能演示Demo链接:alibabacloud-microservice-demo

为什么需要无损下线

应用从停止到恢复服务期间很难保证不影响正常运行的消费者的业务请求。理想条件下,在整个服务没有请求时进行更新是安全可靠的。但实际情况下,无法保证在服务下线的同时没有任何调用请求。

传统的解决方式是通过将应用更新流程划分为手工摘除流量、停应用、更新重启三个步骤,由人工操作实现客户端对更新无感知。

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

MSE治理中心无损下线的优势

  • 对于开源Spring Cloud可以通过shutdownHook、Spring Boot Actuator和Ribbon实现无损下线,不仅有一定的开发工作量,而且部分注册中心会导致短暂的流量损失。
  • 对于开源Dubbo可以通过shutdownHook和QoS实现无损下线,不仅有一定的开发工作量,而且对Dubbo有版本要求,还有一些遗留问题,最终影响正常使用。
MSE治理中心将无损下线的流程整合在发布流程中,对应用进行停止、部署、回滚、缩容、重置等操作时,无损下线会自动执行。相对于开源的Spring Cloud和Dubbo方案,MSE治理中心无损下线分别具有以下优势。
  • 相对于开源的Spring Cloud方案,MSE治理中心无损下线具有以下优势:
    分类 开源Spring Cloud MSE治理中心
    版本 使用ServiceRegistryEndpoint,需要依赖Actuator组件,且需要升级到适配的版本。 无需任何操作,无侵入地支持Spring Cloud Dalston及以上版本。
    注册中心和流量损失 依赖注册中心,有些注册中心会导致流量损失。
    • ZooKeeper不存在流量损失。
    • Eureka存在3s流量损失。
    • Nacos存在客户端缓存,会造成最长10s的流量损失。
    无需依赖任何注册中心,对于任何注册均不存在流量损失。
    场景 ECS场景需要结合变更详情;K8s场景可以配合prestop接口,但是prestop接口只能配置一个动作。 ECS和K8s全部覆盖,且不影响对应用的任何操作与配置。
    客户端缓存 需要权衡利弊配置合理的Ribbon缓存的刷新时间,过长会导致下线有流量损失,过短会影响性能。 增强Ribbon下线刷新机制,通过反应式响应方式主动刷新Ribbon缓存,您无需关心缓存刷新。
  • 相对于开源的Dubbo方案,MSE治理中心无损下线具有以下优势:
    说明 配置无损下线需要服务的消费者与提供者均接入MSE服务治理。
    分类 开源Dubbo MSE治理中心
    注册中心的 unexport 未采用原子变量导致并发问题 2.5.3及之前版本不支持 支持
    反向通知 2.5.3及之前版本不支持 支持
    客户端等待在途请求 2.5.3及之前版本不支持 支持
    qos offline 2.5.8-2.6.2及之后的版本支持 支持
    Dubbo 与 Spring ShutDownHook 触发问题 仅Apache Dubbo 2.7.3+支持 支持
    下线事件 仅Apache Dubbo 2.7.3+支持 支持
    服务端等待 不支持 支持
    提前sendReadOnly 不支持 支持

如何验证无损下线是否生效

您可以直接根据实际业务验证应用的无损下线是否已经生效。另外,MSE治理中心也提供了两个应用Demo,您可以使用这两个Demo在容器服务K8s集群中验证无损下线。您可以通过以下任一种方式验证无损下线:

无损下线验证方式一:

  1. 下载应用Demo(ProviderConsumer)。
  2. 将应用Demo部署到容器服务K8s集群。相关操作,请参见创建无状态工作负载Deployment
    其中,Provider的实例个数为2,Consumer的实例个数为1。
  3. 查看应用调用现状。
    1. 登录部署Consumer的Pod,执行以下命令,该命令会不停地访问服务端的服务。
      #!/usr/bin/env bash
      while true
      do
          echo `curl -s -XGET http://localhost:18091/user/rest`
      done
    2. 查看调用请求的响应。
      正常调用结果

      从响应中可以看到, Consumer随机访问Provider的两个实例(IP为172.20.0.221和172.20.0.223)。

      注意 调用请求的响应窗口不要关闭,后续仍然会用到。
  4. 将Provider的实例缩容到1,模拟实例重启的场景。
  5. 再次查看调用请求的响应结果,验证无损下线。
    调用请求响应-无损下线

    一直观察客户端请求情况,可以看到无损下线的情况,同时观察客户端日志,不存在任何相关问题,客户端完全无感知。

    从响应中可以看到,Consumer会固定访问Provider剩余的一个实例(IP为172.20.0.221),而不会发生调用异常,避免影响Consumer。

无损下线验证方式二:

  1. 登录MSE治理中心控制台
  2. 在左侧导航栏选择微服务治理中心 > 流量治理 > 无损上下线
  3. 应用列表列单击目标应用名称,右侧显示该应用的无损上线配置以及相关的可观测数据。
    • 应用列表区域,显示当前应用列表信息。
    • 应用无损上线配置区域,您可以对目标应用配置无损上线规则。
    • 可观测数据概览区域,您可以查看应用事件统计信息,以及观测无损上下线事件,支持通过应用结束时间过滤。
      注意 无损上下线页面中的可观测数据概览区域提供了无损上下线事件可视化功能,服务提供者和服务消费者需满足下列条件,才能保证数据的准确性: 如果不满足上述所有条件属于非正常使用,不能保证展示的数据准确。

如上图所示,在可观测数据概览区域,可见图中实例最后无损下线成功。