Eureka是Netflix的一個子模塊,也是核心模塊之一。Eureka是一個基於REST的服務,用於定位服務,以實現雲端中間層服務發現和故障轉移。服務註冊與發現對於微服務架構來講是很是重要的,有了服務發現與註冊,只須要使用服務的標識符,就能夠訪問到服務,而不須要修改服務調用的配置文件了。java
Eureka的基本架構web
Eureka採用了C-S的設計架構,使用Eureka的客戶端鏈接到Eureka Server並維持心跳鏈接,這樣系統的維護人員就能夠經過Eureka Server來監控系統中各個微服務是否正常運行。算法
舉例說明:一座大廈,其中全部的業主買房子入住都須要去物業登記。其中物業就是我們的Eureka的服務註冊中心,我們的業主就是一個個的微服務。業主交物業費就至關於Eureka維持客戶端的心跳鏈接。服務器
Eureka包含組件網絡
Eureka包含兩個組件:Eureka Server和Eureka Client架構
Eureka Server提供服務註冊服務負載均衡
各個節點啓動後,會在EurekaServer中進行註冊,這樣EurekaServer中的服務註冊表中將會存儲全部可用服務節點的信息,服務節點的信息能夠在界面中直觀看到。分佈式
Eureka Client是一個java客戶端,用於簡化Eureka的交互,客戶端同時也具有一個內置的、使用輪詢(round-robin)負載算法的負載均衡器。微服務
在應用啓動後,將會向Eureka Sever發送心跳(默認週期爲30秒)。若是Eureka Server在多個心跳週期沒有接收到某個節點的心跳,EurekaServer 將會從服務註冊表中把這個服務節點移除(默認90秒)性能
ACP原則
首先咱們來說一下ACP原則,便於一會的產品對比。
CAP是Consistency、Availablity和Partition-tolerance的縮寫。
分別是指:
1.一致性(Consistency):每次讀操做都能保證返回的是最新數據;
2.可用性(Availablity):任何一個沒有發生故障的節點,會在合理的時間內返回一個正常的結果;
3.分區容忍性(Partition-torlerance):當節點間出現網絡分區,照樣能夠提供服務。
注意:在分佈式系統中,CAP只能三選二,沒有任何分佈式架構三種都知足。
分佈式架構通常要麼CP要麼AP,由於分佈式必定要保證分區容忍性。
爲何說是三進二呢?
1:知足C和A,那麼P能不能知足呢?
知足C須要全部的服務器的數據要同樣,也就是說要實現數據的同步,那麼同步要不要時間?確定是要的,而且機器越多,同步的時間確定越慢,這裏問題就來了,咱們同時也知足了A,也就是說,我要同步時間短才行。這樣的話,機器就不能太多了,也就是說P是知足不了的
2:知足C和P,那麼A能不能知足呢?
知足P須要不少服務器,假設有1000臺服務器,同時知足了C,也就是說要保證每臺機器的數據都同樣,那麼同步的時間可就很大,在這種狀況下,咱們確定是不能保證用戶隨時訪問每臺服務器獲取到的數據都是最新的,想要獲取最新的,能夠,你就等吧,等所有同步完了,你就能夠獲取到了,可是咱們的A要求短期就能夠拿到想要的數據啊,這不就是矛盾了,因此說這裏A是知足不了了
3:知足A和P,那麼C能不能知足呢?
自行考慮一下。
與Zookeeper的對比
爲何要講CAP呢,由於咱們下面要對Dubbo中的Zookeeper和SpringCloud中的Eureka進行對比了。
與Eureka功能相似的是Dubbo的註冊中心,好比Zookeeper。
那麼Eureka和Zookeeper區別在哪裏,咱們又如何進行選擇呢?
Eureka開發是吸收了Zookeeper的全部教訓後出現的一個產品:
Netflix在設計Eureka時遵照的是AP原則。
Zookeeper使用的是CP原則。
下面咱們來分析一下:
當向註冊中心查詢服務列表時,咱們能夠容忍註冊中心返回的是幾分鐘之前的註冊信息,但不能接受服務直接down掉不可用。也就是說,服務註冊功能對可用性的要求要高於一致性。可是zk會出現這樣一種狀況,當master節點由於網絡故障與其餘節點失去聯繫時,剩餘節點會從新進行leader選舉。問題在於,選舉leader的時間太長,30 ~ 120s, 且選舉期間整個zk集羣都是不可用的,這就致使在選舉期間註冊服務癱瘓。在雲部署的環境下,因網絡問題使得zk集羣失去master節點是較大機率會發生的事,雖然服務可以最終恢復,可是漫長的選舉時間致使的註冊長期不可用是不能容忍的。
Eureka看明白了這一點,所以在設計時就優先保證可用性。Eureka各個節點都是平等的,幾個節點掛掉不會影響正常節點的工做,剩餘的節點依然能夠提供註冊和查詢服務。而Eureka的客戶端在向某個Eureka註冊或時若是發現鏈接失敗,則會自動切換至其它節點,只要有一臺Eureka還在,就能保證註冊服務可用(保證可用性),只不過查到的信息可能不是最新的(不保證強一致性)。除此以外,Eureka還有一種自我保護機制,若是在15分鐘內超過85%的節點都沒有正常的心跳,那麼Eureka就認爲客戶端與註冊中心出現了網絡故障,此時會出現如下幾種狀況:
1. Eureka再也不從註冊列表中移除由於長時間沒收到心跳而應該過時的服務
2. Eureka仍然可以接受新服務的註冊和查詢請求,可是不會被同步到其它節點上(即保證當前節點依然可用)
3. 當網絡穩定時,當前實例新的註冊信息會被同步到其它節點中
所以, Eureka能夠很好的應對因網絡故障致使部分節點失去聯繫的狀況,而不會像zookeeper那樣使整個註冊服務癱瘓。
Eureka做爲單純的服務註冊中心來講要比zookeeper更加「專業」,由於註冊服務更重要的是可用性,咱們能夠接受短時間內達不到一致性的情況。不過Eureka目前1.X版本的實現是基於servlet的java web應用,它的極限性能確定會受到影響。期待正在開發之中的2.X版本可以從servlet中獨立出來成爲單獨可部署執行的服務。
總結
今天我描述了一下Eureka是什麼,以及Eureka的基本組成與架構,最後作了與Dubbo的Zookeeper的對比,分析了兩個組件的優劣勢。下一講我講會進行把Eureka集成到咱們上一講的項目當中,並把Eureka進行集羣處理。