在应用更新发布,尤其是业务并发请求量级较大的情况下,通常存在因前置服务提供方节点下线,导致部分在途请求异常的场景。延迟下线机制,即当服务实例预计触发下线操作时,尽量闭环在途请求后,再进行实际下线操作。本文介绍如何在微服务引擎实现服务的延迟下线。
服务延迟下线的主要步骤如下。
已创建同步任务,将目标服务同步至微服务引擎。操作详情参见 创建同步任务。
微服务引擎将延迟下线功能集成至应用接入的过程中,在应用接入向导中选中 延迟下线,接入的应用即具备延迟下线的能力。
服务提供方进行反注册,注销该实例的注册中心。
说明
preStop
参数。readiness
机制。无损下线插件会对 Spring 的 ContextClosedEvent
事件进行监听,当监听到 ContextClosedEvent
事件后,会主动通知实例进行下线。在容器场景利用 Kubernetes 提供的 preStop
机制,配合延迟下线 API 使用,可以实现流量的无损下线。如下示例代码所示,仅需在 Kubernetes 的 preStop
机制中添加 MSE Agent API 指令 curl http://127.0.0.1:17000/lossless/deregister
。
改造前
lifecycle: preStop: exec: command: - /bin/sh - -c
改造后
lifecycle: preStop: exec: command: - /bin/sh - -c - "curl http://127.0.0.1:17000/lossless/deregister"
应用接入时,在 接入指引 > 配置服务信息 > 高级配置 中,选中 延迟下线。应用接入操作详情参见 接入 Java 应用。
将 配置 Deployment 中接入服务所需的配置信息,添加至服务对应的 Deployment 中。配置信息示例如下。
spec: template: metadata: annotations: sidecar.mesh.io/prestop-timeout: "5000" labels: sidecar.mesh.io/data-plane-mode: "java_proxyless" sidecar.mesh.io/lane: "mse-base" sidecar.mesh.io/mse-namespace: "test-public-test"
类型 | 参数 | 说明 | 示例值 |
---|---|---|---|
annotations | sidecar.mesh.io/prestop-timeout | 可选,开启延迟下线后支持。实例延迟下线的时长,单位为毫秒,支持根据实际业务情况调整时长。 | sidecar.mesh.io/prestop-timeout: "5000" |
labels | sidecar.mesh.io/data-plane-mode | 微服务引擎数据面组件。 | sidecar.mesh.io/data-plane-mode: "java_proxyless" |
sidecar.mesh.io/lane | 服务所处泳道名称。 | sidecar.mesh.io/lane: "mse-base" | |
sidecar.mesh.io/mse-namespace | 服务所处 Nacos 命名空间的名称。 | sidecar.mesh.io/mse-namespace: "nacos-test-public-default-group" |