Eureka、Nacos、Zookeeper 优雅上下线机制
✅ 三大注册中心优雅上下线机制对比
维度 | Eureka | Nacos | Zookeeper |
---|---|---|---|
注册方式 | 客户端注册 + 心跳维持 | 客户端注册 + 心跳维持 | 客户端创建临时节点 |
服务可用状态控制 | STARTING 、UP 、DOWN 、OUT_OF_SERVICE | UP 、DOWN 、STARTING 等 | 无显式状态标识,靠节点存在与否判定 |
上线控制方式 | 通过 HealthIndicator 控制状态为 UP | 同 Eureka,可配合 Spring Boot Health 指标 | 延迟注册临时节点以实现上线控制 |
下线通知方式 | 设置状态为 DOWN ,延迟销毁 | 删除实例或设置为 DOWN ,配合 @PreDestroy | 主动删除节点或断开会话 |
自动剔除 | 心跳超时(默认90s) | 心跳超时(默认30s) | 会话断开即剔除 |
健康检查支持 | 内置健康检查整合 Spring Boot Actuator | 内置健康检查整合 Spring Boot Actuator | 无内置健康检查机制 |
与 K8s 的配合 | 可结合 preStop 调用自定义接口实现 | 配合 preStop + /actuator/service-down | 延迟 preStop + 删除临时节点 |
🧠 一、Eureka 优雅上下线详解
✅ 优雅上线
-
服务启动时,先处于
STARTING
-
等缓存、RPC 初始化完成后标记为
UP
@PostConstruct
public void afterInit() {ApplicationInfoManager.getInstance().setInstanceStatus(InstanceInfo.InstanceStatus.UP);
}
✅ 优雅下线
@PreDestroy
public void shutdown() {// 设置为 DOWN 状态,让其他服务停止访问ApplicationInfoManager.getInstance().setInstanceStatus(InstanceInfo.InstanceStatus.DOWN);Thread.sleep(10000); // 等待请求处理完毕
}
🧠 二、Nacos 优雅上下线详解
✅ 优雅上线
-
服务默认通过心跳注册,但只有健康检查返回
UP
才真正生效
@Component
public class MyHealthIndicator implements HealthIndicator {private volatile boolean ready = false;public void setReady(boolean ready) { this.ready = ready; }public Health health() {return ready ? Health.up().build() : Health.down().build();}
}
✅ 优雅下线
-
手动设置为
DOWN
@PreDestroy
public void shutdown() {healthIndicator.setReady(false);Thread.sleep(10000); // 等待请求处理完
}
-
REST API 下线实例:
curl -X DELETE 'http://nacos:8848/nacos/v1/ns/instance?serviceName=my-service&ip=127.0.0.1&port=8080'
🧠 三、Zookeeper 优雅上下线详解
✅ 优雅上线
-
延迟注册临时节点,等服务准备好再注册
zkClient.create().withMode(CreateMode.EPHEMERAL).forPath("/service/order/instance-id", data);
✅ 优雅下线
-
主动删除临时节点
zkClient.delete().forPath("/service/order/instance-id");
-
或通过
@PreDestroy
:
@PreDestroy
public void shutdown() {// 先通知业务不可用// 删除注册节点Thread.sleep(5000);
}
📌 四、实际项目中如何选型和应用?
场景 | 推荐注册中心 | 原因说明 |
---|---|---|
Spring Cloud 微服务 | Eureka / Nacos | 与 Spring Boot 集成度高,支持健康检查 |
多语言、多平台系统 | Nacos / ZK | Nacos 支持 REST/HTTP;ZK 跨平台但需 Curator 等客户端 |
服务上下线频繁、需强一致性 | Zookeeper | 临时节点机制更稳定 |
配合 Kubernetes 自动上下线 | Nacos | 可通过 /actuator + preStop 实现平滑控制 |
🧪 五、面试场景答题模板(含口诀)
面试题:你们服务上下线是怎么做的?
答题模板:
我们使用的是 Spring Cloud + Nacos 架构。服务启动时,会优先加载缓存、RPC 客户端、配置等,然后通过 Spring Boot 的 HealthIndicator
标记为 UP
,实现上线控制。下线时,通过 @PreDestroy
把状态标记为 DOWN
,并等待 10 秒确保请求处理完成,配合 Kubernetes 的 preStop
生命周期钩子做到了真正意义上的服务优雅下线。在非 Spring Cloud 的系统中,我们也采用过 Zookeeper 注册机制,通过临时节点控制服务上下线生命周期,结合 Curator 管理服务状态。
🎯 六、记忆口诀
🧘 上线三步骤:
1)缓存预热;
2)健康探测;
3)标记为 UP;🧘 下线三守则:
1)标记为 DOWN;
2)延时摘除;
3)资源释放;🌐 各有千秋:
Eureka 内建状态强;
Nacos 接口好扩展;
Zookeeper 临时节点最稳。