微服務註冊中心產品 ZooKeeper、Eureka、Consul、Nacos 對比

服務註冊中心本質上是爲了解耦服務提供者和服務消費者。對於任何一個微服務,原則上都應存在或者支持多個提供者,這是由微服務的分佈式屬性決定的。更進一步,爲了支持彈性擴縮容特性,一個微服務的提供者的數量和分佈往往是動態變化的,也是無法預先確定的。因此,原本在單體應用階段常用的靜態 LB 機制就不再適用了,需要引入額外的組件來管理微服務提供者的註冊與發現,而這個組件就是服務註冊中心。

CAP 理論

CAP 理論是分佈式架構中重要理論:

關於 P 的理解,我覺得是在整個系統中某個部分,掛掉了,或者宕機了,並不影響整個系統的運作或者說使用,而可用性是,某個系統的某個節點掛了,但是並不影響系統的接受或者發出請求,CAP 不可能都取,只能取其中 2 個。

原因是如果 C 是第一需求的話,那麼會影響 A 的性能,因爲要數據同步,不然請求結果會有差異,但是數據同步會消耗時間,期間可用性就會降低。

如果 A 是第一需求,那麼只要有一個服務在,就能正常接受請求,但是對與返回結果變不能保證,原因是,在分佈式部署的時候,數據一致的過程不可能想切線路那麼快。

再如果,同時滿足一致性和可用性,那麼分區容錯就很難保證了,也就是單點,也是分佈式的基本核心,好了,明白這些理論,就可以在相應的場景選取服務註冊與發現了。

服務註冊中心解決方案

設計或者選型一個服務註冊中心,首先要考慮的就是服務註冊與發現機制。縱觀當下各種主流的服務註冊中心解決方案,大致可歸爲三類:

注 1:對於第一類註冊方式,除了 Eureka 這種一站式解決方案,還可以基於 ZooKeeper 或者 etcd 自行實現一套服務註冊機制,這在大公司比較常見,但對於小公司而言顯然性價比太低。

注 2:由於 DNS 固有的緩存缺陷,本文不對第三類註冊方式作深入探討。

除了基本的服務註冊與發現機制,從開發和運維角度,至少還要考慮如下五個方面:

主流注冊中心產品

軟件產品特性並非一成不變,如果發現功能特性有變更,歡迎評論指正。

WLJIBY

Apache Zookeeper -> CP

與 Eureka 有所不同,Apache ZooKeeper 在設計時就緊遵 CP 原則,即任何時候對 ZooKeeper 的訪問請求能得到一致的數據結果,同時系統對網絡分割具備容錯性,但是 ZooKeeper 不能保證每次服務請求都是可達的。

從 ZooKeeper 的實際應用情況來看,在使用 ZooKeeper 獲取服務列表時,如果此時的 ZooKeeper 集羣中的 Leader 宕機了,該集羣就要進行 Leader 的選舉,又或者 ZooKeeper 集羣中半數以上服務器節點不可用(例如有三個節點,如果節點一檢測到節點三掛了 ,節點二也檢測到節點三掛了,那這個節點纔算是真的掛了),那麼將無法處理該請求。所以說,ZooKeeper 不能保證服務可用性。

當然,在大多數分佈式環境中,尤其是涉及到數據存儲的場景,數據一致性應該是首先被保證的,這也是 ZooKeeper 設計緊遵 CP 原則的另一個原因。

但是對於服務發現來說,情況就不太一樣了,針對同一個服務,即使註冊中心的不同節點保存的服務提供者信息不盡相同,也並不會造成災難性的後果。

因爲對於服務消費者來說,能消費纔是最重要的,消費者雖然拿到可能不正確的服務實例信息後嘗試消費一下,也要勝過因爲無法獲取實例信息而不去消費,導致系統異常要好(淘寶的雙十一,京東的 618 就是緊遵 AP 的最好參照)。

當 Master 節點因爲網絡故障與其他節點失去聯繫時,剩餘節點會重新進行 Leader 選舉。問題在於,選舉 Leader 的時間太長,30~120s,而且選舉期間整個 ZooKeeper 集羣都是不可用的,這就導致在選舉期間註冊服務癱瘓。

在雲部署環境下, 因爲網絡問題使得 ZooKeeper 集羣失去 Master 節點是大概率事件,雖然服務能最終恢復,但是漫長的選舉事件導致註冊長期不可用是不能容忍的。

Spring Cloud Eureka -> AP

Spring Cloud Netflix 在設計 Eureka 時就緊遵 AP 原則(儘管現在 2.0 發佈了,但是由於其閉源的原因 ,但是目前 Ereka 1.x 任然是比較活躍的)。

Eureka Server 也可以運行多個實例來構建集羣,解決單點問題,但不同於 ZooKeeper 的選舉 Leader 的過程,Eureka Server 採用的是 Peer to Peer 對等通信。這是一種去中心化的架構,無 Master/Slave 之分,每一個 Peer 都是對等的。在這種架構風格中,節點通過彼此互相註冊來提高可用性,每個節點需要添加一個或多個有效的 serviceUrl 指向其他節點。每個節點都可被視爲其他節點的副本。

在集羣環境中如果某臺 Eureka Server 宕機,Eureka Client 的請求會自動切換到新的 Eureka Server 節點上,當宕機的服務器重新恢復後,Eureka 會再次將其納入到服務器集羣管理之中。當節點開始接受客戶端請求時,所有的操作都會在節點間進行復制(replicate To Peer)操作,將請求複製到該 Eureka Server 當前所知的其它所有節點中。

當一個新的 Eureka Server 節點啓動後,會首先嚐試從鄰近節點獲取所有註冊列表信息,並完成初始化。Eureka Server 通過 getEurekaServiceUrls() 方法獲取所有的節點,並且會通過心跳契約的方式定期更新。

默認情況下,如果 Eureka Server 在一定時間內沒有接收到某個服務實例的心跳(默認週期爲 30 秒),Eureka Server 將會註銷該實例(默認爲 90 秒, eureka.instance.lease-expiration-duration-in-seconds 進行自定義配置)。

當 Eureka Server 節點在短時間內丟失過多的心跳時,那麼這個節點就會進入自我保護模式。

Eureka 的集羣中,只要有一臺 Eureka 還在,就能保證註冊服務可用(保證可用性),只不過查到的信息可能不是最新的(不保證強一致性)。除此之外,Eureka 還有一種自我保護機制,如果在 15 分鐘內超過 85% 的節點都沒有正常的心跳,那麼 Eureka 就認爲客戶端與註冊中心出現了網絡故障,此時會出現以下幾種情況:

因此,Eureka 可以很好的應對因網絡故障導致部分節點失去聯繫的情況,而不會像 ZooKeeper 那樣使得整個註冊服務癱瘓。

Consul

Consul 是 HashiCorp 公司推出的開源工具,用於實現分佈式系統的服務發現與配置。Consul 使用 Go 語言編寫,因此具有天然可移植性(支持 Linux、Windows 和 Mac OS X)。

Consul 內置了服務註冊與發現框架、分佈一致性協議實現、健康檢查、Key/Value 存儲、多數據中心方案,不再需要依賴其他工具(比如 ZooKeeper 等),使用起來也較爲簡單。

Consul 遵循 CAP 原理中的 CP 原則,保證了強一致性和分區容錯性,且使用的是 Raft 算法,比 ZooKeeper 使用的 Paxos 算法更加簡單。雖然保證了強一致性,但是可用性就相應下降了,例如服務註冊的時間會稍長一些,因爲 Consul 的 raft 協議要求必須過半數的節點都寫入成功才認爲註冊成功;在 Leader 掛掉了之後,重新選舉出 Leader 之前會導致 Consul 服務不可用。

默認依賴於 SDK

Consul 本質上屬於應用外的註冊方式,但可以通過 SDK 簡化註冊流程。而服務發現恰好相反,默認依賴於 SDK,但可以通過 Consul Template(下文會提到)去除 SDK 依賴。

Consul Template

Consul 默認服務調用者需要依賴 Consul SDK 來發現服務,這就無法保證對應用的零侵入性。

所幸通過 Consul Template,可以定時從 Consul 集羣獲取最新的服務提供者列表並刷新 LB 配置(比如 Nginx 的 Upstream),這樣對於服務調用者而言,只需要配置一個統一的服務調用地址即可。

Consul 強一致性(C)帶來的是:

Eureka 保證高可用(A)和最終一致性:

其他方面,Eureka 就是個 servlet 程序,跑在 servlet 容器中;Consul 則是 Go 編寫而成。

Nacos

Nacos 是阿里開源的,Nacos 支持基於 DNS 和基於 RPC 的服務發現。在 Spring Cloud 中使用 Nacos,只需要先下載 Nacos 並啓動 Nacos server,Nacos 只需要簡單的配置就可以完成服務的註冊發現。

Nacos 除了服務的註冊發現之外,還支持動態配置服務。動態配置服務可以讓您以中心化、外部化和動態化的方式管理所有環境的應用配置和服務配置。動態配置消除了配置變更時重新部署應用和服務的需要,讓配置管理變得更加高效和敏捷。配置中心化管理讓實現無狀態服務變得更簡單,讓服務按需彈性擴展變得更容易。

一句話概括就是 Nacos = Spring Cloud 註冊中心 + Spring Cloud 配置中心。

作者:琦彥

來源:https://blog.csdn.net/fly910905/article/details/100023415

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/wAHoHFyQu-jQwoJMjQ2TqA