在很長一段時間里,只要提到 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 并不是一個專門的 服務注冊中心。
它本質上是:
分布式協調系統(tǒng)。
ZooKeeper 最初誕生于 Hadoop 生態(tài),用來解決分布式系統(tǒng)中的一些經典問題:
- 配置同步
- 分布式鎖
- Leader 選舉
- 狀態(tài)協調
它的核心能力主要有三點:
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;">
任何節(jié)點看到的數據都是一致的
</pre>
這對于分布式協調非常重要。
2、Watcher 監(jiān)聽機制
ZooKeeper 提供了 Watcher 機制:
當節(jié)點發(fā)生變化時,可以通知客戶端。
比如:
<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;">
服務上線 服務下線 節(jié)點變化
</pre>
Dubbo 就是利用這個能力實現:
服務發(fā)現。
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>
的集群架構。
只要大多數節(jié)點存活,系統(tǒng)就能繼續(xù)運行。
[圖片上傳失敗...(image-64886a-1775123561583)]
-****02-
**ZooKeeper 在微服務中的問題 **
雖然 ZooKeeper 能做注冊中心,但它并不是為這個場景設計的。
隨著微服務規(guī)模越來越大,一些問題開始暴露出來。
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;">
服務注冊 服務發(fā)現
</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;">
服務注冊
服務發(fā)現
配置中心 服務治理 健康檢查 動態(tài)配置</pre>
如果只用 ZooKeeper,你往往還需要額外系統(tǒng):
<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;">
注冊服務 下線服務 節(jié)點變更
</pre>
這些操作都會打到 Leader 節(jié)點。
當服務規(guī)模變大時:
<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;">
上萬實例 頻繁發(fā)布 自動擴縮容
</pre>
Leader 就會成為瓶頸。
3、連接壓力
ZooKeeper 使用 長連接模型。
每一個服務實例都需要和 ZooKeeper 建立連接。
如果系統(tǒng)里有:
<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 有一個經典問題:
一次性觸發(fā)。
例如:
<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 個消費者監(jiān)聽這個節(jié)點:
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>
翻譯過來就是:
服務發(fā)現 + 配置管理。
1、一體化平臺
Nacos 最大的優(yōu)勢是:
一個系統(tǒng)解決兩個問題。
<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>
統(tǒng)一管理。
架構從:
<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>
系統(tǒng)復雜度明顯下降。
2、環(huán)境隔離能力
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(環(huán)境) 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、更好的性能
在大規(guī)模服務場景下,Nacos 的表現明顯更好。
例如 1 萬實例規(guī)模下的對比:
| 指標 | ZooKeeper | Nacos |
|---|---|---|
| 注冊耗時 | 20-50ms | 5-15ms |
| 通知延遲 | 100-200ms | 10-30ms |
| 資源占用 | 較高 | 降低約40% |
| 擴展能力 | 擴容復雜 | 水平擴展簡單 |
簡單說:
Nacos 更適合大規(guī)模微服務。
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>
穩(wěn)定性更高。
5、云原生友好
Nacos 對云原生生態(tài)支持非常好。
例如:
<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 的優(yōu)勢變得更明顯。
因為 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;">
權重控制 動態(tài)路由 熔斷降級 標簽路由 黑白名單
</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 中統(tǒng)一管理。
[圖片上傳失敗...(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>
第三步:觀察監(jiān)控
確認:
<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;">
服務調用穩(wěn)定 延遲正常 無異常流量
</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>
形成統(tǒng)一的服務治理平面。
[圖片上傳失敗...(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;">
能實現服務發(fā)現
</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;">
統(tǒng)一服務治理平臺
</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;">
服務發(fā)現 配置中心 服務治理 云原生集成
</pre>
的一整套基礎設施。
所以這次變化,看起來只是換了一個組件。
但背后其實是:
微服務架構進入云原生時代的一個縮影。