文档

无损上线

更新时间:

对于任何一个线上应用来说,发布、扩容、缩容、重启等操作不可避免。在应用启动各阶段,无损上线能提供相应的保护能力,具体功能包含服务延迟注册、服务就绪检查和服务小流量预热。本文介绍MSE提供的无损上线功能。

为什么需要无损上线

延迟加载是软件框架设计过程中最常见的⼀种策略,例如在Spring Cloud框架中Ribbon组件的拉取服务列表初始化,默认都是要等到服务的第一次调用时刻,例如下图是Spring Cloud应用中第一次和第二次通过RestTemplate调用远程服务的耗时对比情况:第一次调用由于进行了一些资源初始化,耗时是正常情况的数倍乃至数十倍之多。因此把新应用发布到线上直接处理大流量极易出现大量请求响应慢,资源阻塞,应用实例宕机的现象。

image.png

无损上线实现方案

针对上述应用无损上线场景,MSE提供服务延迟注册服务就绪检查服务小流量服务预热等一系列解决方案,不同解决方案针对不同应用场景。

image.png

如何应用无损上线

前提条件

注意事项

  • 对于Spring Cloud应用,当前仅支持利用Nacos、ZooKeeper以及Eureka这3种类型注册中心构建的应用进行服务预热。

  • Spring Cloud服务预热功能是基于Spring Cloud框架默认的ZoneAwareLoadBalancer负载均衡类实现的,如果应用本身修改了该配置,会导致服务预热功能失效。

  • 对于Dubbo应用来说,小流量预热能力会使用mse-loadbalance作为Dubbo负载均衡器,如果我们已经设置了Dubbo负载均衡器,那么需要取消设置,否则mse小流量预热能力不会生效。

  • 网关应用一般不通过注册中心调用,而是通过直接对外暴露API的方式调用,因此MSE当前所支持的小流量预热功能对此类应用不生效。

方案一:服务延迟注册

在某些场景下,服务启动后需要异步加载一些资源,比如大数据计算服务需要提前从OSS拉取几百兆数据,待数据拉取完成后才能对外提供服务。因此如果应用启动后直接注册服务,会导致流量因资源未就绪而报错。此时通过设置延迟注册,可让应用在充分初始化后再注册到注册中心对外提供服务,具体配置如下:

  1. 登录MSE治理中心控制台,并在顶部菜单栏选择地域。

  2. 在左侧导航栏,选择治理中心 > 应用治理,然后单击目标应用的资源量卡片。

  3. 在目标应用详情页面的左侧导航栏,单击流量治理,然后选择无损上下线页签。

  4. 无损上下线页面的无损上线区域,配置延迟注册时间(秒),设置范围为0~3600秒(即1小时),完成配置后单击图标3.png

    说明

    延迟注册时间(秒)大小请根据具体业务应用进行判断。

  5. 打开无损上线右侧的开关,并在提示信息对话框,单击确定

    应用重启后,延迟注册即可生效。

方案二:服务小流量预热

在较大流量下,刚启动的系统直接处理大量请求时,可能由于应用内部资源初始化不彻底从而出现请求阻塞、报错等问题。此时通过服务预热功能,在应用刚启动阶段通过小流量帮助应用在处理大量请求前完成初始化,可有效解决该类上线异常问题,具体配置如下:

  1. 登录MSE治理中心控制台,并在顶部菜单栏选择地域。

  2. 在左侧导航栏,选择治理中心 > 应用治理,然后单击目标应用的资源量卡片。

  3. 在目标应用详情页面的左侧导航栏,单击流量治理,然后选择无损上下线页签。

  4. 无损上下线页面的无损上线区域,单击预热时长(秒)右侧的图标2.png。在配置无损上线对话框,配置预热时长(秒),然后单击确定

    说明
    • 小流量预热方法通过在服务消费端根据各个服务提供者实例的启动时间计算权重,结合负载均衡算法,控制刚启动应用流量随启动时间逐渐递增到正常水平的这样一个过程,帮助刚启动运行的服务进行预热。

    • 预热时长:应用实例下一次启动的预热时间,默认预热时长为120秒。服务预热时长设置范围为0~86400秒(即24小时)。

    • 建议您在首次使用服务预热功能时,选择默认值。如果在使用默认值预热服务的过程中发现预热效果不明显,出现流量损失,可以通过调节该参数进行优化。

  5. 打开无损上线右侧的开关,并在提示信息对话框,单击确定

    说明
    • 需要服务提供者和服务消费者同时开启无损上线右侧的总开关,流量预热功能才会生效。

    • 服务预热开启后,待预热的应用将在预热周期内通过小流量实现应用启动过程的预热初始化。

    • 在可观测数据概览区域,您可以查看不同应用的无损上下线事件,支持通过应用结束时间过滤。

方案三:服务就绪检查

K8s就绪检查前完成服务注册

K8s提供就绪检查机制来对实例在就绪前进行健康检查,但K8s并不能感知微服务什么时候就绪,它一般会简单地认为端口起来了应用即处于就绪态,这样会造成刚启动的服务未完全注册到注册中心,旧的应用实例就被下线,导致消费端调用异常,在调用过程中出现service no provider异常。

微服务生命周期关联K8s就绪检查功能开启后,可通过Agent无侵入为应用提供一个检测其是否完成注册的端口,当应用注册完成返回200状态码,帮助K8s判定应用已就绪;未完成注册返回500,帮助K8s判定应用未就绪。具体配置如下:

  1. 登录MSE治理中心控制台,并在顶部菜单栏选择地域。

  2. 在左侧导航栏,选择治理中心 > 应用治理,然后单击目标应用的资源量卡片。

  3. 在目标应用详情页面的左侧导航栏,单击流量治理,然后选择无损上下线页签。

  4. 无损上线区域,配置延迟注册时间(秒)。单击高级设置,打开通过就绪检查前完成服务注册开关。

  5. 打开无损上线右侧的开关。

    该应用在下次重启时,服务注册就绪检查即可生效。

  6. 登录容器服务控制台,为目标应用配置就绪检查,完成后单击更新

    选中就绪检查右侧的开启,并配置如下参数。

    • 路径/health

    • 端口55199

    • 其他参数默认即可。

    image

    具体参数信息,请参见使用镜像快速创建无状态Deployment应用

    应用重启后,通过就绪检查前完成服务注册即可生效。

K8s就绪检查前完成服务预热

在一些复杂的线上场景,可以将应用是否预热完成作为K8s就绪检查通过的衡量指标,以此来保障应用的预热效果,即当应用服务预热完成后,K8s才将应用置为就绪状态。具体配置如下:

  1. 登录MSE治理中心控制台,并在顶部菜单栏选择地域。

  2. 在左侧导航栏,选择治理中心 > 应用治理,然后单击目标应用的资源量卡片。

  3. 在目标应用详情页面的左侧导航栏,单击流量治理,然后选择无损上下线页签。

  4. 无损上线区域,配置预热时长(秒)。单击高级设置,开启通过就绪检查前完成服务预热开关。

  5. 开启无损上线右侧的开关。

  6. 登录容器服务控制台,为目标应用配置就绪检查,完成后单击更新

    选中就绪检查右侧的开启,并配置如下参数。

    • 路径/health

    • 端口55199

    • 其他参数默认即可。image

    具体参数信息,请参见使用镜像快速创建无状态Deployment应用

    应用重启后,通过就绪检查前完成服务预热即可生效。具体效果如下图所示(就绪检查事件在服务预热结束之后发出)。服务预热

相关文档

  • 本页导读 (1)
文档反馈