📖 本章预览
本章为预览版本,展示部分核心内容。完整内容包含详细源码解析、实战代码和面试要点,加入知识星球即可解锁全部章节。
第十四章:全链路串讲 — 两条核心请求路径
前面章节分模块讲解了各个组件,本章将它们串联起来,完整走一遍两条最核心的请求路径。
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 章完整内容 + 持续更新
- ✅ 配套源码 + 实战项目
- ✅ 一对一答疑 + 面试辅导
- ✅ 简历优化 + 内推机会
📚 本章完整目录
以下为本章完整目录结构,加入知识星球即可解锁全部内容。