应用发布时,通过固定时长的延迟注册来等待业务初始化,可能因时长设置不当导致发布效率降低或业务错误。无损上线条件注册功能通过代码在业务逻辑确认就绪后触发服务注册。此方式可精确控制服务注册时机,确保服务在就绪后接收流量,避免不必要的发布等待。
背景信息
在存在异步初始化或资源加载的场景中,通常采用固定延迟时间后再进行微服务注册(即MSE服务治理提供的无损上线能力之一),以避免应用未完成初始化即对外提供服务,导致调用方请求失败。该方式实现简单,可有效缓解大多数情况下因服务未就绪而引发的调用异常。
然而,在部分复杂场景中,固定时长延迟注册可能存在精度不足或适应性差的问题。若明确当前业务无法通过固定延迟满足注册时机控制需求,可参考后续章节了解基于条件触发的注册机制。
此功能需要在业务代码中增加设置系统属性的逻辑,建议提前评估业务改造成本。对于初次使用MSE无损上下线功能的用户,建议优先使用固定延迟注册方案,其已覆盖绝大多数典型应用场景。
该功能目前公测中,需要使用4.6.0版本Agent才可使用,该探针版本处于灰度测试阶段。指定探针版本的方法请参考:指定MSE探针版本。
工作原理
MSE Agent探针会持续轮询监听一个在启动参数或环境变量中的参数。当应用完成自定义的初始化逻辑后,通过代码将该参数的值设置为true。探针检测到该条件满足后,执行微服务注册。
若配合Kubernetes的就绪检查(Readiness Probe),应用的启动和上线流程如下:
Pod启动 → 容器内应用开始业务初始化 → 业务就绪,代码设置条件达成 → 探针发起微服务注册 → 微服务注册成功,开始接收微服务流量 → K8s 就绪检查通过 → Pod状态变为Ready。
操作步骤
步骤一:在启动参数中启用条件注册
在应用的启动参数或环境变量中,添加以下配置,声明用于条件注册的系统属性键(Key)。
配置格式:
mse_lossless_register_condition_on_system_property_true="YOUR_CONDITION_KEY"配置示例:
# 使用自定义的系统属性键 PRODUCT_PRELOAD_COMPLETED 值为 true 作为注册条件 mse_lossless_register_condition_on_system_property_true="PRODUCT_PRELOAD_COMPLETED"
步骤二:改造业务代码以设置就绪条件
在应用完成所有必要的初始化逻辑后,通过代码设置上一步中定义的系统属性键,并将其值设为true。
以下代码演示了一个异步加载商品缓存的场景。当缓存加载完成后,通过System.setProperty方法设置就绪条件,从而触发服务注册。
@Component
public class HotProductInitComponent {
public ScheduledExecutorService executor = Executors.newScheduledThreadPool(
1,
new NameThreadFactory("product-preload-pool"));
@Value("${demo.product.init.delay.seconds:3}")
public long initDelaySeconds;
public void asyncLoadPoductDataIntoCache() {
executor.schedule(() -> {
// ...
// ********** 新增代码开始 **********
System.setProperty("PRODUCT_PRELOAD_COMPLETED", "true");
// ********** 新增代码结束 **********
}, initDelaySeconds, TimeUnit.SECONDS);
}
}注意事项
该功能支持和 55199/readiness 就绪检查配合使用。
启用条件注册后,无需再配置无损上线的延迟注册功能。在启动参数或环境变量中配置
mse_lossless_register_condition_on_system_property_true后,该功能自动生效,无需打开无损上线功能按钮。