<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          ZooKeeper、Eureka、Consul 、Nacos,微服務(wù)注冊中心怎么選?

          共 5008字,需瀏覽 11分鐘

           ·

          2021-06-14 12:56

          來源:blog.csdn.net/fly910905/article/details/100023415

          前言

          服務(wù)注冊中心本質(zhì)上是為了解耦服務(wù)提供者和服務(wù)消費(fèi)者。對于任何一個微服務(wù),原則上都應(yīng)存在或者支持多個提供者,這是由微服務(wù)的分布式屬性決定的。更進(jìn)一步,為了支持彈性擴(kuò)縮容特性,一個微服務(wù)的提供者的數(shù)量和分布往往是動態(tài)變化的,也是無法預(yù)先確定的。因此,原本在單體應(yīng)用階段常用的靜態(tài)LB機(jī)制就不再適用了,需要引入額外的組件來管理微服務(wù)提供者的注冊與發(fā)現(xiàn),而這個組件就是服務(wù)注冊中心。

          CAP理論

          CAP理論是分布式架構(gòu)中重要理論

          • 一致性(Consistency) (所有節(jié)點(diǎn)在同一時間具有相同的數(shù)據(jù))
          • 可用性(Availability) (保證每個請求不管成功或者失敗都有響應(yīng))
          • 分隔容忍(Partition tolerance) (系統(tǒng)中任意信息的丟失或失敗不會影響系統(tǒng)的繼續(xù)運(yùn)作)

          關(guān)于 P 的理解,我覺得是在整個系統(tǒng)中某個部分,掛掉了,或者宕機(jī)了,并不影響整個系統(tǒng)的運(yùn)作或者說使用,而可用性是,某個系統(tǒng)的某個節(jié)點(diǎn)掛了,但是并不影響系統(tǒng)的接受或者發(fā)出請求,CAP 不可能都取,只能取其中2個原因是 如果C是第一需求的話,那么會影響A的性能,因?yàn)橐獢?shù)據(jù)同步,不然請求結(jié)果會有差異,但是數(shù)據(jù)同步會消耗時間,期間可用性就會降低。

          如果A是第一需求,那么只要有一個服務(wù)在,就能正常接受請求,但是對與返回結(jié)果變不能保證,原因是,在分布式部署的時候,數(shù)據(jù)一致的過程不可能想切線路那么快。

          再如果,同事滿足一致性和可用性,那么分區(qū)容錯就很難保證了,也就是單點(diǎn),也是分布式的基本核心,好了,明白這些理論,就可以在相應(yīng)的場景選取服務(wù)注冊與發(fā)現(xiàn)了

          服務(wù)注冊中心解決方案

          設(shè)計或者選型一個服務(wù)注冊中心,首先要考慮的就是服務(wù)注冊與發(fā)現(xiàn)機(jī)制。縱觀當(dāng)下各種主流的服務(wù)注冊中心解決方案,大致可歸為三類:

          • 應(yīng)用內(nèi):直接集成到應(yīng)用中,依賴于應(yīng)用自身完成服務(wù)的注冊與發(fā)現(xiàn),最典型的是Netflix提供的Eureka
          • 應(yīng)用外:把應(yīng)用當(dāng)成黑盒,通過應(yīng)用外的某種機(jī)制將服務(wù)注冊到注冊中心,最小化對應(yīng)用的侵入性,比如Airbnb的SmartStack,HashiCorp的Consul
          • DNS:將服務(wù)注冊為DNS的SRV記錄,嚴(yán)格來說,是一種特殊的應(yīng)用外注冊方式,SkyDNS是其中的代表

          注1: 對于第一類注冊方式,除了Eureka這種一站式解決方案,還可以基于ZooKeeper或者Etcd自行實(shí)現(xiàn)一套服務(wù)注冊機(jī)制,這在大公司比較常見,但對于小公司而言顯然性價比太低。

          注2: 由于DNS固有的緩存缺陷,本文不對第三類注冊方式作深入探討。

          除了基本的服務(wù)注冊與發(fā)現(xiàn)機(jī)制,從開發(fā)和運(yùn)維角度,至少還要考慮如下五個方面:

          • 測活:服務(wù)注冊之后,如何對服務(wù)進(jìn)行測活以保證服務(wù)的可用性?
          • 負(fù)載均衡:當(dāng)存在多個服務(wù)提供者時,如何均衡各個提供者的負(fù)載?
          • 集成:在服務(wù)提供端或者調(diào)用端,如何集成注冊中心?
          • 運(yùn)行時依賴:引入注冊中心之后,對應(yīng)用的運(yùn)行時環(huán)境有何影響?
          • 可用性:如何保證注冊中心本身的可用性,特別是消除單點(diǎn)故障?

          主流注冊中心產(chǎn)品

          軟件產(chǎn)品特性并非一成不變,如果發(fā)現(xiàn)功能特性有變更,歡迎評論指正

          • Consul是支持自動注銷服務(wù)實(shí)例, 請見文檔:https://www.consul.io/api-docs/agent/service,在check的 DeregisterCriticalServiceAfter 這個參數(shù)-- 感謝@超帥的菜鳥博主提供最新信息
          • 新版本的Dubbo也擴(kuò)展了對 Consul 的支持。參考: https://github.com/apache/dubbo/tree/master/dubbo-registry


          Apache Zookeeper -> CP

          與 Eureka 有所不同,Apache Zookeeper 在設(shè)計時就緊遵CP原則,即任何時候?qū)?Zookeeper 的訪問請求能得到一致的數(shù)據(jù)結(jié)果,同時系統(tǒng)對網(wǎng)絡(luò)分割具備容錯性,但是 Zookeeper 不能保證每次服務(wù)請求都是可達(dá)的。

          從 Zookeeper 的實(shí)際應(yīng)用情況來看,在使用 Zookeeper 獲取服務(wù)列表時,如果此時的 Zookeeper 集群中的 Leader 宕機(jī)了,該集群就要進(jìn)行 Leader 的選舉,又或者 Zookeeper 集群中半數(shù)以上服務(wù)器節(jié)點(diǎn)不可用(例如有三個節(jié)點(diǎn),如果節(jié)點(diǎn)一檢測到節(jié)點(diǎn)三掛了 ,節(jié)點(diǎn)二也檢測到節(jié)點(diǎn)三掛了,那這個節(jié)點(diǎn)才算是真的掛了),那么將無法處理該請求。所以說,Zookeeper 不能保證服務(wù)可用性。

          當(dāng)然,在大多數(shù)分布式環(huán)境中,尤其是涉及到數(shù)據(jù)存儲的場景,數(shù)據(jù)一致性應(yīng)該是首先被保證的,這也是 Zookeeper 設(shè)計緊遵CP原則的另一個原因。

          但是對于服務(wù)發(fā)現(xiàn)來說,情況就不太一樣了,針對同一個服務(wù),即使注冊中心的不同節(jié)點(diǎn)保存的服務(wù)提供者信息不盡相同,也并不會造成災(zāi)難性的后果。

          因?yàn)閷τ诜?wù)消費(fèi)者來說,能消費(fèi)才是最重要的,消費(fèi)者雖然拿到可能不正確的服務(wù)實(shí)例信息后嘗試消費(fèi)一下,也要勝過因?yàn)闊o法獲取實(shí)例信息而不去消費(fèi),導(dǎo)致系統(tǒng)異常要好(淘寶的雙十一,京東的618就是緊遵AP的最好參照)。

          當(dāng)master節(jié)點(diǎn)因?yàn)榫W(wǎng)絡(luò)故障與其他節(jié)點(diǎn)失去聯(lián)系時,剩余節(jié)點(diǎn)會重新進(jìn)行l(wèi)eader選舉。問題在于,選舉leader的時間太長,30~120s,而且選舉期間整個zk集群都是不可用的,這就導(dǎo)致在選舉期間注冊服務(wù)癱瘓。

          在云部署環(huán)境下, 因?yàn)榫W(wǎng)絡(luò)問題使得zk集群失去master節(jié)點(diǎn)是大概率事件,雖然服務(wù)能最終恢復(fù),但是漫長的選舉事件導(dǎo)致注冊長期不可用是不能容忍的。

          Spring Cloud Eureka  -> AP

          Spring Cloud Netflix 在設(shè)計 Eureka 時就緊遵AP原則(盡管現(xiàn)在2.0發(fā)布了,但是由于其閉源的原因 ,但是目前 Ereka 1.x 任然是比較活躍的)。

          Eureka Server 也可以運(yùn)行多個實(shí)例來構(gòu)建集群,解決單點(diǎn)問題,但不同于 ZooKeeper 的選舉 leader 的過程,Eureka Server 采用的是Peer to Peer 對等通信。這是一種去中心化的架構(gòu),無 master/slave 之分,每一個 Peer 都是對等的。在這種架構(gòu)風(fēng)格中,節(jié)點(diǎn)通過彼此互相注冊來提高可用性,每個節(jié)點(diǎn)需要添加一個或多個有效的 serviceUrl 指向其他節(jié)點(diǎn)。每個節(jié)點(diǎn)都可被視為其他節(jié)點(diǎn)的副本。

          在集群環(huán)境中如果某臺 Eureka Server 宕機(jī),Eureka Client 的請求會自動切換到新的 Eureka Server 節(jié)點(diǎn)上,當(dāng)宕機(jī)的服務(wù)器重新恢復(fù)后,Eureka 會再次將其納入到服務(wù)器集群管理之中。當(dāng)節(jié)點(diǎn)開始接受客戶端請求時,所有的操作都會在節(jié)點(diǎn)間進(jìn)行復(fù)制(replicate To Peer)操作,將請求復(fù)制到該 Eureka Server 當(dāng)前所知的其它所有節(jié)點(diǎn)中。

          當(dāng)一個新的 Eureka Server 節(jié)點(diǎn)啟動后,會首先嘗試從鄰近節(jié)點(diǎn)獲取所有注冊列表信息,并完成初始化。Eureka Server 通過 getEurekaServiceUrls() 方法獲取所有的節(jié)點(diǎn),并且會通過心跳契約的方式定期更新。

          默認(rèn)情況下,如果 Eureka Server 在一定時間內(nèi)沒有接收到某個服務(wù)實(shí)例的心跳(默認(rèn)周期為30秒),Eureka Server 將會注銷該實(shí)例(默認(rèn)為90秒, eureka.instance.lease-expiration-duration-in-seconds 進(jìn)行自定義配置)。

          當(dāng) Eureka Server 節(jié)點(diǎn)在短時間內(nèi)丟失過多的心跳時,那么這個節(jié)點(diǎn)就會進(jìn)入自我保護(hù)模式。

          Eureka的集群中,只要有一臺Eureka還在,就能保證注冊服務(wù)可用(保證可用性),只不過查到的信息可能不是最新的(不保證強(qiáng)一致性)。除此之外,Eureka還有一種自我保護(hù)機(jī)制,如果在15分鐘內(nèi)超過85%的節(jié)點(diǎn)都沒有正常的心跳,那么Eureka就認(rèn)為客戶端與注冊中心出現(xiàn)了網(wǎng)絡(luò)故障,此時會出現(xiàn)以下幾種情況:

          1. Eureka不再從注冊表中移除因?yàn)殚L時間沒有收到心跳而過期的服務(wù);
          2. Eureka仍然能夠接受新服務(wù)注冊和查詢請求,但是不會被同步到其它節(jié)點(diǎn)上(即保證當(dāng)前節(jié)點(diǎn)依然可用);
          3. 當(dāng)網(wǎng)絡(luò)穩(wěn)定時,當(dāng)前實(shí)例新注冊的信息會被同步到其它節(jié)點(diǎn)中;

          因此,Eureka可以很好的應(yīng)對因網(wǎng)絡(luò)故障導(dǎo)致部分節(jié)點(diǎn)失去聯(lián)系的情況,而不會像zookeeper那樣使得整個注冊服務(wù)癱瘓。

          Consul

          Consul 是 HashiCorp 公司推出的開源工具,用于實(shí)現(xiàn)分布式系統(tǒng)的服務(wù)發(fā)現(xiàn)與配置。Consul 使用 Go 語言編寫,因此具有天然可移植性(支持Linux、windows和Mac OS X)。

          Consul 內(nèi)置了服務(wù)注冊與發(fā)現(xiàn)框架、分布一致性協(xié)議實(shí)現(xiàn)、健康檢查、Key/Value 存儲、多數(shù)據(jù)中心方案,不再需要依賴其他工具(比如 ZooKeeper 等),使用起來也較為簡單。

          Consul 遵循CAP原理中的CP原則,保證了強(qiáng)一致性和分區(qū)容錯性,且使用的是Raft算法,比zookeeper使用的Paxos算法更加簡單。雖然保證了強(qiáng)一致性,但是可用性就相應(yīng)下降了,例如服務(wù)注冊的時間會稍長一些,因?yàn)?Consul 的 raft 協(xié)議要求必須過半數(shù)的節(jié)點(diǎn)都寫入成功才認(rèn)為注冊成功 ;在leader掛掉了之后,重新選舉出leader之前會導(dǎo)致Consul 服務(wù)不可用。

          Consul本質(zhì)上屬于應(yīng)用外的注冊方式,但可以通過SDK簡化注冊流程。而服務(wù)發(fā)現(xiàn)恰好相反,默認(rèn)依賴于SDK,但可以通過Consul Template(下文會提到)去除SDK依賴。

          Consul Template

          Consul,默認(rèn)服務(wù)調(diào)用者需要依賴Consul SDK來發(fā)現(xiàn)服務(wù),這就無法保證對應(yīng)用的零侵入性。

          所幸通過Consul Template,可以定時從Consul集群獲取最新的服務(wù)提供者列表并刷新LB配置(比如nginx的upstream),這樣對于服務(wù)調(diào)用者而言,只需要配置一個統(tǒng)一的服務(wù)調(diào)用地址即可。

          Consul強(qiáng)一致性(C)帶來的是:

          • 服務(wù)注冊相比Eureka會稍慢一些。因?yàn)镃onsul的raft協(xié)議要求必須過半數(shù)的節(jié)點(diǎn)都寫入成功才認(rèn)為注冊成功
          • Leader掛掉時,重新選舉期間整個consul不可用。保證了強(qiáng)一致性但犧牲了可用性。

          Eureka保證高可用(A)和最終一致性:

          • 服務(wù)注冊相對要快,因?yàn)椴恍枰茸孕畔eplicate到其他節(jié)點(diǎn),也不保證注冊信息是否replicate成功
          • 當(dāng)數(shù)據(jù)出現(xiàn)不一致時,雖然A, B上的注冊信息不完全相同,但每個Eureka節(jié)點(diǎn)依然能夠正常對外提供服務(wù),這會出現(xiàn)查詢服務(wù)信息時如果請求A查不到,但請求B就能查到。如此保證了可用性但犧牲了一致性。

          其他方面,eureka就是個servlet程序,跑在servlet容器中; Consul則是go編寫而成。

          Nacos

          Nacos是阿里開源的,Nacos 支持基于 DNS 和基于 RPC 的服務(wù)發(fā)現(xiàn)。在Spring Cloud中使用Nacos,只需要先下載 Nacos 并啟動 Nacos server,Nacos只需要簡單的配置就可以完成服務(wù)的注冊發(fā)現(xiàn)。

          Nacos除了服務(wù)的注冊發(fā)現(xiàn)之外,還支持動態(tài)配置服務(wù)。動態(tài)配置服務(wù)可以讓您以中心化、外部化和動態(tài)化的方式管理所有環(huán)境的應(yīng)用配置和服務(wù)配置。動態(tài)配置消除了配置變更時重新部署應(yīng)用和服務(wù)的需要,讓配置管理變得更加高效和敏捷。配置中心化管理讓實(shí)現(xiàn)無狀態(tài)服務(wù)變得更簡單,讓服務(wù)按需彈性擴(kuò)展變得更容易。

          一句話概括就是Nacos = Spring Cloud注冊中心 + Spring Cloud配置中心。

          關(guān)注公眾號【Java技術(shù)江湖】后回復(fù)“PDF”即可領(lǐng)取200+頁的《Java工程師面試指南》

          強(qiáng)烈推薦,幾乎涵蓋所有Java工程師必知必會的知識點(diǎn),不管是復(fù)習(xí)還是面試,都很實(shí)用。



          瀏覽 41
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产精品福利视频 | 69自拍| 黄色操逼小视频国产无码 | 大香蕉久久艹 | 色逼123|