這個文章咱們主要來講一下Consul的基本概念,以及其實現的內部原理,和Eureka的比較。html
Consul是一種服務網格解決方案,提供具備服務發現,配置和分段功能的全功能控制平面。 這些功能中的每個均可以根據須要單獨使用,也能夠一塊兒使用以構建全服務網格。 Consul須要數據平面並支持代理和本機集成模型。 Consul附帶一個簡單的內置代理,所以一切均可以開箱即用,但也支持第三方代理集成,如Envoy。
Consul 提供的關鍵功能:mysql
在描述架構以前,咱們提供術語表以幫助澄清正在討論的內容:ios
讓咱們分解這個圖像並描述每一塊。首先,咱們能夠看到有兩個數據中心,標記爲「one」和「two」。 Consul爲多個數據中心提供一流的支持,並指望這是常見的狀況。git
在每一個數據中心內,咱們都有客戶端和服務端的混合體。預計有三到五臺服務端。這在失敗和性能的可用性之間取得平衡,由於隨着更多機器的添加,共識逐漸變慢。可是,客戶端數量沒有限制,能夠輕鬆擴展到數千或數萬。github
數據中心中的全部節點都參與八卦協議。這意味着有一個八卦池,其中包含給定數據中心的全部節點。這有幾個目的:首先,不須要爲客戶端配置服務器的地址;發現是自動完成的。其次,檢測節點故障的工做不是放在服務器上,而是分佈式的。這使得故障檢測比天真的心跳方案更具可擴展性。第三,它被用做消息傳遞層,用於在諸如領導者選舉等重要事件發生時進行通知。算法
每一個數據中心中的服務器都是單個Raft對等集的一部分。這意味着他們共同選舉一個leader,一個具備額外職責的選定服務器。領導者負責處理全部查詢和交易。做爲共識協議的一部分,還必須將事務複製到全部對等體。因爲此要求,當非領導者服務器收到RPC請求時,它會將其轉發給羣集leader。spring
服務器節點做爲WAN八卦池的一部分運行。此池與LAN池不一樣,由於它針對較高的Internet延遲進行了優化,而且預計僅包含其餘Consul服務器節點。此池的目的是容許數據中心以低觸摸方式(low-touch manner)發現彼此。在線建立新的數據中心就像加入現有的WAN八卦池同樣簡單。因爲服務器都在此池中運行,所以它還支持跨數據中心請求。當服務器收到對不一樣數據中心的請求時,它會將其轉發到正確數據中心的隨機服務器。而後該服務器能夠轉發給本地領導者。sql
這致使數據中心之間的耦合很是低,但因爲故障檢測,鏈接緩存和多路複用,跨數據中心請求相對快速且可靠。api
一般,不會在不一樣的Consul數據中心之間複製數據。當對另外一個數據中心中的資源發出請求時,本地Consul服務器會將RPC請求轉發給該資源的遠程Consul服務器並返回結果。若是遠程數據中心不可用,那麼這些資源也將不可用,但這不會影響本地數據中心。在某些特殊狀況下,能夠複製有限的數據子集,例如使用Consul的內置ACL複製功能,或者像consul-replicate這樣的外部工具。緩存
在某些地方,客戶端代理能夠緩存來自服務器的數據,以使其在本地可用,以提升性能和可靠性。示例包括鏈接證書Connect certificates和意圖intentions ,容許客戶端代理在沒有往返服務器的狀況下作出有關入站鏈接請求的本地決策。某些API端點還支持可選的結果緩存。這有助於提升可靠性,由於本地代理能夠繼續響應某些查詢,例如服務發現或從緩存鏈接受權,即便與服務器的鏈接中斷或服務器暫時不可用。
要想理解Consul的原理,你是繞不過Gossip協議和Raft協議的。
Gossip算法如其名,靈感來自辦公室八卦,只要一我的八卦一下,在有限的時間內全部的人都會知道該八卦的信息,這種方式也與病毒傳播相似,所以Gossip有衆多的別名「閒話算法」、「疫情傳播算法」、「病毒感染算法」、「謠言傳播算法」。更多,可參見這篇博文
Consul使用兩個不一樣的八卦池。咱們將每一個池分別稱爲LAN或WAN池。
每一個數據中心Consul都有一個LAN八卦池,包含數據中心的全部成員,包括客戶端和服務器。 LAN池用於一些目的。成員資格信息容許客戶端自動發現服務器,減小所需的配置量。分佈式故障檢測容許整個集羣共享故障檢測工做,而不是集中在少數服務器上。最後,八卦池容許爲領導者選舉等事件提供可靠和快速的事件廣播。
WAN池是全局惟一的,由於不管數據中心如何,全部服務器都應該參與WAN池。 WAN池提供的成員資格信息容許服務器執行跨數據中心請求。集成故障檢測容許Consul優雅地處理丟失鏈接的整個數據中心,或者只處理遠程數據中心中的單個服務器。
全部這些功能都是經過利用Serf提供的。它用做嵌入式庫以提供這些功能。從用戶的角度來看,這並不重要,由於抽象應該由Consul掩蓋。可是,做爲開發人員,瞭解如何利用此庫很是有用。
Raft 協議,主要負責leader選舉和日誌同步。
推薦你看一下這篇博客,
你也能夠到這個網站經過動畫的方式,像玩遊戲同樣在線體驗raft協議的原理。
Eureka由於是Netflix OSS套件的一部分,2.x中止維護,不過1.x仍然是活躍的。
這裏重點說下consul與Eureka的區別。和其餘系統的比較,可點擊此網址自行查看。
Eureka是一種服務發現工具。該體系結構主要是客戶端/服務器,每一個數據中心有一組Eureka服務器,一般每一個可用區域一個。一般,Eureka的客戶使用嵌入式SDK來註冊和發現服務。對於非本地集成的客戶端,使用Ribbon等邊車經過Eureka透明地發現服務。
Eureka使用盡力而爲的複製提供弱一致的服務視圖。當客戶端向服務器註冊時,該服務器將嘗試複製到其餘服務器但不提供保證。服務註冊的生存時間(TTL)很短,要求客戶端對服務器進行心跳檢測。不健康的服務或節點中止心跳後,致使它們超時並從註冊表中刪除。發現請求能夠路由到任何服務,因爲盡力複製,這些服務能夠提供過期或丟失的數據。這種簡化的模型能夠實現輕鬆的集羣管理和高可擴展性。
Consul提供了一系列超級功能,包括更豐富的健康檢查,鍵/值存儲和多數據中心感知。 Consul須要每一個數據中心中的一組服務器,以及每一個客戶端上的代理,相似於使用像Ribbon這樣的邊車。 Consul代理容許大多數應用程序不知道Consul,經過配置文件執行服務註冊以及經過DNS或負載平衡器sidecars進行發現。
Consul提供強一致性保證,由於服務器使用Raft協議複製狀態。 Consul支持豐富的運行情況檢查,包括TCP,HTTP,Nagios / Sensu兼容腳本或基於Ture的Eureka。客戶端節點參與基於八卦的健康檢查,該檢查分發健康檢查的工做,而不像集中式心跳,這成爲可擴展性挑戰。發現請求被路由到當選的領事領導者,這容許他們默認狀況下是強烈一致的。容許過期讀取的客戶端容許任何服務器處理其請求,從而容許像Eureka同樣的線性可伸縮性。
Consul的強一致性意味着它能夠用做領導者選舉和集羣協調的鎖服務。 Eureka不提供相似的保證,而且一般須要爲須要執行協調或具備更強一致性需求的服務運行ZooKeeper。
Consul提供了支持面向服務的體系結構所需的功能工具包。這包括服務發現,還包括豐富的運行情況檢查,鎖定,鍵/值,多數據中心聯合,事件系統和ACL。 Consul和consul-template和envconsul等生態系統工具都試圖最大限度地減小集成所需的應用程序更改,以免須要經過SDK進行本機集成。 Eureka是更大的Netflix OSS套件的一部分,該套件指望應用程序相對同質且緊密集成。所以,Eureka只解決了有限的一部分問題,指望其餘工具如ZooKeeper能夠同時使用。
總結一下上面的幾段話:
另外,Spring Cloud官方提供對Consul的支持,網址是https://spring.io/projects/sp...,後面我會寫文章具體的使用。
https://www.consul.io/intro/i...
https://www.consul.io/intro/v...
https://www.consul.io/docs/in...
https://www.consul.io/docs/in...
https://www.consul.io/docs/in...
https://www.cnblogs.com/xingz...
https://www.cnblogs.com/xybab...
文章以後會第一時間發於微信, 歡迎關注個人微信公衆號,你們一塊兒交流學習