本文源碼:GitHub·點這裡 || GitEE·點這裡
在分布式架構的系統中注冊中心這個概念就已經被提出了,最經典的就是Zookeeper中間件。

微服務架構中,注冊中心是最核心的基礎服務之一,注冊中心可以看做是微服務架構中的通信中心,當一個服務去請求另一個服務時,通過注冊中心可以擷取該服務的狀态,位址等核心資訊。
服務注冊主要關系到三大角色:服務提供者、服務消費者、注冊中心。
基礎流程
服務啟動時,将自身的網絡位址等資訊注冊到注冊中心,注冊中心記錄服務注冊資料。
服務消費者從注冊中心擷取服務提供者的位址,并通過位址和基于特定的方式調用服務提供者的接口。
各個服務與注冊中心使用一定機制通信。如果注冊中心與服務長時間無法通信,就會登出該執行個體,這也稱為服務下線,當服務重新連接配接之後,會基于一定的政策線上上線。
服務位址相關資訊發生變化時,會重新注冊到注冊中心。這樣,服務消費者就無需手工維護提供者的相關配置。
核心功能
通過上面的基本流程,不難發現一個注冊中心需要具備哪些核心功能:
服務發現
服務發現是指服務在啟動後,注冊到注冊中心,服務方提供自身的中繼資料,比如IP位址、端口、運作狀況名額的Uri 、首頁位址等資訊。
服務記錄
記錄注冊中心的服務的資訊,例如服務名稱、IP位址、端口等。服務消費方基于查詢擷取可用的服務執行個體清單。
動态管理服務
注冊中心基于特定的機制定時測試已注冊的服務,例如:預設的情況下會每隔30秒發送一次心跳來進行服務續約。通過服務續約來告知Server該Client仍然可用。正常情況下,如果Server在90 秒内沒有收到Client 的心跳,Server會将Client 執行個體從注冊清單中删除。
1.1基礎描述
ZooKeeper是非常經典的服務注冊中心中間件,在國内環境下,由于受到Dubbo架構的影響,大部分情況下認為Zookeeper是RPC服務架構下注冊中心最好選擇,随着Dubbo架構的不斷開發優化,和各種注冊中心元件的誕生,即使是RPC架構,現在的注冊中心也逐漸放棄了ZooKeeper。在常用的開發叢集環境中,ZooKeeper依然起到十分重要的作用,Java體系中,大部分的叢集環境都是依賴ZooKeeper管理服務的各個節點。
1.2元件特點
從Zookeeper的資料結構特點看,并不是基于服務注冊而設計的,ZooKeeper提供的命名空間與檔案系統的名稱空間非常相似,在資料結構上高度抽象為K-V格式,十分通用,說到這裡不得不提一下Redis,也可以作為注冊中心使用,隻是用的不多。
ZooKeeper元件支援節點短暫存在,隻要建立znode的會話處于活動狀态,這些znode就會存在,會話結束時,将删除znode。Dubbo架構正是基于這個特點,服務啟動往Zookeeper注冊的就是臨時節點,需要定時發心跳到Zookeeper來續約節點,并允許服務下線時,将Zookeeper上相應的節點删除,同時Zookeeper使用ZAB協定雖然保證了資料的強一緻性。
2.1基礎描述
SpringCloud架構生态中最原生的深度結合元件,Eureka是Netflix開發的服務發現架構,基于REST的服務,主要用于服務注冊,管理,負載均衡和服務故障轉移。但是官方聲明在Eureka2.0版本停止維護,不建議使用。
2.2元件特點
Eureka包含兩個元件:EurekaServer和EurekaClient。
EurekaServer提供服務注冊服務,各個節點啟動後,會在EurekaServer中進行注冊,這樣EurekaServer中的服務系統資料庫中将會存儲所有可用服務節點的資訊,服務節點的資訊可以在界面中直覺的看到。Eureka允許在注冊服務的時候,自定義實作檢查自身狀态的是否健康的方法,這在服務執行個體能夠保持心跳上報的場景下,是一種比較好的體驗。
EurekaClient是一個java用戶端,用于簡化與EurekaServer的互動,用戶端同時也就是一個内置的、使用輪詢(round-robin)負載算法的負載均衡器。
3.1基礎描述
Consul是用于服務發現和配置的工具。Consul是分布式的,高度可用的,并且具有極高的可伸縮性,而且開發使用都很簡便。它提供了一個功能齊全的控制台,主要特點是:服務發現、健康檢查、鍵值存儲、安全服務通信、多資料中心、ServiceMesh。Consul在設計上把很多分布式服務治理上要用到的功能都包含在内了。
3.2元件特點
Consul提供多個資料中心的支援,基于Fabio做負載均衡,每個資料中心内,都有用戶端和服務端的混合構成。預計有三到五台服務端。可以在失敗和性能的可用性之間取得良好的平衡。資料中心中的所有節點都參與八卦協定。這意味着有一個八卦池,其中包含給定資料中心的所有節點。這有幾個目的:首先,不需要為用戶端配置伺服器的位址;發現是自動完成的。其次,檢測節點故障的工作不是放在伺服器上,而是分布式的。這使得故障檢測比天真的心跳方案更具可擴充性。第三,它被用作消息傳遞層,用于在諸如上司者選舉等重要事件發生時進行通知。
4.1基礎描述
Nacos緻力于發現、配置和管理微服務。Nacos提供了一組簡單易用的特性集,幫助您實作動态服務發現、服務配置管理、服務及流量管理。Nacos更靈活和容易地建構、傳遞和管理微服務平台。 Nacos 是建構以“服務”為中心的現代應用架構(例如微服務範式、雲原生範式)的服務基礎設施。Nacos支援作為RPC注冊中心,例如:支援Dubbo架構;也具備微服務注冊中心的能力,例如:SpringCloud架構。
4.2元件特點
Nacos在經過多年生産經驗後提煉出的資料模型,則是一種服務-叢集-執行個體的三層模型。如上文所說,這樣基本可以滿足服務在所有場景下的資料存儲和管理,資料模型雖然相對複雜,但是并不強制使用資料結構的風格,大多數應用場景下,和Eureka資料模型是類似的。
Nacos提供資料邏輯隔離模型,使用者賬号可以建立多個命名空間,每個命名空間對應一個用戶端執行個體,這個命名空間對應的注冊中心實體叢集是可以根據規則進行路由的,這樣可以讓注冊中心内部的更新和遷移對使用者是無感覺的。
如下注冊中心對比圖。
綜合上述幾種注冊中心對比,再從現在SpringCloud架構流行趨勢看,個人推薦後續微服務架構體系選擇Nacos元件,大緻原因如下,社群活躍,經過大規模業務驗證,不但可以作為微服務注冊中心,也支援作RPC架構Dubbo的注冊中心,且有完善的中文文檔,總結下來就一句話:通用中間件,省時;文檔詳細,省心。
推薦文章:微服務基礎系列
序号
文章标題
01
微服務基礎:Eureka元件,管理服務注冊發現
02
微服務基礎:Ribbon和Feign元件,實作請求負載均衡
03
微服務基礎:Hystrix元件,實作服務熔斷
04
微服務基礎:Turbine元件,實作微服務叢集監控
05
微服務基礎:Zuul元件,實作路由網關控制
06
微服務基礎:Config元件,實作配置統一管理
07
微服務基礎:Zipkin元件,實作請求鍊路追蹤
08
微服務基礎:與Dubbo架構、Boot架構對比分析
09
微服務基礎:Nacos元件,服務和配置管理
10
微服務基礎:Sentinel元件,服務限流和降級
11
微服務應用:分庫分表模式下,資料庫擴容方案
12
微服務應用:Shard-Jdbc分庫分表,擴容方案實作