服務註冊與發現

1、etcd

etcd 是一個分佈式,一致性的 k-v 存儲系統,用於共享配置和服務發現。etcd 使用 go 語言實現,並經過 Raft 一致性算法處理日誌複製以保證強一致性。java

簡單: 可以使用 curl 訪問的用戶 API(HTTP+JSON)
安全: 可選的SSL客戶端證書認證
快速: 單實例每秒 1000 次寫操做
可靠: 使用Raft保證一致性git

 2、Consul

Consul 是 HashiCorp 公司推出的開源工具,用於實現分佈式系統的服務發現與配置。與其餘分佈式服務註冊與發現的方案,好比 Airbnb 的 SmartStack 等相比,Consul 的方案更「一站式」,內置了服務註冊與發現框 架、分佈一致性協議實現、健康檢查、Key/Value 存儲、多數據中心方案,再也不須要依賴其餘工具(好比 ZooKeeper 等)。使用起來也較 爲簡單。Consul 用 Golang 實現,所以具備自然可移植性(支持 Linux、windows 和 Mac OS X);安裝包僅包含一個可執行文件,方便部署,與 Docker 等輕量級容器可無縫配合。github

 3、Zookeeper

Yahoo貢獻給Apache基金會的一個頂級開源項目,基於Paxos算法,是Hadoop和HBase的重要組件。Zookeeper是爲分佈式應用設計的一個高性能協調服務,提供了以下的通用服務,如命名、配置管理、經過鎖和分組服務,封裝成簡單易用的接口而無需開發人員從頭編寫代碼。能夠拿來即用,應用的領域有取得共識、分組管理、領導者選舉和協議呈現。還能夠按需自定義功能。算法

Zk和etcd的比較:docker

 4、Netflix的Eureka

Eureka是Netflix的中間層,用於負載均衡和服務發現。在應用服務中既存有服務器組件,也有智能客戶端。服務器和客戶端都採用java語言編寫,這就意味着理想的應用場景是用於採用java編寫的服務,或者是與JVM兼容的語言編寫的服務。windows

Eureka服務器用於註冊服務。他們推薦在AWS每一個可用的區域運行一個Eureka服務器,經過它來造成聚簇。服務器經過異步模式互相複製各自的狀態,這意味着在任意給定的時間點每一個實例關於全部服務的狀態是有細微差異的。緩存

服務的註冊由客戶端組件處理。服務嵌入在客戶端應用程序代碼中。在運行時,客戶端註冊服務並週期性的發送心跳來更新它的租約。安全

服務的發現也由智能客戶端來處理。它從服務器端檢索當前註冊的信息並把它們緩存在本地。客戶端週期性能刷新它的狀態同時處理負載均衡和失效備援。服務器

Eureka在設計時就考慮了失敗時的恢復。它依託強一致性提供良好的可用性,可在運行在多種不一樣的失敗場景中。若是聚簇中有分片,那麼Eureka就轉入自我保護模式。它容許在分片期間過行服務的發現和註冊,當分片結束時,聚簇中的成員會把它們的狀態再次合併起來。網絡

若是一個服務器出現問題,Eureka不須要任何類型的選舉,客戶端會自動切換並鏈接到一個新的Eureka服務器。當它恢復時,能夠自動加入Eureka節點集羣。並且,按照設計,它能夠在零停機的狀況下處理更普遍的網絡分區問題。在出現網絡分區的狀況下,Eureka將繼續接受新的註冊併發布。這能夠確保新增服務仍然能夠供分區同側的任意客戶端使用。

Eureka有一個服務心跳的概念,能夠阻止過時數據:若是一個服務長時間沒有發送心跳,那麼Eureka將從服務註冊中將其刪除。但在出現網絡分區、Eureka在短期內丟失過多客戶端時,它會停用這一機制,進入「自我保護模式」。網絡恢復後,它又會自動退出該模式。這樣,雖然它保留的數據中可能存在錯誤,卻不會丟失任何有效數據。

Eureka在客戶端會有緩存。即便全部Eureka服務器不可用,服務註冊信息也不會丟失。緩存在這裏是恰當的,由於它只在全部的Eureka服務器都沒響應的狀況下才會用到。

Eureka就是爲服務發現而構建的。它提供了一個客戶端庫,該庫提供了服務心跳、服務健康檢查、自動發佈及緩存刷新等功能。使用ZooKeeper,這些功能都須要本身實現。

管理簡單,很容易添加和刪除節點。它還提供了一個清晰簡潔的網頁,上面列出了全部的服務及其健康情況。

Eureka還提供了REST API,使用戶能夠將其集成到其它可能的用途和查詢機制。

 5、SkyDNS

SkyDNS是一個相對新的項目它採用Go語言編寫,使用了RAFT用於一致性,並提供了HTTP和DNS兩種客戶端API.它與Etcd和Spotify的DNS模型有點相似,事實上它採用了和Etcd,go-raft一樣的RAFT實現。

SkyDNS服務器聚簇在一塊兒,使用RAFT協議,並選擇出一個主服務。SkyDNS服務器暴露不一樣的結點用於服務註冊和發現。

爲了註冊服務,服務會使用基於HTTP的API建立帶有TTL的入口。服務必須週期性地經過心跳報告它們的狀態。SkyDNS也使用了SRV記錄,但它對記錄作了擴展用於支持服務版本、環境和地區。

爲了發現,客戶端使用DNS並檢索它們須要鏈接的服務的SRV記錄。客戶端須要實現負載均衡或者失效備援,而且週期性的緩存和刷新服務位置數據。

與Spotify使用DNS不一樣的是,SkyDNS支持服務的動態註冊,而且可以在不依賴像Zookeeper或者Etcd的狀況下動態註冊。

若是你使用了docker,skydock,你應當去檢查一下你的容器與SkyDNS自動的集成。

總之,SkyDNS是一個混合了傳統的(DNS)和新的(Go,RAFT)技術的項目,它值得你去分析一下項目是如何推動的。

總結

相關文章
相關標籤/搜索