跳到主要内容
📖 本章预览

本章为预览版本,展示部分核心内容。完整内容包含详细源码解析、实战代码和面试要点,加入知识星球即可解锁全部章节。

第七章:Naming 健康检查机制

健康检查机制

7.1 两套健康检查机制

Nacos 的健康检查分为两大类,对应两种实例类型:

实例类型检查方式触发方适用场景
临时实例(2.x)gRPC 连接即心跳连接层自动管理gRPC SDK 客户端
临时实例(1.x 兼容)HTTP 心跳上报客户端定时发送HTTP 旧版客户端
持久实例服务端主动探测服务端定时执行数据库、中间件等

7.2 临时实例——gRPC 连接即心跳(2.x 主力)

2.x 架构下,临时实例的健康检查极其简洁:gRPC 连接活着 = 实例健康,连接断了 = 实例摘除

客户端 SDK ←── gRPC 长连接 ──→ Nacos Server

├── 连接正常 → 实例健康

└── 连接断开 → ConnectionManager.unregister()
→ 通知 ClientManager
→ 销毁 Client 对象
→ 所有实例自动摘除

不需要额外的心跳线程、不需要超时检测。gRPC 框架自带的 keepalive 机制保证了连接的活性检测。

7.3 临时实例——HTTP 心跳检查(1.x 兼容)

对于通过 HTTP 注册的旧版客户端(IpPortBasedClient),仍然需要传统的心跳检查。

7.3.1 ClientBeatCheckTaskV2——入口

public class ClientBeatCheckTaskV2 extends AbstractExecuteTask {
private final IpPortBasedClient client;
private final InstanceBeatCheckTaskInterceptorChain interceptorChain;

@Override
public void doHealthCheck() {
Collection<Service> services = client.getAllPublishedService();
for (Service each : services) {
HealthCheckInstancePublishInfo instance =
(HealthCheckInstancePublishInfo) client.getInstancePublishInfo(each);
interceptorChain.doInterceptor(
new InstanceBeatCheckTask(client, each, instance));
}
}
}

7.3.2 拦截器链——层层过滤

InstanceBeatCheckTaskInterceptorChain

├── InstanceBeatCheckResponsibleInterceptor
│ 问:这个实例归我管吗?(Distro 分片)
│ hash(clientId) % nodeCount == myIndex → 归我管,继续

├── InstanceEnableBeatCheckInterceptor
│ 问:这个实例启用了心跳检查吗?

├── ServiceEnableBeatCheckInterceptor
│ 问:这个服务启用了心跳检查吗?

└── 通过所有拦截器后 → 执行实际检查

为什么需要 ResponsibleInterceptor? 假设集群有 3 个节点,通过 Distro 分片,每个实例只被一个节点检查,避免重复。


🔒 解锁完整内容

本章剩余内容需要解锁后查看

以上仅为本章部分预览内容,完整内容包含更多深度源码解析、实战代码和面试要点。

加入知识星球你将获得:

  • ✅ 全部 17 章完整内容 + 持续更新
  • ✅ 配套源码 + 实战项目
  • ✅ 一对一答疑 + 面试辅导
  • ✅ 简历优化 + 内推机会

📚 本章完整目录

以下为本章完整目录结构,加入知识星球即可解锁全部内容。

7.3.3 InstanceBeatCheckTask——实际检查

7.3.4 UnhealthyInstanceChecker——标记不健康

7.3.5 ExpiredInstanceChecker——摘除实例

7.4 持久实例——服务端主动探测

7.5 面试热点