文章目錄
敘述
Eureka基礎架構
Eureka服務治理基礎架構包括三個核心要素。
服務註冊中心
Eureka分爲客戶端和服務端,Eureka服務端提供服務註冊與發現的功能。
服務提供者
提供服務的應用,Spring Boot應用或者遵循Eureka通信機制的應用。
將應用自己註冊到Eureka註冊中心,以供其它應用的發現。
服務消費者
消費者從服務註冊中心獲取服務列表,通過客戶端負載均衡某種算法輪詢服務列表,然後調用其所需要的服務,也即調用對應的服務提供者。
Eureka的幾處緩存
Eureka的wiki上有一句話,大意是一個服務啓動後最長可能需要2分鐘時間才能被其它服務感知到,但是文檔並沒有解釋爲什麼會有這2分鐘。其實這是由三處緩存 + 一處延遲造成的。
Eureka對HTTP響應做了緩存
在Eureka的”控制器”類ApplicationResource的109行可以看到有一行
String payLoad = responseCache.get(cacheKey);
的調用,該代碼所在的getApplication()方法的功能是響應客戶端查詢某個服務信息的HTTP請求:
Eureka Client對已經獲取到的註冊信息也做了30s緩存
負載均衡組件Ribbon也有30s緩存
服務註冊中心
作爲服務註冊中心,Eureka比Zookeeper好在哪裏 |
4.1 Zookeeper保證CP
當向註冊中心查詢服務列表時,我們可以容忍註冊中心返回的是幾分鐘以前的註冊信息,但不能接受服務直接down掉不可用。也就是說,服務註冊功能對可用性的要求要高於一致性。但是zk會出現這樣一種情況,當master節點因爲網絡故障與其他節點失去聯繫時,剩餘節點會重新進行leader選舉。問題在於,選舉leader的時間太長,30 ~ 120s, 且選舉期間整個zk集羣都是不可用的,這就導致在選舉期間註冊服務癱瘓。在雲部署的環境下,因網絡問題使得zk集羣失去master節點是較大概率會發生的事,雖然服務能夠最終恢復,但是漫長的選舉時間導致的註冊長期不可用是不能容忍的。
4.2 Eureka保證AP
Eureka看明白了這一點,因此在設計時就優先保證可用性。Eureka各個節點都是平等的,幾個節點掛掉不會影響正常節點的工作,剩餘的節點依然可以提供註冊和查詢服務。而Eureka的客戶端在向某個Eureka註冊或時如果發現連接失敗,則會自動切換至其它節點,只要有一臺Eureka還在,就能保證註冊服務可用(保證可用性),只不過查到的信息可能不是最新的(不保證強一致性)。除此之外,Eureka還有一種自我保護機制,如果在15分鐘內超過85%的節點都沒有正常的心跳,那麼Eureka就認爲客戶端與註冊中心出現了網絡故障,此時會出現以下幾種情況:
1. Eureka不再從註冊列表中移除因爲長時間沒收到心跳而應該過期的服務
2. Eureka仍然能夠接受新服務的註冊和查詢請求,但是不會被同步到其它節點上(即保證當前節點依然可用)
3. 當網絡穩定時,當前實例新的註冊信息會被同步到其它節點中
因此, Eureka可以很好的應對因網絡故障導致部分節點失去聯繫的情況,而不會像zookeeper那樣使整個註冊服務癱瘓。
小結
感謝您的閱讀~~