对于任何一个线上应用来说,发布、扩容、重启等操作不可避免。在应用启动各阶段,无损上线能提供相应的保护能力,包括服务延迟注册、服务小流量预热、服务就绪检查三个功能。本文介绍MSE提供的无损上线功能。
无损上线功能概述
延迟注册
微服务提供者实例会在应用启动过程中,进行服务的注册。一旦完成服务注册,就可以被外部服务消费者应用订阅和调用。对于基于Spring框架开发的Java应用而言,注册过程一般发生在Spring上下文刷新完毕之后。如果应用有一些异步初始化逻辑还没有执行完毕,就直接进行服务注册,此时消费者前来调用时很可能会产生请求报错。比如大数据计算服务需要提前从OSS拉取几百兆数据,待数据拉取完成后才能对外提供服务。因此如果应用启动后直接注册服务,会导致流量因资源未就绪而报错。有了延迟注册功能之后,我们可以通过设置一定的延迟时间,将原本的服务注册动作往后推迟。让应用在充分初始化后再注册到注册中心对外提供服务。避免了微服务提供者未准备完毕,就被外部调用,产生调用出错的情况。
小流量预热
很多时候,刚启动的新实例会处于一种“冷机”状态。冷机状态下,需要进行比如连接池的懒加载、缓存预热、热点代码生成等操作,因此这些新实例对请求的处理能力会远远小于运行很久的实例。如果开发与运维人员不对这个过程进行干涉,可能会造成新实例上线这段时间内,系统整体平均RT时间变高。更坏的情况下,还可能会造成服务“夯”住,导致大量请求调用超时、报错的情况。
下图是需要进行资源加载的实例,在尚未完成资源加载的情况下,与资源加载完毕后的两次请求调用时长对比。在资源加载过程中,如果有大量请求到达该实例,可能都会发生阻塞:
小流量预热功能的思路是,在新服务实例刚上线的这段时间里,控制消费者应用对其调用的流量大小,来避免Java应用冷启动时请求处理能力差,系统整体RT变高的问题,并且保护新启动的服务实例不会被大流量击垮。进入该实例的流量会按一定规则随时间不断加大,当达到设置的预热时长时,小流量预热过程结束,实例正常接收流量。
小流量预热使用的是在线的消费者的流量,需要该服务实例的消费者应用也接入MSE服务治理,该功能的具体原理可参见小流量预热原理。
服务注册状态检查
K8s提供了就绪检查机制(Readiness Probe),在进行服务发布时,新实例就绪检测通过后,就会下线旧的实例(具体情况取决于设置的发布策略)。然而K8s无法感知微服务何时就绪,当端口启动时,K8s会认为应用已经就绪。这可能会导致刚启动的服务还未注册到注册中心,就被K8s判定为已经就绪,进而继续推进服务发布的动作,下线正在运行的旧实例。从而引发消费端调用出错,并在调用过程中出现service no provider/instance
等异常。
无损上线的服务就绪检查功能,通过Agent的无侵入方式为应用提供一个检测其是否完成注册的HTTP接口,如果未完成注册,则返回500状态码;当应用注册完成后,会返回200状态码。用户将应用的就绪检测配置成该接口后,可以帮助K8s判定应用是否就绪,保障K8s场景下服务发布上线过程中,服务消费者一直有可用的提供者,不会产生无提供者的报错。
使用无损上线
前提条件
注意事项
对于Spring Cloud应用,当前仅支持利用Nacos、ZooKeeper以及Eureka这三种类型的注册中心构建的应用进行服务预热。
Spring Cloud服务预热功能是基于Spring Cloud框架默认的
ZoneAwareLoadBalancer
、RoundRobinLoadBalancer
或RandomLoadBalancer
负载均衡器实现的,如果应用本身修改了该配置,会导致服务预热功能失效。服务预热需要提供者、消费者都接入MSE服务治理才能生效。比如网关应用,是通过直接对外暴露 API的方式接收外部流量,因此MSE当前的小流量预热功能对此类应用不生效。
使用方式
步骤一:开启无损上线
登录MSE治理中心控制台,并在顶部菜单栏选择地域。
在左侧导航栏,选择 ,然后单击目标应用的资源量卡片。
在目标应用详情页面的左侧导航栏,单击流量治理,然后选择无损上下线页签。
在无损上线模块,单击无损上线右侧开关按钮,开启无损上线。
步骤二:配置k8s服务就绪检查
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面单击目标集群,在左侧导航栏选择工作负载 > 无状态,单击部署的应用操作列下的编辑,在健康检查栏处,单击就绪检查右侧的开启,并配置如下参数。完成后单击更新。
路径:/health。
端口:55199。
延迟探测时间(秒):推荐该值的配置大于应用启动所需时间 + 无损上线功能模块中配置的延迟注册时间(默认0秒)二者之和,如果您不按照该建议进行配置,不会影响功能正常使用。
其他参数,请参见创建无状态工作负载Deployment,应用重启后,通过就绪检查前完成服务注册即可生效。
该操作会直接引起应用的重启,如果是生产环境,建议您挑选发布窗口执行该操作!
(可选步骤)配置延迟注册时长
请根据业务场景需要决定是否配置(详情见延迟注册),操作步骤如下:
根据步骤一、二进入无损上线功能页面,开启无损上线功能,并配置K8s服务就绪检查。
在无损上线模块,单击延迟注册时长(秒)右侧的编辑按钮,设置延迟注册时长,完成配置后单击。
设置完毕后,在下一次应用启动时,延迟注册时长才会生效。
(可选步骤)调整小流量预热时长
开启无损上线后,该功能会自动开启。默认预热时长为120秒。请根据业务场景需要开启:
根据步骤一、二进入无损上线功能页面,开启无损上线功能,并配置K8s服务就绪检查。
在无损上线模块,点击高级选项按钮,单击小流量预热时长(秒)右侧的编辑按钮调整时长,完成配置后单击。
设置完毕后,在下一次应用启动时,调整后的小流量预热时长才会生效。
小流量预热方法通过在服务消费端根据各个服务提供者实例的启动时间计算权重,结合负载均衡算法,控制刚启动应用流量随启动时间逐渐递增到正常水平的过程,帮助刚启动运行的服务进行预热。同时这也要求了服务消费者也接MSE服务治理。
建议您在首次使用无损上线的小流量预热功能时,使用默认的预热时长即可。如果在使用默认值预热服务的过程中发现预热效果不明显,出现流量损失,再通过调节该参数进行优化。
为了保证预热充分,建议您参考小流量预热最佳实践。
无损上线观测
经过上述配置后,可以在无损上下线功能页面,看到开启无损上线后应用发生的事件,以及同时期该实例的QPS曲线:
登录MSE治理中心控制台,并在顶部菜单栏选择地域。
在左侧导航栏,选择 ,然后单击目标应用的资源量卡片。
在目标应用详情页面的左侧导航栏,单击流量治理,然后选择无损上下线页签。
您可以看到,应用先后会出现服务注册、开始预热、预热结束这几个事件,并且K8s Readines检查通过的事件也发生在服务注册事件之后。QPS曲线是在预热时长内(默认 120s)逐步上升到最大值,而不是直接陡升上去。如果您的应用在上线时,事件顺序、QPS曲线形状不符合预期,可以参考FAQ来解决。
示例图中的应用, 其K8s就绪检测已经配置成55199/health
,并且将最小准备时间(minReadySeconds)配置成120秒,和默认的预热时长一致。