Skip to content

hitless upgrade

chengyouling edited this page Jan 24, 2024 · 7 revisions

无损升级

无损升级指微服务滚动升级、蓝绿发布、灰度升级等过程中,不出现业务中断。无损升级需要解决微服务实例 下线的及时感知、正在处理的请求的优雅停止等问题, 使用CSE实现滚动升级零中断 提供了无损升级一个很好的分析和验证方案。

使用Spring Cloud Huawei,提供了很多机制保障无损升级。

优雅停止

Spring Cloud Huawei优雅停止分为如下步骤:

  • 将本微服务实例从注册中心移除,并等待一段时间。等待时间通过 spring.cloud.servicecomb.discovery.waitTimeForShutDownInMillis 配置,默认是15秒。
  • 将本微服务状态设置为shutting down. 处于这个状态的微服务,在收到新的请求的时候,会拒绝请求,返回503。并等待 一段时间让正在处理的请求处理完毕。等待时间通过 spring.cloud.servicecomb.context.waitTimeForShutDownInMillis 配置,默认是3秒。
  • 执行Spring Boot的注销过程,比如停止容器、销毁bean等。

如果通过容器部署应用,需要保证优雅停止逻辑被正常执行,参考案例

客户端重试

客户端重试的主要目的是在请求返回503的情况下重试。 详细参考客户端重试

客户端熔断

客户端熔断的主要目的是快速移除下线的实例。详细参考客户端熔断

规划路由

更加高级的无损升级方案包括合理的规划路由,一般需要结合部署工具使用。比如在执行升级前,先配置 路由,将需要下线的实例的流量转移到其他实例,然后再下线该实例。 详细参考路由管理

状态检测

对于接收外部流量的微服务,如果微服务启动未就绪,外部流量就进来了,那么必然导致请求失败。应该避免 将请求转发到未就绪的微服务上面。 Spring Cloud Huawei的注册发生在所有Spring Bean加载完成 以后,未就绪之前,其他微服务无法发现实例,可以避免内部流量的失败。

对于需要检测就绪状态的场景,可以引入 spring-cloud-starter-huawei-actuator 模块。该模块 扩展了actuator的liveness和readiness, 默认在服务注册成功后才返回true。配置详情可以参考 滚动升级.

关于无损升级的讨论

上述无损升级措施都是互补的。 很多情况下,只需要保证优雅停机就能够保证无损升级。 建议搭配优雅停机、 客户端熔断和客户端容错机制。

servicecomb:
  matchGroup:
    AllOperation: |
      matches:
        - apiPath:
            prefix: "/"
  retry:
    AllOperation: |
      maxAttempts: 3
      retryOnSame: 1
  instanceIsolation:
    AllOperation: |
      minimumNumberOfCalls: 5
      slidingWindowSize: 10
      slidingWindowType: COUNT_BASED
      failureRateThreshold: 20

无损升级需要保证在停止微服务实例的过程中,现存的实例能够处理当前的业务流量,如果业务流量超过 负载,那么请求还是可能会失败。 更高级的策略还需要通过路由策略控制新上线的实例的请求比例, 因为新上线的实例需要初始化,突发的流量更容易导致失败和超时。

Clone this wiki locally