对于任何一个线上应用,在服务更新部署等过程中,需要尽量保证客户端无感知,即从应用停止到重启恢复服务这个阶段不能影响正常的业务请求。在应用执行部署、停止、回滚、缩容和重置时,需要通过无损下线配置来保证应用正常关闭。本文介绍使用无损下线的注意事项、使用优势以及如何在控制台使用无损下线功能。
为什么需要无损下线
由于微服务应用自身调用特点,在高并发下,服务提供端应用实例的直接下线,会导致服务消费端应用实例无法实时感知下游提供者实例的实时状态,因而出现继续将请求转发到已下线的实例,从而出现请求报错,流量有损。
无损下线实现方案
提供者A在下线时,虽然会主动通知到注册中心,但此时消费者B可能无法实时感知到,导致消费者B继续调用已下线的提供者A。为了避免这种情况的发生,在提供者A接到下线命令即将下线前,对于在等待下线阶段收到的请求,在其返回值中都增加上特殊标记,让消费者B接收到返回值并识别到相关标志后主动拉取一次注册中心服务实例,从而实时感知提供者A最新状态,从而达到提供者A的下线状态能够被消费者B实时感知。此外,提供者A在下线时,还会等待一定的时间,以保证下线时已经收到的在途请求都被执行完毕,避免这些请求未被执行完毕,提供者A就已经停机。
当前应用只需要接入MSE,就会默认开启无损下线功能,但无损下线主动通知功能需要手动配置。同时MSE无损上下线功能提供可观测能力,帮助您判断应用是否无损下线成功。
无损下线观测
应用接入无损下线之后,在应用实例下线时,可以在应用治理界面观测到,下线实例的流量在很短时间内被清空,QPS数据很快降为0。
登录MSE治理中心控制台,并在顶部菜单栏选择地域。
在左侧导航栏,选择 ,然后单击目标应用的资源量卡片。
在目标应用详情页面的左侧导航栏,单击流量治理,然后选择无损上下线页签。
在当前页面的中间部分,可以看到最近一段时间内,该应用上下线过程中的发生的事件。在左侧查看节点处找到并单击最近发生下线的实例的“无损下线成功”事件,可以看到该事件发生时,流量会被快速清空。
如果观测到无损下线成功事件产生之后,QPS数据没有快速降为0,可以先确认是否存在本地调用等非来自于微服务请求调用的流量。
如何开启主动通知
什么是主动通知
主动通知是无损下线功能模块提供的一个进阶功能,默认关闭。一般情况下,MSE无损上下线提供的下线方案已经可以解决大部分场景下的问题。而当,待下线应用使用Spring Cloud框架时,在应用下线时发现有消费者调用出错的情况,可以尝试开启该功能来解决。开启后,提供者实例在下线阶段将会主动通知服务消费者,通知后,服务消费者将不再请求该提供者实例。
前提条件
注意事项
MSE治理中心暂不支持如下应用无损下线:
暂不支持非Java应用体系的无损下线。
暂不支持非WebFlux或SpringMVC应用的无损下线。
暂不支持消费端为非微服务应用的下游提供者应用的无损下线。
需要消费者端和提供端应用都接入MSE微服务治理,才能实现应用无损下线。
由于无损下线流程中需要等待一定的时间来保证下线示例在途中的请求都能执行完毕,K8s容器中的terminationGracePeriodSeconds
参数值(默认值 30)需要大于30,建议配置为90。如果您使用默认的30,可能会存在应用shutdownhook
无法正常执行完毕的情况,从而导致应用停机时一些资源无法正常关闭。
开启无损下线主动通知
登录MSE治理中心控制台,并在顶部菜单栏选择地域。
在左侧导航栏,选择 ,然后单击目标应用的资源量卡片。
在目标应用详情页面的左侧导航栏,单击流量治理,然后选择无损上下线页签。
在无损下线区域,打开主动通知开关。