<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>

          為什么 Eureka 比 ZooKeeper 更適合做注冊中心?

          共 2859字,需瀏覽 6分鐘

           ·

          2020-11-10 23:59

          點(diǎn)擊“開發(fā)者技術(shù)前線”,選擇“星標(biāo)?”

          讓一部分開發(fā)者看到未來

          作者:jieqing
          來源:www.cnblogs.com/jieqing/p/8394001.html

          簡介

          Eureka本身是Netflix開源的一款提供服務(wù)注冊和發(fā)現(xiàn)的產(chǎn)品,并且提供了相應(yīng)的Java封裝。

          在它的實(shí)現(xiàn)中,節(jié)點(diǎn)之間相互平等,部分注冊中心的節(jié)點(diǎn)掛掉也不會對集群造成影響,即使集群只剩一個節(jié)點(diǎn)存活,也可以正常提供發(fā)現(xiàn)服務(wù)。哪怕是所有的服務(wù)注冊節(jié)點(diǎn)都掛了,Eureka Clients(客戶端)上也會緩存服務(wù)調(diào)用的信息。這就保證了我們微服務(wù)之間的互相調(diào)用足夠健壯。

          Zookeeper主要為大型分布式計(jì)算提供開源的分布式配置服務(wù)、同步服務(wù)和命名注冊。曾經(jīng)是Hadoop項(xiàng)目中的一個子項(xiàng)目,用來控制集群中的數(shù)據(jù),目前已升級為獨(dú)立的頂級項(xiàng)目。很多場景下也用它作為Service發(fā)現(xiàn)服務(wù)解決方案。

          對比

          在分布式系統(tǒng)中有個著名的CAP定理(C-數(shù)據(jù)一致性;A-服務(wù)可用性;P-服務(wù)對網(wǎng)絡(luò)分區(qū)故障的容錯性,這三個特性在任何分布式系統(tǒng)中不能同時滿足,最多同時滿足兩個);

          Zookeeper

          Zookeeper是基于CP來設(shè)計(jì)的,即任何時刻對Zookeeper的訪問請求能得到一致的數(shù)據(jù)結(jié)果,同時系統(tǒng)對網(wǎng)絡(luò)分割具備容錯性,但是它不能保證每次服務(wù)請求的可用性。

          從實(shí)際情況來分析,在使用Zookeeper獲取服務(wù)列表時,如果zookeeper正在選主,或者Zookeeper集群中半數(shù)以上機(jī)器不可用,那么將無法獲得數(shù)據(jù)。所以說,Zookeeper不能保證服務(wù)可用性。

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

          但是對于服務(wù)發(fā)現(xiàn)場景來說,情況就不太一樣了:針對同一個服務(wù),即使注冊中心的不同節(jié)點(diǎn)保存的服務(wù)提供者信息不盡相同,也并不會造成災(zāi)難性的后果。因?yàn)閷τ诜?wù)消費(fèi)者來說,能消費(fèi)才是最重要的——拿到可能不正確的服務(wù)實(shí)例信息后嘗試消費(fèi)一下,也好過因?yàn)闊o法獲取實(shí)例信息而不去消費(fèi)。(嘗試一下可以快速失敗,之后可以更新配置并重試)所以,對于服務(wù)發(fā)現(xiàn)而言,可用性比數(shù)據(jù)一致性更加重要——AP勝過CP。

          Eureka

          而Spring Cloud Netflix在設(shè)計(jì)Eureka時遵守的就是AP原則。Eureka Server也可以運(yùn)行多個實(shí)例來構(gòu)建集群,解決單點(diǎn)問題,但不同于ZooKeeper的選舉leader的過程,Eureka Server采用的是Peer to Peer對等通信。

          這是一種去中心化的架構(gòu),無master/slave區(qū)分,每一個Peer都是對等的。在這種架構(gòu)中,節(jié)點(diǎn)通過彼此互相注冊來提高可用性,每個節(jié)點(diǎn)需要添加一個或多個有效的serviceUrl指向其他節(jié)點(diǎn)。每個節(jié)點(diǎn)都可被視為其他節(jié)點(diǎn)的副本。

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

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

          默認(rèn)配置下,如果Eureka Server在一定時間內(nèi)沒有接收到某個服務(wù)實(shí)例的心跳,Eureka Server將會注銷該實(shí)例(默認(rèn)為90秒,通過eureka.instance.lease-expiration-duration-in-seconds配置)。當(dāng)Eureka Server節(jié)點(diǎn)在短時間內(nèi)丟失過多的心跳時(比如發(fā)生了網(wǎng)絡(luò)分區(qū)故障),那么這個節(jié)點(diǎn)就會進(jìn)入自我保護(hù)模式。

          關(guān)注公眾號Java技術(shù)棧,回復(fù):cloud,可以獲取我整理的 Spring Cloud 系列教程。

          「什么是自我保護(hù)模式?」

          默認(rèn)配置下,如果Eureka Server每分鐘收到心跳續(xù)約的數(shù)量低于一個閾值(instance的數(shù)量(60/每個instance的心跳間隔秒數(shù))自我保護(hù)系數(shù)),并且持續(xù)15分鐘,就會觸發(fā)自我保護(hù)。在自我保護(hù)模式中,Eureka Server會保護(hù)服務(wù)注冊表中的信息,不再注銷任何服務(wù)實(shí)例。

          當(dāng)它收到的心跳數(shù)重新恢復(fù)到閾值以上時,該Eureka Server節(jié)點(diǎn)就會自動退出自我保護(hù)模式。它的設(shè)計(jì)哲學(xué)前面提到過,那就是寧可保留錯誤的服務(wù)注冊信息,也不盲目注銷任何可能健康的服務(wù)實(shí)例。

          該模式可以通過eureka.server.enable-self-preservation = false來禁用,同時eureka.instance.lease-renewal-interval-in-seconds可以用來更改心跳間隔,eureka.server.renewal-percent-threshold可以用來修改自我保護(hù)系數(shù)(默認(rèn)0.85)。

          具體的實(shí)戰(zhàn)可參考《 Spring Cloud Eureka 自我保護(hù)機(jī)制實(shí)戰(zhàn)》這篇文章。

          總結(jié)

          ZooKeeper基于CP,不保證高可用,如果zookeeper正在選主,或者Zookeeper集群中半數(shù)以上機(jī)器不可用,那么將無法獲得數(shù)據(jù)。Eureka基于AP,能保證高可用,即使所有機(jī)器都掛了,也能拿到本地緩存的數(shù)據(jù)。

          作為注冊中心,其實(shí)配置是不經(jīng)常變動的,只有發(fā)版和機(jī)器出故障時會變。對于不經(jīng)常變動的配置來說,CP是不合適的,而AP在遇到問題時可以用犧牲一致性來保證可用性,既返回舊數(shù)據(jù),緩存數(shù)據(jù)。

          所以理論上Eureka是更適合做注冊中心。

          而現(xiàn)實(shí)環(huán)境中大部分項(xiàng)目可能會使用ZooKeeper,那是因?yàn)榧翰粔虼?,并且基本不會遇到用做注冊中心的機(jī)器一半以上都掛了的情況。所以實(shí)際上也沒什么大問題。

          參考:tech.lede.com/2017/03/15/rd/server/SpringCloud1/



          END


          后臺回復(fù)“電子書”?“資料”?領(lǐng)取一份干貨,數(shù)百面試手冊等你
          開發(fā)者技術(shù)前線 ,匯集技術(shù)前線快訊和關(guān)注行業(yè)趨勢,大廠干貨,是開發(fā)者經(jīng)歷和成長的優(yōu)秀指南。
          好文點(diǎn)個在看吧!
          瀏覽 91
          點(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>
                  青青青草国产 | 免费看黄片的网站 | 天天上天天干 | 久久人人爽人人爽人人av东京热 | 天天插插综合视频综合 |