在分佈式系統中,有一個重要的理論,即CAP理論.即C-一致性,A-高可用性,P-服務對網絡分區故障的容錯性(除非整個網絡發生故障,分佈式服務不能由於單點的網絡故障而徹底癱瘓).這三個特性,在任何的分佈式系統中,都只能知足其中兩個.算法
Zookeeper 是著名 Hadoop 的一個子項目,不少場景下 Zookeeper 也做爲 Service 發現服務解決方案.Zookeeper 保證的是 CP,即任什麼時候刻對Zookeeper進行訪問,都會獲得一致的結果,可是它不能保證服務的高可用性.例如,當zookeeper集羣正在進行選主操做的時候,或者zookeeper集羣有半數以上的機器不可用時.緩存
Eureka是Netflix開源的一款服務註冊與發現產品,並提供了基於Java的封裝.在它的實現理念中,全部的節點都是平等的.Eureka保證的是AP.一個節點掛掉,不會影響到其餘的節點提供服務.哪怕是全部的服務所有掛掉,Eureka Client也會根據緩存的服務列表,盡最大可能保證調用是連同的.服務器
Spring Cloud Eureka 是 Spring Cloud Netflix 微服務套件的一部分,基於 Netflix Eureka
作了二次封裝,主要負責完成微服務架構中的服務治理功能,服務治理能夠說是微服務架構中最爲核心和基礎的模塊,他主要用來實現各個微服務實例的自動化註冊與發現.
Eureka是由多運行實例組成的.大體分爲兩類:Eureka Server(服務端) 和 Eureka Client(客戶端).爲了便於理解,咱們將 Eureka client 再分爲 Service Provider 和 Service Consumer.以下圖所示:網絡
Eureka Server 做爲一個獨立的部署單元,以 REST API 的形式爲服務實例提供了註冊、管理和查詢等操做.同時,Eureka Server 也爲咱們提供了可視化的監控頁面,能夠直觀地看到各個 Eureka Server 當前的運行狀態和全部已註冊服務的狀況.架構
Eureka Server 能夠經過部署多個實例,來實現高可用集羣.不一樣於Zookeeper選舉的過程(PS:ZK選主的算法本身也不是很是的瞭解,在這裏也很少贅述.之後研究明白了再寫出來~),Eureka Server是基於 Peer to Peer的模式.這是一種去中心化的架構,沒有 M/S 的區別,你們在集羣中都是對等的.在這種架構中,節點經過彼此互相註冊來提升可用性,每一個節點須要添加一個或多個有效的 serviceUrl 指向其餘節點.每一個節點均可被視爲其餘節點的副本.框架
若是某臺 Eureka Server 宕機,Eureka Client 的請求會自動切換到新的 Eureka Server 節點,當宕機的服務器從新恢復後,Eureka 會再次將其歸入到服務器集羣管理之中.當節點開始接受客戶端請求時,全部的操做都會進行replicateToPeer(節點間複製)操做,將請求複製到其餘 Eureka Server 當前所知的全部節點中.分佈式
一個新的 Eureka Server 節點啓動後,會首先嚐試從鄰近節點獲取全部實例註冊表信息,完成初始化.Eureka Server 經過getEurekaServiceUrls()方法獲取全部的節點,而且會經過心跳續約的方式按期更新.默認配置下,若是 Eureka Server 在必定時間內沒有接收到某個服務實例的心跳,Eureka Server 將會註銷該實例(默認爲 90 秒,經過eureka.instance.lease-expiration-duration-in-seconds配置).當 Eureka Server 節點在短期內丟失過多的心跳時(好比發生了網絡分區故障),那麼這個節點就會進入自我保護模式。下圖爲 Eureka 官網的架構圖:ide
在微服務或者說是SOA的架構下,一次業務請求須要調用多個服務來完成.單個服務或者基礎服務的故障,因爲級聯的效果,會致使整個服務變得不可用.雪崩效應是一種因爲"服務提供方"不可用,最後致使"服務消費者"不可用的過程.
在Spring Cloud中,爲咱們提供了完善的降級,熔斷支持.本人也是一邊學習一邊總結,以後會慢慢的更新到後續的文章中.微服務