全部产品
云市场

Spring Cloud 应用优雅下线

更新时间:2019-08-29 01:03:28

对于任何一个线上应用,如何在服务更新或停止过程中保证消费者无感知?优雅下线机制可以做到。您既可以通过修改容器或者框架的相关配置来实现优雅下线,也可以直接将应用部署至 EDAS 上进行生命周期管理来实现。本文将以 Spring Cloud 应用作为示例来讲述优雅下线。

背景信息

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

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

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

开源 Spring Cloud 服务优雅下线方案

本章节将会介绍开源 Spring Cloud 应用中跟优雅下线相关的配置方案说明。

第一步:服务提供者注销服务

Spring Cloud Commons 中的 ServiceRegistryEndpoint 提供了服务注销的功能,可以发送一个请求使用 Endpoint 来控制服务的下线。

  1. curl -X "POST" "http://{ip}:{port}/actuator/service-registry?status=DOWN" -H "Content-Type: application/vnd.spring-boot.actuator.v2+json;charset=UTF-8"

在使用 Endpoint 控制服务下线的方法中,会调用接口 ServiceRegistry 的实现类的 setStatus(R registration, String status)方法,将服务提供者注册的服务从服务注册中心注销。

第二步:服务消费者更新服务提供者列表

当服务提供者从注册中心注销服务后,服务消费者会在下一次请求的服务提供者列表中摘除已经注销的服务提供者。开源 Spring Cloud 框架应用的负载均衡一般由 Ribbon 实现,故本步骤以修改 Ribbon 的刷新时间作为示例。

Ribbon 默认的刷新时间为 30s,这意味着在最差的情况下,服务提供者在下线 30 秒之后,服务消费者的请求服务列表中才能摘除掉已经注销了的服务提供者,因此您可以修改刷新时间的配置来缩短感应时间。例如修改下面的配置可将刷新时间缩短为 2000ms。

  1. ribbon.ServerListRefreshInterval=2000

第三步:停止服务提供者应用

当服务提供者不再收到新请求后,而且在服务注销之前收到的请求也已经处理完毕后,就可以在不影响业务的情况下停止应用。

EDAS 中 Spring Cloud 应用的优雅下线

上述的开源 Spring Cloud 优雅平滑下线的方案中, ServiceRegistryEndpoint 的调用前提是引入 Spring Boot Actuator 依赖,需要在应用中添加一些额外的安全配置才使 Actuator 能被正常访问。Spring Boot 1 和 Spring Boot 2 两个版本还存在 Actuator 地址不一致的情况。

开源 Spring Cloud 应用部署至 EDAS,需修改配置依赖为 Nacos Sever。在 EDAS 中执行应用停止相关的操作时,EDAS 会直接在服务注册中心将服务提供者的摘除,这套方案的优点是对部署的应用没有额外的配置需求,也无需强依赖 Spring Boot Actuator。您只需将服务列表的刷新时间调整到一个小于 3 秒的值即可。下文展示了在 EDAS 中执行优雅下线的操作流程。

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

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

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

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

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

    1. 在应用变更单中的应用平滑下线阶段,会将服务从 Nacos 注册中心注销。

    2. 在服务注销之后,默认在 3 秒之后,应用将被停止。