在很长一段时间里,只要提到 Dubbo 注册中心,大家第一反应几乎都是:
ZooKeeper。
这几乎是一个默认组合:
<pre data-start="255" data-end="280" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; visibility: visible;">
Dubbo + ZooKeeper
</pre>
但这几年,如果你再看新的微服务项目,情况明显变了:
<pre data-start="309" data-end="330" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; visibility: visible;">
Dubbo + Nacos
</pre>
甚至很多团队在做一件事:
把 ZooKeeper 迁移到 Nacos。
问题就来了:
ZooKeeper 用得好好的,为什么要换?
这背后其实反映了一个更大的变化:
微服务架构正在从“能用”走向“云原生”。
-****01-
**曾经的微服务基石 **
ZooKeeper 并不是一个专门的 服务注册中心。
它本质上是:
分布式协调系统。
ZooKeeper 最初诞生于 Hadoop 生态,用来解决分布式系统中的一些经典问题:
- 配置同步
- 分布式锁
- Leader 选举
- 状态协调
它的核心能力主要有三点:
1、强一致性
ZooKeeper 使用 ZAB 协议,保证数据在集群中的一致性。
简单说就是:
<pre data-start="695" data-end="717" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important;">
任何节点看到的数据都是一致的
</pre>
这对于分布式协调非常重要。
2、Watcher 监听机制
ZooKeeper 提供了 Watcher 机制:
当节点发生变化时,可以通知客户端。
比如:
<pre data-start="814" data-end="836" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important;">
服务上线 服务下线 节点变化
</pre>
Dubbo 就是利用这个能力实现:
服务发现。
3、高可用集群
ZooKeeper 使用:
<pre data-start="901" data-end="924" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important;">
Leader Follower
</pre>
的集群架构。
只要大多数节点存活,系统就能继续运行。
[图片上传失败...(image-64886a-1775123561583)]
-****02-
**ZooKeeper 在微服务中的问题 **
虽然 ZooKeeper 能做注册中心,但它并不是为这个场景设计的。
随着微服务规模越来越大,一些问题开始暴露出来。
1、功能单一
ZooKeeper 只负责:
<pre data-start="1076" data-end="1093" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important;">
服务注册 服务发现
</pre>
但微服务体系真正需要的其实是:
<pre data-start="1112" data-end="1144" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important;">
服务注册
服务发现
配置中心 服务治理 健康检查 动态配置</pre>
如果只用 ZooKeeper,你往往还需要额外系统:
<pre data-start="1174" data-end="1226" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important;">
ZooKeeper + Apollo ZooKeeper + Config Server
</pre>
架构复杂度明显增加。
2、性能瓶颈
ZooKeeper 有一个天然的限制:
所有写操作必须走 Leader。
也就是说:
<pre data-start="1305" data-end="1327" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important;">
注册服务 下线服务 节点变更
</pre>
这些操作都会打到 Leader 节点。
当服务规模变大时:
<pre data-start="1365" data-end="1388" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important;">
上万实例 频繁发布 自动扩缩容
</pre>
Leader 就会成为瓶颈。
3、连接压力
ZooKeeper 使用 长连接模型。
每一个服务实例都需要和 ZooKeeper 建立连接。
如果系统里有:
<pre data-start="1484" data-end="1503" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important;">
10000 个服务实例
</pre>
ZooKeeper 就需要维护:
<pre data-start="1523" data-end="1541" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important;">
10000 条长连接
</pre>
连接数压力会非常大。
4、Watcher 的“惊群效应”
ZooKeeper 的 Watcher 有一个经典问题:
一次性触发。
例如:
<pre data-start="1628" data-end="1642" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important;">
一个服务下线
</pre>
如果有 1000 个消费者监听这个节点:
ZooKeeper 会同时通知所有客户端。
结果就是:
<pre data-start="1700" data-end="1721" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important;">
1000 个客户端同时请求
</pre>
这就叫:
惊群效应。
[图片上传失败...(image-375bac-1775123561582)]
-****03-
Nacos:为微服务而生
相比 ZooKeeper,Nacos 从一开始就是为 微服务架构设计的。
Nacos 的名字其实就说明了一切:
<pre data-start="1825" data-end="1865" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important;">
Naming And Configuration Service
</pre>
翻译过来就是:
服务发现 + 配置管理。
1、一体化平台
Nacos 最大的优势是:
一个系统解决两个问题。
<pre data-start="1942" data-end="1959" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important;">
服务注册 配置中心
</pre>
统一管理。
架构从:
<pre data-start="1974" data-end="2006" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important;">
ZooKeeper + ConfigCenter
</pre>
变成:
<pre data-start="2013" data-end="2026" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important;">
Nacos
</pre>
系统复杂度明显下降。
2、环境隔离能力
Nacos 提供了非常清晰的隔离模型:
<pre data-start="2078" data-end="2121" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important;">
Namespace(环境) Group(分组) Cluster(集群)
</pre>
例如:
<pre data-start="2128" data-end="2149" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important;">
dev test prod
</pre>
可以轻松隔离。
3、更好的性能
在大规模服务场景下,Nacos 的表现明显更好。
例如 1 万实例规模下的对比:
| 指标 | ZooKeeper | Nacos |
|---|---|---|
| 注册耗时 | 20-50ms | 5-15ms |
| 通知延迟 | 100-200ms | 10-30ms |
| 资源占用 | 较高 | 降低约40% |
| 扩展能力 | 扩容复杂 | 水平扩展简单 |
简单说:
Nacos 更适合大规模微服务。
4、更完善的健康检查
ZooKeeper 的健康检查基本依赖:
<pre data-start="2399" data-end="2412" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important;">
客户端断连
</pre>
而 Nacos 提供了多种健康检测方式:
<pre data-start="2436" data-end="2472" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important;">
TCP HTTP MySQL 客户端心跳 服务端主动检测
</pre>
稳定性更高。
5、云原生友好
Nacos 对云原生生态支持非常好。
例如:
<pre data-start="2523" data-end="2560" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important;">
Kubernetes Spring Cloud Dubbo
</pre>
都可以无缝集成。
如果你在阿里云体系中:
<pre data-start="2585" data-end="2601" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important;">
MSE EDAS
</pre>
也都是基于 Nacos 构建的。
Dubbo 为什么更适合 Nacos
从 Dubbo 3 开始,Nacos 的优势变得更明显。
因为 Dubbo 开始强化:
服务治理能力。
例如:
<pre data-start="2714" data-end="2746" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important;">
权重控制 动态路由 熔断降级 标签路由 黑白名单
</pre>
这些能力都需要:
更强的元数据管理。
而 Nacos 在这方面天然更强。
Dubbo 3 的服务元数据大概是这样的:
<pre data-start="2815" data-end="2932" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important;">
metadata: version: 2.7.0 protocols: - dubbo - rest params: timeout: 1000 retries: 3
</pre>
这些信息都可以在 Nacos 中统一管理。
[图片上传失败...(image-3eebaf-1775123561580)]
-****04-
实际迁移怎么做?
很多公司已经在做:
ZooKeeper → Nacos 迁移。
一个常见的方案是:
双注册中心。
步骤通常是:
第一步:双注册
<pre data-start="3058" data-end="3089" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important;">
服务同时注册到 ZooKeeper Nacos
</pre>
第二步:消费者切换
逐步让消费者从:
<pre data-start="3121" data-end="3138" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important;">
ZooKeeper
</pre>
切到:
<pre data-start="3145" data-end="3158" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important;">
Nacos
</pre>
第三步:观察监控
确认:
<pre data-start="3184" data-end="3209" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important;">
服务调用稳定 延迟正常 无异常流量
</pre>
第四步:下线 ZooKeeper
最后彻底移除 ZooKeeper。
未来趋势:服务治理平台化
从更大的技术趋势看,这次变化其实不只是:
<pre data-start="3302" data-end="3327" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important;">
ZooKeeper → Nacos
</pre>
而是微服务架构的一次升级:
从:
<pre data-start="3348" data-end="3360" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important;">
单一组件
</pre>
走向:
<pre data-start="3367" data-end="3381" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important;">
服务治理平台
</pre>
未来很可能是:
<pre data-start="3392" data-end="3420" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important;">
Nacos + Service Mesh
</pre>
比如:
<pre data-start="3427" data-end="3448" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important;">
Nacos + Istio
</pre>
形成统一的服务治理平面。
[图片上传失败...(image-7bff96-1775123561579)]
-****05-
总结
Dubbo 从 ZooKeeper 转向 Nacos,本质上反映的是微服务架构的演进:
过去的目标是:
<pre data-start="3529" data-end="3544" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important;">
能实现服务发现
</pre>
现在的目标是:
<pre data-start="3555" data-end="3571" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important;">
统一服务治理平台
</pre>
Nacos 提供的不只是注册中心,而是:
<pre data-start="3595" data-end="3623" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important;">
服务发现 配置中心 服务治理 云原生集成
</pre>
的一整套基础设施。
所以这次变化,看起来只是换了一个组件。
但背后其实是:
微服务架构进入云原生时代的一个缩影。