跳到主要内容
📖 本章预览

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

第十四章:全链路串讲 — 两条核心请求路径

前面章节分模块讲解了各个组件,本章将它们串联起来,完整走一遍两条最核心的请求路径。

14.1 路径一:配置发布全链路

【客户端】
ConfigService.publishConfig("app.yaml", "DEFAULT_GROUP", "server.port=8080")

NacosConfigGrpcClientProxy.requestToServer(ConfigPublishRequest)

【服务端 Node A】
ConfigPublishRequestHandler → ConfigOperationService.publishConfig()
├─① 写入 MySQL
├─② 发布 ConfigDataChangeEvent
│ ├─→ 本节点:DumpService.dump() → MD5 变更 → LocalDataChangeEvent
│ │ ├─→ RpcConfigChangeNotifier → gRPC 推送【2.x 主力】
│ │ └─→ LongPollingService → 唤醒 HTTP 客户端【1.x 兼容】
│ └─→ 集群:AsyncNotifyService → 通知 Node B/C
└─③ 返回成功

【服务端 Node B/C】
ConfigChangeClusterSyncRequestHandler → DumpService.dump()
→ MD5 变更 → 推送给本节点客户端

【客户端收到推送】
ConfigChangeNotifyRequest(只含 dataId+group+tenant)
→ 客户端主动拉取最新配置内容
→ 更新本地缓存 + 回调 Listener

关键设计:推送只通知"哪个配置变了",不传输配置内容。推保证实时性,拉保证可靠性。

14.2 路径二:服务注册全链路

【客户端】
NamingService.registerInstance("order-service", "192.168.1.100", 8080)

NamingGrpcClientProxy.requestToServer(InstanceRequest)

【服务端 Node A】
InstanceRequestHandler → EphemeralClientOperationServiceImpl.registerInstance()
├─① ServiceManager.getSingleton(service)
├─② ClientManager.getClient(connectionId)
├─③ client.addServiceInstance(service, instanceInfo)
│ → ClientChangedEvent → Distro 同步
└─④ ClientRegisterServiceEvent
→ ClientServiceIndexesManager 更新索引
→ ServiceChangedEvent → 推送给订阅者

【服务端 Node B/C】
DistroDataRequestHandler → 接收 Distro 同步数据
→ 更新本地 Client 数据 → 触发推送

14.3 两条路径的对比

维度配置发布服务注册
数据存储MySQL + 内存缓存纯内存
集群同步通知 Dump(各节点从 DB 读)Distro 直接传输数据
推送内容只推 groupKey(推拉结合)推送完整实例列表
一致性强一致(共享 DB)最终一致(AP)

🔒 解锁完整内容

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

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

加入知识星球你将获得:

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

📚 本章完整目录

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

14.4 面试热点