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

Java技術棧
www.javastack.cn
關注閱讀更多優(yōu)質(zhì)文章
來源:www.cnblogs.com/jieqing/p/8394001.html
簡介
Eureka本身是Netflix開源的一款提供服務注冊和發(fā)現(xiàn)的產(chǎn)品,并且提供了相應的Java封裝。
在它的實現(xiàn)中,節(jié)點之間相互平等,部分注冊中心的節(jié)點掛掉也不會對集群造成影響,即使集群只剩一個節(jié)點存活,也可以正常提供發(fā)現(xiàn)服務。哪怕是所有的服務注冊節(jié)點都掛了,Eureka Clients(客戶端)上也會緩存服務調(diào)用的信息。這就保證了我們微服務之間的互相調(diào)用足夠健壯。
Zookeeper主要為大型分布式計算提供開源的分布式配置服務、同步服務和命名注冊。曾經(jīng)是Hadoop項目中的一個子項目,用來控制集群中的數(shù)據(jù),目前已升級為獨立的頂級項目。很多場景下也用它作為Service發(fā)現(xiàn)服務解決方案。
對比
在分布式系統(tǒng)中有個著名的CAP定理(C-數(shù)據(jù)一致性;A-服務可用性;P-服務對網(wǎng)絡分區(qū)故障的容錯性,這三個特性在任何分布式系統(tǒng)中不能同時滿足,最多同時滿足兩個);
Zookeeper
誠然,在大多數(shù)分布式環(huán)境中,尤其是涉及到數(shù)據(jù)存儲的場景,數(shù)據(jù)一致性應該是首先被保證的,這也是zookeeper設計成CP的原因。
Eureka
而Spring Cloud Netflix在設計Eureka時遵守的就是AP原則。Eureka Server也可以運行多個實例來構建集群,解決單點問題,但不同于ZooKeeper的選舉leader的過程,Eureka Server采用的是Peer to Peer對等通信。
這是一種去中心化的架構,無master/slave區(qū)分,每一個Peer都是對等的。在這種架構中,節(jié)點通過彼此互相注冊來提高可用性,每個節(jié)點需要添加一個或多個有效的serviceUrl指向其他節(jié)點。每個節(jié)點都可被視為其他節(jié)點的副本。
如果某臺Eureka Server宕機,Eureka Client的請求會自動切換到新的Eureka Server節(jié)點,當宕機的服務器重新恢復后,Eureka會再次將其納入到服務器集群管理之中。當節(jié)點開始接受客戶端請求時,所有的操作都會進行replicateToPeer(節(jié)點間復制)操作,將請求復制到其他Eureka Server當前所知的所有節(jié)點中。
一個新的Eureka Server節(jié)點啟動后,會首先嘗試從鄰近節(jié)點獲取所有實例注冊表信息,完成初始化。Eureka Server通過getEurekaServiceUrls()方法獲取所有的節(jié)點,并且會通過心跳續(xù)約的方式定期更新。
默認配置下,如果Eureka Server在一定時間內(nèi)沒有接收到某個服務實例的心跳,Eureka Server將會注銷該實例(默認為90秒,通過eureka.instance.lease-expiration-duration-in-seconds配置)。當Eureka Server節(jié)點在短時間內(nèi)丟失過多的心跳時(比如發(fā)生了網(wǎng)絡分區(qū)故障),那么這個節(jié)點就會進入自我保護模式。
關注公眾號Java技術棧,回復:cloud,可以獲取我整理的 Spring Cloud 系列教程。
「什么是自我保護模式?」
默認配置下,如果Eureka Server每分鐘收到心跳續(xù)約的數(shù)量低于一個閾值(instance的數(shù)量(60/每個instance的心跳間隔秒數(shù))自我保護系數(shù)),并且持續(xù)15分鐘,就會觸發(fā)自我保護。在自我保護模式中,Eureka Server會保護服務注冊表中的信息,不再注銷任何服務實例。
當它收到的心跳數(shù)重新恢復到閾值以上時,該Eureka Server節(jié)點就會自動退出自我保護模式。它的設計哲學前面提到過,那就是寧可保留錯誤的服務注冊信息,也不盲目注銷任何可能健康的服務實例。
該模式可以通過eureka.server.enable-self-preservation = false來禁用,同時eureka.instance.lease-renewal-interval-in-seconds可以用來更改心跳間隔,eureka.server.renewal-percent-threshold可以用來修改自我保護系數(shù)(默認0.85)。
具體的實戰(zhàn)可參考《 Spring Cloud Eureka 自我保護機制實戰(zhàn)》這篇文章。
總結
作為注冊中心,其實配置是不經(jīng)常變動的,只有發(fā)版和機器出故障時會變。對于不經(jīng)常變動的配置來說,CP是不合適的,而AP在遇到問題時可以用犧牲一致性來保證可用性,既返回舊數(shù)據(jù),緩存數(shù)據(jù)。
所以理論上Eureka是更適合做注冊中心。
而現(xiàn)實環(huán)境中大部分項目可能會使用ZooKeeper,那是因為集群不夠大,并且基本不會遇到用做注冊中心的機器一半以上都掛了的情況。所以實際上也沒什么大問題。
參考:tech.lede.com/2017/03/15/rd/server/SpringCloud1/






關注Java技術棧看更多干貨


