对于任何一个线上应用,在服务更新部署过程中,需要尽量保证客户端无感知,即从应用停止到重启恢复服务这个阶段不能影响正常的业务请求。在应用执行部署、停止、回滚、缩容、重置时,需要通过无损下线的配置来保证应用正常关闭。本文介绍使用无损下线的注意事项、使用优势以及如何在控制台使用无损下线功能。
前提条件
注意事项
当前应用只需要接入MSE,就会默认开启无损下线功能,保护应用下线过程中的上游调用请求无损,因此您无需在MSE治理中心控制台做任何额外配置即可拥有无损下线功能。同时,MSE无损上下线功能提供可观测能力,帮助您判断应用是否无损下线成功。
MSE治理中心暂不支持如下应用无损下线:
暂不支持非WebFlux或SpringMVC应用的无损下线。
暂不支持消费端为非微服务应用的下游提供者应用的无损下线。
暂不支持非Java应用体系的无损下线。
需要消费者端和提供端应用都接入MSE微服务治理,才能实现应用无损下线。
K8s中容器的terminationGracePeriodSeconds参数值需要大于30,建议配置为90。
为什么需要无损下线
应用从停止到恢复服务期间很难保证不影响正常运行的消费者的业务请求。理想条件下,在整个服务没有请求时进行更新是安全可靠的。但实际情况下,无法保证在服务下线的同时没有任何调用请求。
传统的解决方式是通过将应用更新流程划分为手工摘除流量、停应用、更新重启三个步骤,由人工操作实现客户端对更新无感知。
如果在容器或框架级别提供某种自动化机制,自动摘除流量并确保处理完已到达的请求,不仅能保证业务不受更新影响,还可以极大地提升更新应用时的运维效率,这种机制就是无损下线。
MSE无损下线的优势
对于开源Spring Cloud可以通过shutdownHook、Spring Boot Actuator和Ribbon实现无损下线,不仅有一定的开发工作量,而且部分注册中心会导致短暂的流量损失。
对于开源Dubbo可以通过shutdownHook和QoS实现无损下线,不仅有一定的开发工作量,而且对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治理中心控制台,并在顶部菜单栏选择地域。
在左侧导航栏,选择 ,然后单击目标应用的资源量卡片。
在目标应用详情页面的左侧导航栏,单击流量治理,然后选择无损上下线页签。
在无损下线区域,打开主动通知开关。在提示信息对话框,单击确定。
开启主动通知后,实例在下线阶段将会主动通知消费者,且不再请求即将的下线的实例。