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

個人專題目錄


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

overall-architecture.png

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

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

3仙辟、為什么我們采用Eureka作為服務(wù)注冊中心

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

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

和Spring Cloud無縫集成

  • 我們的項目本身就使用了Spring Cloud和Spring Boot未檩,同時Spring Cloud還有一套非常完善的開源代碼來整合Eureka,所以使用起來非常方便粟焊。
  • 另外冤狡,Eureka還支持在我們應(yīng)用自身的容器中啟動,也就是說我們的應(yīng)用啟動完之后项棠,既充當(dāng)了Eureka的角色悲雳,同時也是服務(wù)的提供者。這樣就極大的提高了服務(wù)的可用性香追。
  • 這一點是我們選擇Eureka而不是zk合瓢、etcd等的主要原因,為了提高配置中心的可用性和降低部署復(fù)雜度透典,我們需要盡可能地減少外部依賴晴楔。
  • Open Source
  • 最后一點是開源顿苇,由于代碼是開源的,所以非常便于我們了解它的實現(xiàn)原理和排查問題税弃。
Eureka Zookeeper Consul Etcd
嵌入在應(yīng)用程序中的能力 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纪岁、為什么要使用服務(wù)發(fā)現(xiàn)?

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

名稱 特點 備注
DNS 最原始的配置文件和 DNS 來做服務(wù)發(fā)現(xiàn),Host钙皮、端口都是寫在配置文件里的蜂科,發(fā)生變更的時候只能修改配置文件并重啟服務(wù)顽决。所以當(dāng)某臺機器掛掉的時候短条,依賴它上面服務(wù)的其他系統(tǒng)也都全部會出問題。而應(yīng)急的步驟都是先在別的機器上運行新的實例才菠,修改配置文件并重啟關(guān)聯(lián)的其他系統(tǒng)茸时。這樣做費時、費力赋访、且會有一個時間窗口內(nèi)系統(tǒng)無法提供服務(wù)可都。 DNS 變更延遲問題
通過 Nginx 來做了負載均衡/主備的 這樣做還是有兩個問題:(1)Nginx 本身成為一個故障點(2)連接數(shù)量翻倍,其中第二個問題曾導(dǎo)致我們的環(huán)境出現(xiàn)了 nf_conntrack table full 的問題蚓耽。我們的關(guān)鍵服務(wù)都是多實例負載均衡的渠牲,當(dāng)系統(tǒng)并發(fā)上升到一定程度的時候,某些服務(wù)器步悠,尤其是跑著 Nginx 的機器很容易出現(xiàn)這個錯誤签杈。 中心化負載均衡,單點問題
zk 服務(wù)實例注冊的 Node 類型是 ephemeral node鼎兽,這種類型的節(jié)點只有在客戶端保持著連接的時候才有效答姥。所以當(dāng)某個服務(wù)實例被停止或者出現(xiàn)網(wǎng)絡(luò)異常的時候,對應(yīng)的節(jié)點也會被刪掉谚咬。因此鹦付,任何時候從 ZooKeeper 里查詢到的都是當(dāng)前活躍的實例。借助 ZooKeeper 的推送功能择卦,服務(wù)的消費者可以得知實例的變化敲长,從而可以從容應(yīng)對服務(wù)實例的宕機和新實例的添加,無需重啟秉继。 zk祈噪,多語言問題
etcd etcd是一個采用HTTP協(xié)議的健/值對存儲系統(tǒng),它是一個分布式和功能層次配置系統(tǒng)秕噪,可用于構(gòu)建服務(wù)發(fā)現(xiàn)系統(tǒng)钳降。其很容易部署、安裝和使用腌巾,提供了可靠的數(shù)據(jù)持久化特性遂填。它是安全的并且文檔也十分齊全铲觉。etcd比Zookeeper是比更好的選擇,因為它很簡單吓坚,然而撵幽,它需要搭配一些第三方工具才可以提供服務(wù)發(fā)現(xiàn)功能。 coreos開發(fā)礁击,系統(tǒng)級別的
consul(go語言寫的) Consul是強一致性的數(shù)據(jù)存儲盐杂,使用gossip形成動態(tài)集群。它提供分級鍵/值存儲方式哆窿,不僅可以存儲數(shù)據(jù)链烈,而且可以用于注冊器件事各種任務(wù),從發(fā)送數(shù)據(jù)改變通知到運行健康檢查和自定義命令挚躯,具體如何取決于它們的輸出强衡。與Zookeeper和etcd不一樣,Consul內(nèi)嵌實現(xiàn)了服務(wù)發(fā)現(xiàn)系統(tǒng)码荔,所以這樣就不需要構(gòu)建自己的系統(tǒng)或使用第三方系統(tǒng)漩勤。這一發(fā)現(xiàn)系統(tǒng)除了上述提到的特性之外,還包括節(jié)點健康檢查和運行在其上的服務(wù)缩搅。Zookeeper和etcd只提供原始的鍵/值隊存儲越败,要求應(yīng)用程序開發(fā)人員構(gòu)建他們自己的系統(tǒng)提供服務(wù)發(fā)現(xiàn)功能。而Consul提供了一個內(nèi)置的服務(wù)發(fā)現(xiàn)的框架硼瓣【糠桑客戶只需要注冊服務(wù)并通過DNS或HTTP接口執(zhí)行服務(wù)發(fā)現(xiàn)。其他兩個工具需要一個親手制作的解決方案或借助于第三方工具巨双。Consul為多種數(shù)據(jù)中心提供了開箱即用的原生支持噪猾,其中的gossip系統(tǒng)不僅可以工作在同一集群內(nèi)部的各個節(jié)點,而且還可以跨數(shù)據(jù)中心工作筑累。
Netflix的Eureka方案 Eureka 由兩個組件組成: Eureka 服務(wù)器 和 Eureka 客戶端 袱蜡。Eureka 服務(wù)器用作服務(wù)注冊服務(wù)器。Eureka 客戶端是一個 java 客戶端慢宗,用來簡化與服務(wù)器的交互坪蚁、作為輪詢負載均衡器,并提供服務(wù)的故障切換支持镜沽。Netflix 在其生產(chǎn)環(huán)境中使用的是另外的客戶端敏晤,它提供基于流量、資源利用率以及出錯狀態(tài)的加權(quán)負載均衡當(dāng)一個中間層服務(wù)首次啟動時缅茉,他會將自己注冊到 Eureka 中嘴脾,以便讓客戶端找到它,同時每 30 秒發(fā)送一次心跳。如果一個服務(wù)在幾分鐘內(nèi)沒有發(fā)送心跳译打,它將從所有 Eureka 節(jié)點上注銷耗拓。一個 Amazon 域中可以有一個 Eureka 節(jié)點集群,每個可用區(qū)(Availability Zone)至少有一個 Eureka 節(jié)點奏司。AWS 的域相互之間是隔離的乔询。
為什么不用zookeeper做服務(wù)發(fā)現(xiàn) 為什么不應(yīng)該使用ZooKeeper做服務(wù)發(fā)現(xiàn)
zk是滿足CP犧牲A,這個不對韵洋,看ZooKeeper和CAP理論及一致性原則 竿刁,其實zk只是滿足最終一致性C,可用性A這個是保證的搪缨,并且保證一半的節(jié)點是最新的數(shù)據(jù)食拜,分區(qū)性P這個得看節(jié)點多少及讀寫情況,節(jié)點多勉吻,則寫耗時長监婶,另外節(jié)點多了Leader選舉非常耗時, 就會放大網(wǎng)絡(luò)的問題,容易分區(qū)齿桃。 對于Service發(fā)現(xiàn)服務(wù)而言,寧可返回某服務(wù)5分鐘之前在哪幾個服務(wù)器上可用的信息煮盼,也不能因為暫時的網(wǎng)絡(luò)故障而找不到可用的服務(wù)器短纵,而不返回任何結(jié)果。所以說僵控,用ZooKeeper來做Service發(fā)現(xiàn)服務(wù)是肯定錯誤的香到。總結(jié)一句就是报破,service不是強一致的悠就,所以會有部分情況下沒發(fā)現(xiàn)新服務(wù)導(dǎo)致請求出錯。當(dāng)部分或者所有節(jié)點跟ZooKeeper斷開的情況下充易,每個節(jié)點還可以從本地緩存中獲取到數(shù)據(jù)梗脾;但是,即便如此盹靴,ZooKeeper下所有節(jié)點不可能保證任何時候都能緩存所有的服務(wù)注冊信息炸茧。如果ZooKeeper下所有節(jié)點都斷開了,或者集群中出現(xiàn)了網(wǎng)絡(luò)分割的故障(注:由于交換機故障導(dǎo)致交換機底下的子網(wǎng)間不能互訪)稿静;那么ZooKeeper會將它們都從自己管理范圍中剔除出去梭冠,外界就不能訪問到這些節(jié)點了,即便這些節(jié)點本身是“健康”的改备,可以正常提供服務(wù)的控漠;所以導(dǎo)致到達這些節(jié)點的服務(wù)請求被丟失了。 Eureka處理網(wǎng)絡(luò)問題導(dǎo)致分區(qū)悬钳。如果Eureka服務(wù)節(jié)點在短時間里丟失了大量的心跳連接(注:可能發(fā)生了網(wǎng)絡(luò)故障)盐捷,那么這個Eureka節(jié)點會進入”自我保護模式“柬脸,同時保留那些“心跳死亡“的服務(wù)注冊信息不過期。此時毙驯,這個Eureka節(jié)點對于新的服務(wù)還能提供注冊服務(wù)倒堕,對于”死亡“的仍然保留,以防還有客戶端向其發(fā)起請求爆价。當(dāng)網(wǎng)絡(luò)故障恢復(fù)后垦巴,這個Eureka節(jié)點會退出”自我保護模式“。所以Eureka的哲學(xué)是铭段,同時保留”好數(shù)據(jù)“與”壞數(shù)據(jù)“總比丟掉任何”好數(shù)據(jù)“要更好骤宣,所以這種模式在實踐中非常有效。 Eureka就是為發(fā)現(xiàn)服務(wù)所設(shè)計的序愚,它有獨立的客戶端程序庫憔披,同時提供心跳服務(wù)、服務(wù)健康監(jiān)測爸吮、自動發(fā)布服務(wù)與自動刷新緩存的功能芬膝。但是,如果使用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(服務(wù)注冊)癣缅、Renew(服務(wù)續(xù)約)、Cancel(服務(wù)下線)等操作哄酝。
    2. Eureka Server之間會做注冊服務(wù)的同步友存,從而保證狀態(tài)一致
    3. Service Consumer會向Eureka Server獲取注冊服務(wù)列表,并消費服務(wù)

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)拖叙,通常可能對一致性要求低一點赂乐。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末薯鳍,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子挨措,更是在濱河造成了極大的恐慌挖滤,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件浅役,死亡現(xiàn)場離奇詭異斩松,居然都是意外死亡,警方通過查閱死者的電腦和手機觉既,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門惧盹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人瞪讼,你說我怎么就攤上這事钧椰。” “怎么了尝艘?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵演侯,是天一觀的道長。 經(jīng)常有香客問我背亥,道長,這世上最難降的妖魔是什么悬赏? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任狡汉,我火速辦了婚禮,結(jié)果婚禮上闽颇,老公的妹妹穿的比我還像新娘盾戴。我一直安慰自己,他們只是感情好兵多,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布尖啡。 她就那樣靜靜地躺著,像睡著了一般剩膘。 火紅的嫁衣襯著肌膚如雪衅斩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天怠褐,我揣著相機與錄音畏梆,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛奠涌,可吹牛的內(nèi)容都是我干的宪巨。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼溜畅,長吁一口氣:“原來是場噩夢啊……” “哼捏卓!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起慈格,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤怠晴,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后峦椰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體龄寞,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年汤功,在試婚紗的時候發(fā)現(xiàn)自己被綠了物邑。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡滔金,死狀恐怖色解,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情餐茵,我是刑警寧澤科阎,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站忿族,受9級特大地震影響锣笨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜道批,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一错英、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧隆豹,春花似錦椭岩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至碉考,卻和暖如春塌计,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背豆励。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工夺荒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留瞒渠,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓技扼,卻偏偏與公主長得像伍玖,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子剿吻,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容