聊聊分布式系統(tǒng)中的服務(wù)發(fā)現(xiàn)!
在分布式系統(tǒng)中,為了方便多個(gè)服務(wù)需要在網(wǎng)絡(luò)上相互交互,我們需要一種機(jī)制使得這些服務(wù)能夠有效地相互查找和通信,因此,本文我們將探討一種常見(jiàn)的方案:服務(wù)發(fā)現(xiàn)。
一、什么是服務(wù)發(fā)現(xiàn)?
服務(wù)發(fā)現(xiàn)是一種允許在分布式系統(tǒng)中自動(dòng)檢測(cè)和追蹤網(wǎng)絡(luò)中的各個(gè)服務(wù)實(shí)例,它主要解決的問(wèn)題是服務(wù)的動(dòng)態(tài)注冊(cè)、查找和負(fù)載均衡。
二、服務(wù)發(fā)現(xiàn)的類(lèi)型
通常來(lái)說(shuō)服務(wù)發(fā)現(xiàn)有兩種主要類(lèi)型:客戶端發(fā)現(xiàn)和服務(wù)器端發(fā)現(xiàn)。
1.客戶端發(fā)現(xiàn)
在客戶端發(fā)現(xiàn)中,服務(wù)使用者負(fù)責(zé)查詢服務(wù)注冊(cè)表以查找可用的服務(wù)實(shí)例,然后在這些實(shí)例之間對(duì)請(qǐng)求進(jìn)行負(fù)載均衡。
優(yōu)勢(shì):易于實(shí)施和理解。減少中央負(fù)載均衡器上的負(fù)載。
缺點(diǎn):
- 使用者需要實(shí)現(xiàn)發(fā)現(xiàn)邏輯。
- 注冊(cè)表協(xié)議中的更改需要客戶端中的更改。
比如,Netflix Eureka就是一個(gè)客戶端服務(wù)發(fā)現(xiàn)的注冊(cè)中心。
2.服務(wù)器端發(fā)現(xiàn)
在服務(wù)器端發(fā)現(xiàn)中,服務(wù)使用者向中介(負(fù)載均衡器或 API 網(wǎng)關(guān))發(fā)出請(qǐng)求,然后中介查詢服務(wù)注冊(cè)表并將請(qǐng)求路由到相應(yīng)的服務(wù)實(shí)例。
優(yōu)勢(shì):
- 集中發(fā)現(xiàn)邏輯,降低使用者的復(fù)雜性。
- 更易于管理和更新發(fā)現(xiàn)協(xié)議。
缺點(diǎn)
- 引入了一個(gè)額外的網(wǎng)絡(luò)躍點(diǎn)。
- 負(fù)載均衡器可能成為單點(diǎn)故障。
比如,AWS Elastic Load Balancer(ELB)與 AWS服務(wù)注冊(cè)表集成,以實(shí)現(xiàn)服務(wù)器端發(fā)現(xiàn)。
三、服務(wù)發(fā)現(xiàn)如何工作?
1.三個(gè)組件
服務(wù)發(fā)現(xiàn)包含三個(gè)重要的組件:服務(wù)提供者、服務(wù)使用者和服務(wù)注冊(cè)表,它們之間的關(guān)系如下圖:
- 服務(wù)提供者(Service Provider):服務(wù)提供者在進(jìn)入系統(tǒng)時(shí)向服務(wù)注冊(cè)中心注冊(cè),并在離開(kāi)系統(tǒng)時(shí)取消注冊(cè)。
- 服務(wù)使用者(Service Consumer):服務(wù)使用者從服務(wù)注冊(cè)表中獲取提供者的信息,然后連接到服務(wù)提供者。
- 服務(wù)注冊(cè)表(Service Registry):服務(wù)注冊(cè)表是保存服務(wù)提供者的相關(guān)信息,當(dāng)服務(wù)提供者有變更時(shí),注冊(cè)表也能感知,以便客戶端可以通過(guò)從服務(wù)注冊(cè)表獲取最新數(shù)據(jù)。
2.工作原理
- 服務(wù)注冊(cè):每個(gè)服務(wù)實(shí)例在啟動(dòng)時(shí)會(huì)向一個(gè)服務(wù)注冊(cè)中心(Service Registry)注冊(cè)自己,包括服務(wù)名、實(shí)例ID、IP地址、端口號(hào)等信息。
- 服務(wù)發(fā)現(xiàn):客戶端需要訪問(wèn)某個(gè)服務(wù)時(shí),會(huì)先查詢服務(wù)注冊(cè)中心以獲取可用的服務(wù)實(shí)例列表,然后選擇一個(gè)實(shí)例進(jìn)行調(diào)用。
- 健康檢查:服務(wù)注冊(cè)中心定期對(duì)注冊(cè)的服務(wù)實(shí)例進(jìn)行健康檢查,確保只有健康的實(shí)例在列表中,故障實(shí)例會(huì)被移除。
- 負(fù)載均衡:在客戶端從服務(wù)注冊(cè)中心獲取服務(wù)實(shí)例列表后,通常會(huì)使用某種負(fù)載均衡策略(如輪詢、隨機(jī)、最小連接數(shù)等)來(lái)選擇具體的服務(wù)實(shí)例進(jìn)行請(qǐng)求。
四、服務(wù)發(fā)現(xiàn)的重要性
- 減少手動(dòng)配置:服務(wù)可以動(dòng)態(tài)發(fā)現(xiàn)并相互連接,無(wú)需手動(dòng)配置和硬編碼網(wǎng)絡(luò)位置。
- 改進(jìn)的可擴(kuò)展性:隨著新服務(wù)實(shí)例的添加或刪除,服務(wù)發(fā)現(xiàn)可確保其他服務(wù)能夠無(wú)縫適應(yīng)不斷變化的環(huán)境。
- 增強(qiáng)的容錯(cuò)能力:服務(wù)發(fā)現(xiàn)機(jī)制通常包括運(yùn)行狀況檢查,使系統(tǒng)能夠自動(dòng)將流量從失敗的服務(wù)實(shí)例中重新路由出去。
- 簡(jiǎn)化管理:擁有中央服務(wù)注冊(cè)表可以更輕松地監(jiān)視、管理和排除整個(gè)系統(tǒng)的故障。
五、常用服務(wù)發(fā)現(xiàn)工具
下面列舉了幾個(gè)分布式環(huán)境下常用的服務(wù)發(fā)現(xiàn)工具。
1.Eureka
Eureka Server采用的是Peer to Peer對(duì)等通信,它是一種去中心化的架構(gòu),每一個(gè) Peer都是對(duì)等的。節(jié)點(diǎn)之間通過(guò)彼此互相注冊(cè)來(lái)提高可用性,每個(gè)節(jié)點(diǎn)需要添加一個(gè)或多個(gè)有效的 serviceUrl指向其他節(jié)點(diǎn)。每個(gè)節(jié)點(diǎn)都可被視為其他節(jié)點(diǎn)的副本。,其原理圖如下:
Eureka采用的是 ACP理論中的 AP原則,因此,只要 Eureka集群中有一臺(tái) Eureka還在,就能保證注冊(cè)服務(wù)可用。
2.Consul
Consul 是一個(gè)分布式、高度可用的服務(wù)發(fā)現(xiàn)和配置系統(tǒng),它提供服務(wù)發(fā)現(xiàn)、運(yùn)行狀況檢查、鍵值存儲(chǔ)和多數(shù)據(jù)中心支持,其原理圖如下:
Consul采用的是 ACP理論中的 CP模型,使用 Raft算法來(lái)保證強(qiáng)一致性,支持多數(shù)據(jù)中心,可以避免單數(shù)據(jù)中心的單點(diǎn)故障,而其部署則需要考慮網(wǎng)絡(luò)延遲, 分片等情況等。
3.etcd + kubernetes
etcd 是一個(gè)分布式鍵值存儲(chǔ),可用于服務(wù)發(fā)現(xiàn)和配置管理,其原理圖如下:
etcd 是一種高度一致的分布式鍵值存儲(chǔ),它提供了一種可靠的方法來(lái)存儲(chǔ)分布式系統(tǒng)或機(jī)器集群需要訪問(wèn)的數(shù)據(jù)。它可以在網(wǎng)絡(luò)分區(qū)期間優(yōu)雅地處理領(lǐng)導(dǎo)者選舉,并且可以容忍機(jī)器故障,即使在領(lǐng)導(dǎo)者節(jié)點(diǎn)中也是如此。
Kubernetes 是一個(gè)容器編排平臺(tái),具有內(nèi)置的服務(wù)發(fā)現(xiàn)機(jī)制。它使用標(biāo)簽和注釋來(lái)管理服務(wù)實(shí)例,并通過(guò) DNS提供服務(wù)發(fā)現(xiàn)。
4.Nacos
Nacos是阿里開(kāi)源的,支持基于 DNS和基于 RPC的服務(wù)發(fā)現(xiàn),它即支持 CP模式也支持 AP模式,可以通過(guò)命令的方式切換,其原理圖如下:
五、總結(jié)
本文,我們分析了什么是服務(wù)發(fā)現(xiàn)以及它在分布式系統(tǒng)中是如何工作的?對(duì)于服務(wù)發(fā)現(xiàn)我們需要掌握其核心模型:
- 服務(wù)提供者(Service Provider):服務(wù)提供者在進(jìn)入系統(tǒng)時(shí)向服務(wù)注冊(cè)中心注冊(cè),并在離開(kāi)系統(tǒng)時(shí)取消注冊(cè)。
- 服務(wù)使用者(Service Consumer):服務(wù)使用者從服務(wù)注冊(cè)表中獲取提供者的信息,然后連接到服務(wù)提供者。
- 服務(wù)注冊(cè)表(Service Registry):服務(wù)注冊(cè)表是保存服務(wù)提供者的相關(guān)信息,當(dāng)服務(wù)提供者有變更時(shí),注冊(cè)表也能感知,以便客戶端可以通過(guò)從服務(wù)注冊(cè)表獲取最新數(shù)據(jù)。
最后,我們通過(guò)分析幾個(gè)常見(jiàn)的服務(wù)發(fā)現(xiàn)工具,盡管它們的實(shí)現(xiàn)細(xì)節(jié)略有差異,但是它們的核心模型是一樣的,只要能抓住核心模型,即便出現(xiàn)新的框架或者工具,我們也可以快速上手。