Skip to content
Charles Shao
Go back

Dubbo 深挖 · 注册中心、服务发现与元数据

views

前一篇立了地基:Dubbo 的三角角色、分层与一次调用路径。Cluster 要挑人,前提是 Directory 里的地址列表是对的——列表从哪来、多久更新、空了怎么办、大块元数据要不要跟地址一起推,就是本篇的主题。

通用发现模型见服务注册与发现深挖;这里聚焦 Dubbo 视角:订阅模型、推空保护、应用级发现与元数据中心,以及广告集群滚动发布时最常见的「僵尸实例」坑。

本文是 Dubbo 深挖系列的第 2 篇。 系列顺序:① 架构开篇;② 注册中心、服务发现与元数据(本篇);③ Cluster 容错与负载均衡;④ 协议与 Triple;⑤ 流量治理

一句话定位:注册中心负责「此刻谁还活着」;元数据中心负责「接口长什么样」;配置中心负责「策略怎么变」——三者拆开后,地址推送才能又快又稳。

TL;DR

Table of contents

Open Table of contents

1. 订阅与通知:地址如何进到 Directory

Dubbo 订阅与通知时序。Provider 启动后向 Registry register;Consumer 启动后 subscribe,Registry 推送全量/增量地址;Provider 下线时 unregister 或会话过期,Registry 再通知 Consumer 更新 Directory。旁注:热路径 RPC 不经过 Registry。

经典路径:

  1. Provider register(含接口、group、version、权重、应用名等);
  2. Consumer subscribe 同一服务键;
  3. Registry notify 全量或增量地址列表;
  4. Consumer 侧 RegistryDirectory(或应用级 Directory)更新 Invoker 列表,供 Cluster 使用。

服务键要一致:group/interface:version(具体格式随版本略有差异)。group 或 version 对不上,表现就是「注册中心明明有服务,Consumer 却 No provider」——排障第一眼查三元组,而不是怀疑注册中心挂了。

2. 接口级发现 vs 应用级发现

模式注册什么优点代价
接口级(经典)每个服务接口一条(或一组)地址映射模型直观、按接口订阅接口多、实例多时注册中心压力大
应用级(2.7+ 推)先按应用/实例发现,再拉服务元数据注册量下降、更贴云原生多一跳元数据获取,心智稍复杂

大规模广告中台(成百接口 × 成千实例)更该认真评估应用级发现 + 元数据中心;小集群接口级仍然好懂、好排障。

3. 注册中心选型直觉(Dubbo 场景)

组件一致性倾向Dubbo 场景直觉
ZooKeeper偏 CP老牌、临时节点会话模型清晰;写路径与运维成本更高
Nacos可 AP/CP 取舍国内 Java 栈常见,发现+配置一体,推空/权重友好
Redis 等视用法某些部署图省事;要自己补齐健康与通知语义

选型不是信仰问题:看团队现有运维能力、多机房模型、是否已有 Nacos/ZK。机制细节(Watch、Lease、健康检查)仍以通用发现篇ZK/etcd 篇为准。

4. 推空保护与本地缓存

这是 Dubbo 生产里最值钱的两道闸:

4.1 推空保护

当注册中心抖动、权限配置错误或订阅条件写错时,可能推下来空列表。若 Consumer 用空列表覆盖内存中的健康列表,结果是:

所有 Invoker 被清空 → 立刻大量失败 → 比「部分实例不健康」致命得多。

正确策略:空推送拒绝覆盖(或可配置严格模式仅在确认「服务已下线」时清空)。排障时若突然全集群 No provider,先问「是不是被空列表刷了」。

4.2 本地文件缓存

Consumer 常把最近一次成功的地址列表落盘。作用:

广告竞价链路可以接受「偶发打到僵尸再 Failover/快速失败」,往往不能接受「缓存被清空后的全站失败」。

5. 元数据中心与配置中心为什么要拆

地址、元数据、配置三中心拆分示意图。左:Registry 只推 ip:port + 轻量参数;中:Metadata 存接口方法签名与类型描述;右:Config 推超时/路由/开关。Consumer 启动时分别拉取/订阅,运行期地址变更最频繁。

早期「全能注册中心」把接口完整描述塞进节点,会导致:

拆分后:

6. 实例生命周期与优雅上下线

和通用发现篇同一铁律,落到 Dubbo 操作清单:

上线

  1. 进程启动、端口 listen、线程池就绪;
  2. export / register
  3. 就绪探针通过后才接流量(K8s 场景对齐 readiness)。

下线

  1. unregister / 摘流量(注册中心 + 必要时主动通知);
  2. 等待 Consumer 刷新(或固定 sleep 覆盖缓存 TTL);
  3. 排空 in-flight(停新请求、等旧请求结束);
  4. 关端口、停进程。

反序——先杀进程再指望会话超时摘除——等于把健康检查延迟内的流量送进黑洞。下一篇 Cluster 再狠,也救不回「列表里是死人」。

7. 多机房 / 单元化需要的元数据

发现不只是 IP 列表。路由与就近依赖标签,例如:

没有标签,路由规则就没有燃料;标签乱写,则会「看起来有实例,路由后为空」。

8. 生产反模式

9. 常见误解 ↔ 正解

常见误解正解
注册中心挂了 RPC 全停热路径直连;有缓存仍可能短期可用
No provider = 注册中心坏了更常见是 group/version/订阅条件不一致或被空列表清空
发现等于负载均衡发现只提供候选人;LB/路由在 Cluster 层
元数据中心可有可无大规模与应用级发现下它是减负关键件
下线等 ZK 会话超时就行对竞价链路太慢,必须主动摘注册

10. 速查表

地址列表可靠之后,下一篇讲 Cluster 如何在这份列表上挑人、容错、按规则裁剪——Cluster 容错、负载均衡与路由


延伸阅读

本系列内部串读:

相关:

一手资料:


views
Share this post on:

Previous Post
Dubbo 深挖 · Cluster 容错、负载均衡与路由
Next Post
Dubbo 深挖(开篇)· 架构全景、SPI 与一次调用全链路