天天看點

服務注冊與發現

一、etcd

etcd 是一個分布式,一緻性的 k-v 存儲系統,用于共享配置和服務發現。etcd 使用 go 語言實作,并通過 Raft 一緻性算法處理日志複制以保證強一緻性。

簡單: 可使用 curl 通路的使用者 API(HTTP+JSON)

安全: 可選的SSL用戶端證書認證

快速: 單執行個體每秒 1000 次寫操作

可靠: 使用Raft保證一緻性

 二、Consul

Consul 是 HashiCorp 公司推出的開源工具,用于實作分布式系統的服務發現與配置。與其他分布式服務注冊與發現的方案,比如 Airbnb 的 SmartStack 等相比,Consul 的方案更“一站式”,内置了服務注冊與發現框 架、分布一緻性協定實作、健康檢查、Key/Value 存儲、多資料中心方案,不再需要依賴其他工具(比如 ZooKeeper 等)。使用起來也較 為簡單。Consul 用 Golang 實作,是以具有天然可移植性(支援 Linux、windows 和 Mac OS X);安裝包僅包含一個可執行檔案,友善部署,與 Docker 等輕量級容器可無縫配合。

 三、Zookeeper

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

Zk和etcd的比較:

服務注冊與發現

 四、Netflix的Eureka

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

Eureka伺服器用于注冊服務。他們推薦在AWS每個可用的區域運作一個Eureka伺服器,通過它來形成聚簇。伺服器通過異步模式互相複制各自的狀态,這意味着在任意給定的時間點每個執行個體關于所有服務的狀态是有細微差别的。

服務的注冊由用戶端元件處理。服務嵌入在用戶端應用程式代碼中。在運作時,用戶端注冊服務并周期性的發送心跳來更新它的租約。

服務的發現也由智能用戶端來處理。它從伺服器端檢索目前注冊的資訊并把它們緩存在本地。用戶端周期性能重新整理它的狀态同時處理負載均衡和失效備援。

Eureka在設計時就考慮了失敗時的恢複。它依托強一緻性提供良好的可用性,可在運作在多種不同的失敗場景中。如果聚簇中有分片,那麼Eureka就轉入自我保護模式。它允許在分片期間過行服務的發現和注冊,當分片結束時,聚簇中的成員會把它們的狀态再次合并起來。

如果一個伺服器出現問題,Eureka不需要任何類型的選舉,用戶端會自動切換并連接配接到一個新的Eureka伺服器。當它恢複時,可以自動加入Eureka節點叢集。而且,按照設計,它可以在零停機的情況下處理更廣泛的網絡分區問題。在出現網絡分區的情況下,Eureka将繼續接受新的注冊并釋出。這可以確定新增服務仍然可以供分區同側的任意用戶端使用。

Eureka有一個服務心跳的概念,可以阻止過期資料:如果一個服務長時間沒有發送心跳,那麼Eureka将從服務注冊中将其删除。但在出現網絡分區、Eureka在短時間内丢失過多用戶端時,它會停用這一機制,進入“自我保護模式”。網絡恢複後,它又會自動退出該模式。這樣,雖然它保留的資料中可能存在錯誤,卻不會丢失任何有效資料。

Eureka在用戶端會有緩存。即使所有Eureka伺服器不可用,服務注冊資訊也不會丢失。緩存在這裡是恰當的,因為它隻在所有的Eureka伺服器都沒響應的情況下才會用到。

Eureka就是為服務發現而建構的。它提供了一個用戶端庫,該庫提供了服務心跳、服務健康檢查、自動釋出及緩存重新整理等功能。使用ZooKeeper,這些功能都需要自己實作。

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

Eureka還提供了REST API,使使用者可以将其內建到其它可能的用途和查詢機制。

 五、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)技術的項目,它值得你去分析一下項目是如何推進的。

總結

服務注冊與發現

鄭重聲明:本部落格僅用于個人整理和總結學習筆記,如有任何疑問歡迎留言!