eureka、consul、nacos三大產品對比


配置中心

  • eureka 不支持
  • consul 支持 但用起來偏麻煩,不太符合springBoot框架的命名風格,支持動態刷新
  • nacos 支持 用起來簡單,符合springBoot的命名風格,支持動態刷新

注冊中心

  • eureka

    • 應用內/外:直接集成到應用中,依賴於應用自身完成服務的注冊與發現,
    • ACP原則:遵循AP(可用性+分離容忍)原則,有較強的可用性,服務注冊快,但犧牲了一定的一致性。
    • 版本迭代:目前已經不進行升級
    • 集成支持:只支持SpringCloud集成
    • 訪問協議:HTTP
    • 雪崩保護:支持雪崩保護
    • 界面:英文界面,不符合國人習慣
    • 上手:容易
  • consul

    • 應用內/外:屬於外部應用,侵入性小
    • ACP原則:遵循CP原則(一致性+分離容忍) 服務注冊稍慢,由於其一致性導致了在Leader掛掉時重新選舉期間真個consul不可用。
    • 版本迭代:目前仍然進行版本迭代
    • 集成支持:支持SpringCloud K8S集成
    • 訪問協議:HTTP/DNS
    • 雪崩保護:不支持雪崩保護
    • 界面:英文界面,不符合國人習慣
    • 上手:復雜一點
  • nacos

    • 應用內/外:屬於外部應用,侵入性小
    • ACP原則:通知遵循CP原則(一致性+分離容忍) 和AP原則(可用性+分離容忍)
    • 版本迭代:目前仍然進行版本迭代
    • 集成支持:支持Dubbo 、SpringCloud、K8S集成
    • 訪問協議:HTTP/動態DNS/UDP
    • 雪崩保護:支持雪崩保護
    • 界面:中文界面,符合國人習慣
    • 上手:極易,中文文檔,案例,社區活躍

 

主流注冊中心產品 

Apache Zookeeper -> CP

  與 Eureka 有所不同,Zookeeper 在設計時就緊遵CP原則,即任何時候對 Zookeeper 的訪問請求能得到一致的數據結果,同時系統對網絡分割具備容錯性,但是 Zookeeper 不能保證每次服務請求都是可達的。從 Zookeeper 的實際應用情況來看,在使用 Zookeeper 獲取服務列表時,如果此時的 Zookeeper 集群中的 Leader 宕機了,該集群就要進行 Leader 的選舉,又或者 Zookeeper 集群中半數以上服務器節點不可用(例如有三個節點,如果節點一檢測到節點三掛了 ,節點二也檢測到節點三掛了,那這個節點才算是真的掛了),那么將無法處理該請求。所以說,Zookeeper 不能保證服務可用性。

就我接觸到的項目基本都不會用zookeeper來做為服務發現

Spring Cloud Eureka  -> AP

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

  不知道spring抽什么風居然將Eureka閉源了,所以就不做過多解釋。

 

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 服務不可用。

  目前在.net微服務中大多使用它來作為注冊服務

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

  Consul Template

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

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

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

    服務注冊相比Eureka會稍慢一些。因為Consul的raft協議要求必須過半數的節點都寫入成功才認為注冊成功

    Leader掛掉時,重新選舉期間整個consul不可用。保證了強一致性但犧牲了可用性。

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

      服務注冊相對要快,因為不需要等注冊信息replicate到其他節點,也不保證注冊信息是否replicate成功

      當數據出現不一致時,雖然A, B上的注冊信息不完全相同,但每個Eureka節點依然能夠正常對外提供服務,這會出現查詢服務信息時如果請求A查不到,但請求B就能查到。如此保證了可用性但犧牲了一致性。
      其他方面,eureka就是個servlet程序,跑在servlet容器中; Consul則是go編寫而成。

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

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

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

  java架構師大多都采用它,它的確好用


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM