以Apollo配置中心為例淺析Eureka架構(gòu)

個人專題目錄


1、apollo配置中心整體架構(gòu)圖

overall-architecture.png

2、上圖簡要描述了Apollo的總體設計:

  • Config Service提供配置的讀取、推送等功能,服務對象是Apollo客戶端
  • Admin Service提供配置的修改、發(fā)布等功能,服務對象是Apollo Portal(管理界面)
  • Config Service和Admin Service都是多實例、無狀態(tài)部署,所以需要將自己注冊到Eureka中并保持心跳
  • 在Eureka之上我們架了一層Meta Server用于封裝Eureka的服務發(fā)現(xiàn)接口
  • Client通過域名訪問Meta Server獲取Config Service服務列表(IP+Port),而后直接通過IP+Port訪問服務,同時在Client側(cè)會做load balance、錯誤重試
  • Portal通過域名訪問Meta Server獲取Admin Service服務列表(IP+Port),而后直接通過IP+Port訪問服務,同時在Portal側(cè)會做load balance、錯誤重試
  • 為了簡化部署,我們實際上會把Config Service、Eureka和Meta Server三個邏輯角色部署在同一個JVM進程中

3、為什么我們采用Eureka作為服務注冊中心

它提供了完整的Service Registry和Service Discovery實現(xiàn)

  • 首先是提供了完整的實現(xiàn),并且也經(jīng)受住了Netflix自己的生產(chǎn)環(huán)境考驗,相對使用起來會比較省心。
  • 易于我們的應用程序中嵌入
  • 易于使用的Java客戶端集成
  • 易用與docker集成
  • 高可用性 (HA)
  • 簡單

和Spring Cloud無縫集成

  • 我們的項目本身就使用了Spring Cloud和Spring Boot,同時Spring Cloud還有一套非常完善的開源代碼來整合Eureka,所以使用起來非常方便。
  • 另外,Eureka還支持在我們應用自身的容器中啟動,也就是說我們的應用啟動完之后,既充當了Eureka的角色,同時也是服務的提供者。這樣就極大的提高了服務的可用性。
  • 這一點是我們選擇Eureka而不是zk、etcd等的主要原因,為了提高配置中心的可用性和降低部署復雜度,我們需要盡可能地減少外部依賴。
  • Open Source
  • 最后一點是開源,由于代碼是開源的,所以非常便于我們了解它的實現(xiàn)原理和排查問題。
Eureka Zookeeper Consul Etcd
嵌入在應用程序中的能力 Yes Difficult No No
易于使用的Java客戶端集成 Yes (Netflix offers an ecosystem with balancer and other features) Yes Yes No
易用與docker集成 No (Added) Yes Yes Yes
高可用性 (HA) Yes (AP) Yes (CP) Yes (CP) Yes (CP)
簡單的安裝/維護 Yes No No Yes

3.1、為什么要使用服務發(fā)現(xiàn)?

微服務系統(tǒng)中的服務發(fā)現(xiàn)機制

名稱 特點 備注
DNS 最原始的配置文件和 DNS 來做服務發(fā)現(xiàn),Host、端口都是寫在配置文件里的,發(fā)生變更的時候只能修改配置文件并重啟服務。所以當某臺機器掛掉的時候,依賴它上面服務的其他系統(tǒng)也都全部會出問題。而應急的步驟都是先在別的機器上運行新的實例,修改配置文件并重啟關聯(lián)的其他系統(tǒng)。這樣做費時、費力、且會有一個時間窗口內(nèi)系統(tǒng)無法提供服務。 DNS 變更延遲問題
通過 Nginx 來做了負載均衡/主備的 這樣做還是有兩個問題:(1)Nginx 本身成為一個故障點(2)連接數(shù)量翻倍,其中第二個問題曾導致我們的環(huán)境出現(xiàn)了 nf_conntrack table full 的問題。我們的關鍵服務都是多實例負載均衡的,當系統(tǒng)并發(fā)上升到一定程度的時候,某些服務器,尤其是跑著 Nginx 的機器很容易出現(xiàn)這個錯誤。 中心化負載均衡,單點問題
zk 服務實例注冊的 Node 類型是 ephemeral node,這種類型的節(jié)點只有在客戶端保持著連接的時候才有效。所以當某個服務實例被停止或者出現(xiàn)網(wǎng)絡異常的時候,對應的節(jié)點也會被刪掉。因此,任何時候從 ZooKeeper 里查詢到的都是當前活躍的實例。借助 ZooKeeper 的推送功能,服務的消費者可以得知實例的變化,從而可以從容應對服務實例的宕機和新實例的添加,無需重啟。 zk,多語言問題
etcd etcd是一個采用HTTP協(xié)議的健/值對存儲系統(tǒng),它是一個分布式和功能層次配置系統(tǒng),可用于構(gòu)建服務發(fā)現(xiàn)系統(tǒng)。其很容易部署、安裝和使用,提供了可靠的數(shù)據(jù)持久化特性。它是安全的并且文檔也十分齊全。etcd比Zookeeper是比更好的選擇,因為它很簡單,然而,它需要搭配一些第三方工具才可以提供服務發(fā)現(xiàn)功能。 coreos開發(fā),系統(tǒng)級別的
consul(go語言寫的) Consul是強一致性的數(shù)據(jù)存儲,使用gossip形成動態(tài)集群。它提供分級鍵/值存儲方式,不僅可以存儲數(shù)據(jù),而且可以用于注冊器件事各種任務,從發(fā)送數(shù)據(jù)改變通知到運行健康檢查和自定義命令,具體如何取決于它們的輸出。與Zookeeper和etcd不一樣,Consul內(nèi)嵌實現(xiàn)了服務發(fā)現(xiàn)系統(tǒng),所以這樣就不需要構(gòu)建自己的系統(tǒng)或使用第三方系統(tǒng)。這一發(fā)現(xiàn)系統(tǒng)除了上述提到的特性之外,還包括節(jié)點健康檢查和運行在其上的服務。Zookeeper和etcd只提供原始的鍵/值隊存儲,要求應用程序開發(fā)人員構(gòu)建他們自己的系統(tǒng)提供服務發(fā)現(xiàn)功能。而Consul提供了一個內(nèi)置的服務發(fā)現(xiàn)的框架??蛻糁恍枰苑詹⑼ㄟ^DNS或HTTP接口執(zhí)行服務發(fā)現(xiàn)。其他兩個工具需要一個親手制作的解決方案或借助于第三方工具。Consul為多種數(shù)據(jù)中心提供了開箱即用的原生支持,其中的gossip系統(tǒng)不僅可以工作在同一集群內(nèi)部的各個節(jié)點,而且還可以跨數(shù)據(jù)中心工作。
Netflix的Eureka方案 Eureka 由兩個組件組成: Eureka 服務器 和 Eureka 客戶端 。Eureka 服務器用作服務注冊服務器。Eureka 客戶端是一個 java 客戶端,用來簡化與服務器的交互、作為輪詢負載均衡器,并提供服務的故障切換支持。Netflix 在其生產(chǎn)環(huán)境中使用的是另外的客戶端,它提供基于流量、資源利用率以及出錯狀態(tài)的加權負載均衡當一個中間層服務首次啟動時,他會將自己注冊到 Eureka 中,以便讓客戶端找到它,同時每 30 秒發(fā)送一次心跳。如果一個服務在幾分鐘內(nèi)沒有發(fā)送心跳,它將從所有 Eureka 節(jié)點上注銷。一個 Amazon 域中可以有一個 Eureka 節(jié)點集群,每個可用區(qū)(Availability Zone)至少有一個 Eureka 節(jié)點。AWS 的域相互之間是隔離的。
為什么不用zookeeper做服務發(fā)現(xiàn) 為什么不應該使用ZooKeeper做服務發(fā)現(xiàn)
zk是滿足CP犧牲A,這個不對,看ZooKeeper和CAP理論及一致性原則 ,其實zk只是滿足最終一致性C,可用性A這個是保證的,并且保證一半的節(jié)點是最新的數(shù)據(jù),分區(qū)性P這個得看節(jié)點多少及讀寫情況,節(jié)點多,則寫耗時長,另外節(jié)點多了Leader選舉非常耗時, 就會放大網(wǎng)絡的問題,容易分區(qū)。 對于Service發(fā)現(xiàn)服務而言,寧可返回某服務5分鐘之前在哪幾個服務器上可用的信息,也不能因為暫時的網(wǎng)絡故障而找不到可用的服務器,而不返回任何結(jié)果。所以說,用ZooKeeper來做Service發(fā)現(xiàn)服務是肯定錯誤的??偨Y(jié)一句就是,service不是強一致的,所以會有部分情況下沒發(fā)現(xiàn)新服務導致請求出錯。當部分或者所有節(jié)點跟ZooKeeper斷開的情況下,每個節(jié)點還可以從本地緩存中獲取到數(shù)據(jù);但是,即便如此,ZooKeeper下所有節(jié)點不可能保證任何時候都能緩存所有的服務注冊信息。如果ZooKeeper下所有節(jié)點都斷開了,或者集群中出現(xiàn)了網(wǎng)絡分割的故障(注:由于交換機故障導致交換機底下的子網(wǎng)間不能互訪);那么ZooKeeper會將它們都從自己管理范圍中剔除出去,外界就不能訪問到這些節(jié)點了,即便這些節(jié)點本身是“健康”的,可以正常提供服務的;所以導致到達這些節(jié)點的服務請求被丟失了。 Eureka處理網(wǎng)絡問題導致分區(qū)。如果Eureka服務節(jié)點在短時間里丟失了大量的心跳連接(注:可能發(fā)生了網(wǎng)絡故障),那么這個Eureka節(jié)點會進入”自我保護模式“,同時保留那些“心跳死亡“的服務注冊信息不過期。此時,這個Eureka節(jié)點對于新的服務還能提供注冊服務,對于”死亡“的仍然保留,以防還有客戶端向其發(fā)起請求。當網(wǎng)絡故障恢復后,這個Eureka節(jié)點會退出”自我保護模式“。所以Eureka的哲學是,同時保留”好數(shù)據(jù)“與”壞數(shù)據(jù)“總比丟掉任何”好數(shù)據(jù)“要更好,所以這種模式在實踐中非常有效。 Eureka就是為發(fā)現(xiàn)服務所設計的,它有獨立的客戶端程序庫,同時提供心跳服務、服務健康監(jiān)測、自動發(fā)布服務與自動刷新緩存的功能。但是,如果使用ZooKeeper你必須自己來實現(xiàn)這些功能。

4、spring cloud架構(gòu)簡介:

4.1、spring cloud config 講解

01.png

4.2、spring cloud eureka講解

preview
    1. Service Provider會向Eureka Server做Register(服務注冊)、Renew(服務續(xù)約)、Cancel(服務下線)等操作。
    2. Eureka Server之間會做注冊服務的同步,從而保證狀態(tài)一致
    3. Service Consumer會向Eureka Server獲取注冊服務列表,并消費服務

5、CAP理論圖解

02.png

CAP理論的核心是:一個分布式系統(tǒng)不可能同時很好的滿足一致性,可用性和分區(qū)容錯性這三個需求,最多只能同時較好的滿足兩個。

因此,根據(jù)CAP原理將NoSQL數(shù)據(jù)庫分成了滿足CA原則 、滿足CP原則和滿足AP原則三大類:

CA- 單點集群,滿足一致性,可用性的系統(tǒng),通常在可擴展性上不太強大。

CP-滿足一致性,分區(qū)容忍性的系統(tǒng),通常性能不是特別高。

AP-滿足可用性,分區(qū)容忍性的系統(tǒng),通常可能對一致性要求低一點。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容