為什么 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 并不是一個專門的 服務注冊中心

它本質上是:

分布式協調系統(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>

的一整套基礎設施。

所以這次變化,看起來只是換了一個組件。

但背后其實是:

微服務架構進入云原生時代的一個縮影。

?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容