心跳自动续期是注册中心维持服务实例在线状态的核心机制,本质是客户端定期“报活”,服务端据此刷新存活时间戳;客户端按固定间隔(如nacos 5秒、eureka 30秒)发送轻量心跳包,服务端快速更新lastheartbeattime并重置健康标记;过期清理任务异步执行,超时未心跳则标记不健康或物理删除;续期失败时依赖自我保护、最终一致性及客户端本地缓存兜底。

心跳自动续期是注册中心维持服务实例在线状态的核心机制,本质是客户端定期“报活”,服务端据此刷新存活时间戳,避免误剔除。
客户端定时发起心跳请求
服务启动后,客户端会立即创建一个后台定时任务,按固定间隔(如 Nacos 默认 5 秒、Eureka 默认 30 秒)向注册中心发送心跳包。这个任务通常由独立线程池执行,与主业务逻辑隔离。
- 心跳内容极轻量,一般只含服务名、实例 ID、IP、端口等标识字段,不携带完整元数据
- 请求地址通常是专用接口,例如 Nacos 的 /instance/beat,Eureka 的 /apps/{app}/{id}
- 部分注册中心(如 Nacos 2.x)支持服务端动态返回下次心跳间隔,实现自适应节流
服务端接收并更新实例状态
注册中心收到心跳后,不做复杂校验,仅快速更新该实例在内存注册表中的最后心跳时间(lastHeartBeatTime),并重置其健康标记为 true。
- 更新操作必须是原子的,常配合读写锁或 CAS 保证并发安全
- 对于临时实例,此动作直接阻止其被后续的“过期清理”任务剔除
- 若实例此前处于不健康状态(如网络抖动导致短暂失联),一次成功心跳即可恢复可用
服务端异步执行过期清理
注册中心另启一个独立定时任务(如 Eureka 每 60 秒、Nacos 每 5 秒检查一次),遍历所有实例,比对当前时间与 lastHeartBeatTime。
- 超过“健康宽限期”(如 Nacos 15 秒、Eureka 90 秒)未心跳 → 标记为不健康,客户端查询时不再返回
- 超过“彻底下线阈值”(如 Nacos 30 秒、Eureka 90 秒)未心跳 → 从注册表中物理删除,并触发变更通知
- 该清理过程与心跳接收完全解耦,避免阻塞实时续约路径
续期失败的兜底处理
心跳不是万能的。当网络分区或客户端崩溃时,续期必然中断。此时依赖注册中心自身的容错设计:
- 自我保护模式(Eureka/Discovery):在短时大量实例失联时,暂停清理,防止雪崩式下线
- 最终一致性(Discovery):允许节点间短暂状态不一致,靠后台同步修复
- 客户端本地缓存+定时拉取:即使心跳中断,消费者仍可基于本地缓存继续调用,同时定期拉取全量/增量列表更新











