默认情况下服务的注册与剔除机制是什么样子的?是在什么时间节点注册和剔除的?
2 个回答
快乐出现的时候,就好好享受快乐。阿石默认情况下,以Spring Cloud体系为例(如Eureka、Nacos、Consul),服务的注册与剔除机制如下: ## 一、默认的服务注册机制 - **注册时机**: 默认在微服务启动完成后,通过`SmartLifecycle`接口实现类`AutoServiceRegistration`的`start()`方法进行自动服务注册。 - **具体节点**: Spring容器刷新完成后,调用`AutoServiceRegistration#start()`自动向注册中心注册自身实例。 **流程**: ``` SpringBoot启动 ↓ 容器初始化完成(ApplicationContext刷新完成) ↓ AutoServiceRegistration自动调用start()方法 ↓ 向注册中心注册当前实例 ``` **源码参考(Spring Cloud Commons):** ```java public class AutoServiceRegistration implements SmartLifecycle { @Override public void start() { if (!running.get()) { register(); // 此时完成注册 running.set(true); } } } ``` ## 二、默认的服务剔除机制 默认情况下服务剔除分两种情况: ### (1)正常关机时(Graceful Shutdown) - **触发时机**: Spring应用在停止(关闭JVM)时,会触发容器关闭事件,调用`stop()`方法主动注销服务。 - **具体节点**: `AutoServiceRegistration`监听Spring生命周期的停止事件`stop()`方法,会调用注销方法`deregister()`主动从注册中心注销。 **流程**: ``` JVM关闭信号(SIGTERM) ↓ Spring容器触发 ContextClosedEvent 事件 ↓ AutoServiceRegistration.stop() ↓ 主动从注册中心注销实例 ``` **源码参考:** ```java public class AutoServiceRegistration implements SmartLifecycle { @Override public void stop() { if (running.get()) { deregister(); // 此时主动剔除 running.set(false); } } } ``` ### (2)异常宕机或非正常关闭时(心跳超时) - **触发时机**: 服务实例异常宕机(如崩溃或强制杀死进程),不能主动注销。 - **具体节点**: 注册中心通过定期的心跳检测发现实例失联(超过`leaseExpirationDurationInSeconds`等参数设置),主动将该服务实例剔除。 **默认流程(如Eureka为例)**: ``` 服务实例宕机或心跳停止 ↓ 注册中心等待一定时间(如90秒默认超时时间) ↓ 超过心跳超时时间后 ↓ 注册中心主动剔除实例 ``` ## 三、总结默认机制 | 场景 | 默认机制 | 触发节点 | 备注 | |---------------|-------------------------|----------------------------|----------------------------| | 服务注册 | 自动注册 | Spring容器刷新完成后 | Spring Cloud自动处理 | | 正常下线 | 主动注销 | Spring Context关闭事件 | JVM正常关闭或主动关闭 | | 异常宕机 | 心跳超时剔除 | 注册中心心跳检测超时 | 默认90秒(Eureka)或可自定义| 默认机制在服务启动后自动注册,在关闭时主动注销,并提供心跳机制兜底异常宕机场景,确保注册中心服务实例状态准确。发布于 2025-03-17 21:03 •IP属地 黑龙江举报评论收藏
杯中之物从来不能消愁补过格列柯南Dubbo 默认的服务注册与剔除机制具体如下: ## 一、Dubbo 默认的注册机制 **Dubbo**默认服务注册节点是在服务启动完成后,具体为: - Dubbo容器启动时: 1. 启动Spring容器; 2. 扫描并解析带有`@DubboService`注解的服务; 3. 服务暴露时(`ServiceBean` 的 `export()` 方法执行时)完成服务注册。 具体步骤如下: ```text Spring容器启动完成(容器初始化完成) ↓ Dubbo服务实例初始化(@DubboService解析) ↓ ServiceBean.export()服务暴露 ↓ 调用RegistryProtocol向注册中心注册(如Zookeeper、Nacos) ``` ## 二、Dubbo默认的服务剔除机制 Dubbo服务剔除机制主要包含两种情况: ### (1)正常关闭场景: - 服务正常关闭时,Dubbo容器监听Spring容器的关闭事件,主动调用服务的销毁方法,向注册中心发起注销请求。 具体流程: ```text Spring容器关闭(ContextClosedEvent) ↓ Dubbo监听到关闭事件 ↓ ServiceBean.destroy()方法被调用 ↓ 向注册中心主动注销服务 ``` 对应源码核心位置: ```java // ServiceBean.java @Override public void destroy() throws Exception { if (exported) { unexport(); // 停止服务暴露 unregister(); // 主动从注册中心注销服务 } } ``` ### (2)异常宕机场景: - 如果服务意外宕机或未正常执行注销逻辑,Dubbo默认使用注册中心的**临时节点机制**(如Zookeeper的临时节点)自动感知服务实例宕机。 具体流程: ```text Dubbo Provider注册到注册中心(Zookeeper为例) ↓ 在注册中心临时节点(ephemeral node)维护服务实例信息 ↓ 服务意外宕机(进程杀死、断电、网络中断) ↓ 注册中心自动感知临时节点连接断开(ZooKeeper为会话超时机制) ↓ 自动从服务列表移除实例 ``` - **关键点**:Dubbo 默认使用临时节点(Ephemeral节点)来保证服务异常下线能够自动被感知和移除。 ## Dubbo 默认机制总结: | 场景 | 默认机制 | 触发节点 | 备注 | |-----------|--------------------|---------------------------|------------------------------------| | 服务注册 | 自动注册服务到注册中心 | 服务暴露时(export阶段) | `ServiceBean.export()`方法 | | 正常剔除 | 主动注销服务 | Spring容器关闭时 | `ServiceBean.unexport()`方法 | | 异常剔除 | 注册中心自动剔除 | 注册中心会话超时后 | Zookeeper或其他注册中心临时节点机制 | ## Dubbo vs Spring Cloud的区别总结: | 特性 | Dubbo | Spring Cloud | |----------|-------------------------------------|----------------------------------| | 注册机制 | 服务暴露时注册 | 容器初始化完成自动注册 | | 主动剔除 | Spring容器关闭时主动注销 | Spring容器关闭时主动注销 | | 被动剔除 | 注册中心临时节点机制自动剔除 | 注册中心心跳超时机制被动剔除 | Dubbo更依赖服务暴露过程,使用临时节点进行异常场景兜底,区别于Spring Cloud依赖心跳机制。发布于 2025-03-16 10:41 •IP属地 福建举报评论收藏
公众号进入网站体验更佳

