为什么 Dubbo 从 ZooKeeper 转向 Nacos?

在很长一段时间里,只要提到 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>

的一整套基础设施。

所以这次变化,看起来只是换了一个组件。

但背后其实是:

微服务架构进入云原生时代的一个缩影。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容