注冊中心規則
每一個微服務啟動的時候,都需要去注冊中心注冊(eureka或zookeeper或其他) 同類服務注冊的服務名必須相同,不同類服務注冊的服務名一定不能相同 (訂單服務部署5台服務器,那么這5台微服務在注冊中心中注冊的服務名必須一致,例如ORDER) (商品服務部署4台服務器,那么這4台微服務在注冊中心中注冊的服務名必須一致,例如GOODS) (訂單服務和商品服務注冊的服務名一定不能相同,不能同為ORDER,也不能同為GOODS)
作為服務注冊中心,Eureka比Zookeeper好在哪里
著名的CAP理論指出,一個分布式系統不可能同時滿足C(一致性)、A(可用性)和P(分區容錯性)。由於分區容錯性在是分布式系統中必須要保證的,因此我們只能在A和C之間進行權衡。在此Zookeeper保證的是CP, 而Eureka則是AP。
1 Zookeeper保證CP
當向注冊中心查詢服務列表時,我們可以容忍注冊中心返回的是幾分鍾以前的注冊信息,但不能接受服務直接down掉不可用。也就是說,服務注冊功能對可用性的要求要高於一致性。但是zk會出現這樣一種情況,當master節點因為網絡故障與其他節點失去聯系時,剩余節點會重新進行leader選舉。問題在於,選舉leader的時間太長,30 ~ 120s, 且選舉期間整個zk集群都是不可用的,這就導致在選舉期間注冊服務癱瘓。在雲部署的環境下,因網絡問題使得zk集群失去master節點是較大概率會發生的事,雖然服務能夠最終恢復,但是漫長的選舉時間導致的注冊長期不可用是不能容忍的。
zookeeper原理
zookeeper也可以作為注冊中心,用於服務治理(zookeeper還有其他用途,例如:分布式事務鎖等) 每啟動一個微服務,就會去zk中注冊一個臨時子節點, 例如:5台訂單服務,4台商品服務 (5台訂單服務在zk中的訂單目錄下創建的5個臨時節點) (4台商品服務在zk中的商品目錄下創建的4個臨時接點) 每當有一個服務down機,由於是臨時接點,此節點會立即被刪除,並通知訂閱該服務的微服務更新服務列表 (zk上有watch,每當有節點更新,都會通知訂閱該服務的微服務更新服務列表) 每當有一個新的微服務注冊進來,就會在對應的目錄下創建臨時子節點,並通知訂閱該服務的微服務更新服務列表 (zk上有watch,每當有節點更新,都會通知訂閱該服務的微服務更新服務列表) 每個微服務30s向zk獲取新的服務列表
2 Eureka保證AP
Eureka看明白了這一點,因此在設計時就優先保證可用性。Eureka各個節點都是平等的,幾個節點掛掉不會影響正常節點的工作,剩余的節點依然可以提供注冊和查詢服務。而Eureka的客戶端在向某個Eureka注冊或時如果發現連接失敗,則會自動切換至其它節點,只要有一台Eureka還在,就能保證注冊服務可用(保證可用性),只不過查到的信息可能不是最新的(不保證強一致性)。除此之外,Eureka還有一種自我保護機制,如果在15分鍾內超過85%的節點都沒有正常的心跳,那么Eureka就認為客戶端與注冊中心出現了網絡故障,此時會出現以下幾種情況:
1. Eureka不再從注冊列表中移除因為長時間沒收到心跳而應該過期的服務
2. Eureka仍然能夠接受新服務的注冊和查詢請求,但是不會被同步到其它節點上(即保證當前節點依然可用)
3. 當網絡穩定時,當前實例新的注冊信息會被同步到其它節點中
因此, Eureka可以很好的應對因網絡故障導致部分節點失去聯系的情況,而不會像zookeeper那樣使整個注冊服務癱瘓。
eureka原理
每一個微服務中都有eureka client,用於服務的注冊與發現 (服務的注冊:把自己注冊到eureka server) (服務的發現:從eureka server獲取自己需要的服務列表) 每一個微服務啟動的時候,都需要去eureka server注冊 當A服務需要調用B服務時, 需要從eureka服務端獲取B服務的服務列表,然后把列表緩存到本地,然后根據ribbon的客戶端負載均衡規則, 從服務列表中取到一個B服務,然后去調用此B服務 當A服務下次再此調用B服務時,如果發現本地已經存儲了B的服務列表,就不需要再從eureka服務端獲取B服務列表, 直接根據ribbon的客戶端負載均衡規則,從服務列表中取到一個B服務,然后去調用B服務 微服務, 默認每30秒,就會從eureka服務端獲取一次最新的服務列表 如果某台微服務down機,或者添加了幾台機器, 此時eureka server會通知訂閱他的客戶端, 並讓客戶端更新服務列表, 而且還會通知其他eureka server更新此信息 心跳檢測, 微服務每30秒向eureka server發送心跳, eureka server若90s之內都沒有收到某個客戶端的心跳, 則認為此服務出了問題, 會從注冊的服務列表中將其刪除,並通知訂閱它的客戶端更新服務列表, 而且還會通知其他eureka server更新此信息 eureka server保護機制,通過打卡開關,可以讓eureka server處於保護狀態, 主要是用於某eureka server由於網絡或其他原因,導致接收不到其他微服務的心跳, 此時不能盲目的將其他微服務從服務列表中刪除。 具體規則:如果一段時間內,85%的服務都沒有發送心跳,則此server進入保護狀態, 此狀態下,可以正常接受注冊,可以正常提供查詢服務,但是不與其他server同步信息, 也不會通知訂閱它的客戶端,這樣就不會誤殺其他微服務
3. 總結
Eureka作為單純的服務注冊中心來說要比zookeeper更加“專業”,因為注冊服務更重要的是可用性,我們可以接受短期內達不到一致性的狀況。不過Eureka目前1.X版本的實現是基於servlet的java web應用,它的極限性能肯定會受到影響。期待正在開發之中的2.X版本能夠從servlet中獨立出來成為單獨可部署執行的服務。
拓展:
RDBMS:(MySql,Oracle,SqlServer等關系型數據庫)遵循的原則是:ACID原則(A:原子性。C:一致性。I:獨立性。D:持久性。)。
NoSql:(redis,Mogodb等非關系型數據庫)遵循的原則是:CAP原則(C:強一致性。A:可用性。P:分區容錯性)。
CAP:C:數據一致性。A:服務可用性。P:分區容錯性(服務對網絡分區故障的容錯性)。
原文地址: