-
Notifications
You must be signed in to change notification settings - Fork 225
hitless upgrade
无损升级指微服务滚动升级、蓝绿发布、灰度升级等过程中,不出现业务中断。无损升级需要解决微服务实例 下线的及时感知、正在处理的请求的优雅停止等问题, 使用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
无损升级需要保证在停止微服务实例的过程中,现存的实例能够处理当前的业务流量,如果业务流量超过 负载,那么请求还是可能会失败。 更高级的策略还需要通过路由策略控制新上线的实例的请求比例, 因为新上线的实例需要初始化,突发的流量更容易导致失败和超时。
-
使用Spring Cloud Huawei功能
-
使用服务治理
-
生态集成
-
迁移改造问题
-
配置参考
-
优秀实践
-
常见问题