Golang 語(yǔ)言微服務(wù)的服務(wù)注冊(cè)與發(fā)現(xiàn)組件 Consul
01介紹
在 2016 年底,我開(kāi)始接觸 Golang 語(yǔ)言和微服務(wù),在過(guò)去的 5 年中,微服務(wù)架構(gòu)變得越來(lái)越流行,目前中型及以上規(guī)模的公司幾乎已經(jīng)全部拋棄單體架構(gòu)。
本文我們主要介紹 Golang 語(yǔ)言微服務(wù)的服務(wù)注冊(cè)與發(fā)現(xiàn)組件 consul。在介紹 Consul 之前,我們先簡(jiǎn)單了解一下服務(wù)注冊(cè)與發(fā)現(xiàn)和 CAP 定理。
02服務(wù)注冊(cè)與發(fā)現(xiàn)
微服務(wù)架構(gòu)與單體架構(gòu)不同,微服務(wù)架構(gòu)按照業(yè)務(wù)需求拆分為多個(gè)微服務(wù),每個(gè)微服務(wù)都可以動(dòng)態(tài)部署。
服務(wù)注冊(cè)與發(fā)現(xiàn)組件負(fù)責(zé)管理拆分的各個(gè)微服務(wù),其中服務(wù)注冊(cè)是指微服務(wù)實(shí)例啟動(dòng)時(shí),將其信息注冊(cè)到服務(wù)注冊(cè)與發(fā)現(xiàn)組件;服務(wù)發(fā)現(xiàn)是指微服務(wù)實(shí)例通過(guò)請(qǐng)求服務(wù)注冊(cè)與發(fā)現(xiàn)組件,獲取其需要遠(yuǎn)程調(diào)用的其他微服務(wù)實(shí)例的信息。
服務(wù)注冊(cè)與發(fā)現(xiàn)組件的功能包括管理當(dāng)前注冊(cè)到服務(wù)注冊(cè)與發(fā)現(xiàn)組件的微服務(wù)實(shí)例;心跳檢測(cè)注冊(cè)到服務(wù)注冊(cè)與發(fā)現(xiàn)組件的微服務(wù)實(shí)例;為調(diào)用方的微服務(wù)實(shí)例提供被調(diào)用的微服務(wù)實(shí)例的信息。
03CAP 定理
CAP 定理由加州大學(xué)柏克萊分校的 Eric Brewer 教授提出,它是描述分布式系統(tǒng)下節(jié)點(diǎn)數(shù)據(jù)同步的基本定理。
其核心是告訴我們,在分布式系統(tǒng)中有三方面需要彼此權(quán)衡,分別是一致性(consistency)、可用性(availability)和分區(qū)容忍性(partition tolerance),CAP 定理告訴我們,以上三個(gè)指標(biāo)最多只能滿足其中兩個(gè)指標(biāo)。
其中,一致性是當(dāng)訪問(wèn)多個(gè)節(jié)點(diǎn)時(shí)能得到同樣的值;可用性意味著每個(gè)請(qǐng)求都能獲得響應(yīng);分區(qū)容忍性是指集群中的某些節(jié)點(diǎn)在無(wú)法通信后,集群整體還能繼續(xù)提供服務(wù)。
微服務(wù)架構(gòu)實(shí)際上就是分布式系統(tǒng)的一種落地實(shí)踐。
04Consul
目前業(yè)界已經(jīng)開(kāi)源出很多服務(wù)注冊(cè)與發(fā)現(xiàn)組件,例如 Java 語(yǔ)言開(kāi)發(fā)的致力于為分布式系統(tǒng)提供一致性服務(wù)的 zookeeper,使用 Golang 語(yǔ)言開(kāi)發(fā)的主要用于服務(wù)發(fā)現(xiàn)與配置共享的 etcd 和 consul。
其中,Consul 是以服務(wù)發(fā)現(xiàn)與配置作為主要功能目標(biāo),附帶提供了 Key/Value 存儲(chǔ),僅從服務(wù)注冊(cè)與發(fā)現(xiàn)組件的需求考慮,Consul 更適合。
Consul 是一個(gè)服務(wù)網(wǎng)格解決方案,滿足 CAP 定理中的 CP,提供服務(wù)發(fā)現(xiàn)和配置共享的功能。這些功能中的每一個(gè)都可以根據(jù)需要單獨(dú)使用,也可以一起使用以構(gòu)建完整的服務(wù)網(wǎng)格。
Consul 附帶了一個(gè)簡(jiǎn)單的內(nèi)置代理,因此一切都開(kāi)箱即用,但也支持第三方代理集成,如 Envoy。
Consul 主要特性:
- 服務(wù)發(fā)現(xiàn)
- 健康檢查
- KV 存儲(chǔ)
- 安全服務(wù)通信
- 多數(shù)據(jù)中心
Consul 是一個(gè)高可用的分布式系統(tǒng),支持多數(shù)據(jù)中心部署,每個(gè)數(shù)據(jù)中心都運(yùn)行一個(gè) Consul 集群。一個(gè) Consul 集群由部署和運(yùn)行 Consul Agent 的節(jié)點(diǎn)組成。
Consul Agent 負(fù)責(zé)服務(wù)注冊(cè)、運(yùn)行檢查和響應(yīng)查詢(將查詢請(qǐng)求轉(zhuǎn)發(fā)到 Consul server 中進(jìn)行處理),服務(wù)發(fā)現(xiàn)或讀寫 Key/Value 數(shù)據(jù)不需要運(yùn)行 Consul Agent。
Consul 集群包含 Consul server 和 Consul client,Consul server 負(fù)責(zé)存儲(chǔ)和復(fù)制數(shù)據(jù)。多個(gè) Consul server 之間基于 Raft 協(xié)議選舉一個(gè) leader。雖然 Consul 可以只使用一個(gè) Consul server,但官方建議使用 3 到 5 個(gè) Consul server,以避免數(shù)據(jù)丟失。
Consul client 負(fù)責(zé)將請(qǐng)求轉(zhuǎn)發(fā)給同一數(shù)據(jù)中心的 Consul server 處理。當(dāng)發(fā)出跨數(shù)據(jù)中心服務(wù)發(fā)現(xiàn)或配置請(qǐng)求時(shí),本地 Consul server 會(huì)將請(qǐng)求轉(zhuǎn)發(fā)到遠(yuǎn)程數(shù)據(jù)中心并返回結(jié)果。
05總結(jié)
本文我們先簡(jiǎn)單認(rèn)識(shí)一下 Consul,同時(shí)介紹了服務(wù)注冊(cè)與發(fā)現(xiàn)是什么,微服務(wù)作為分布式系統(tǒng)的一種落地實(shí)踐,也需要遵循 CAP 定理,并列舉了業(yè)界目前開(kāi)源的滿足 CP 的服務(wù)注冊(cè)與發(fā)現(xiàn)組件有哪些。
本文轉(zhuǎn)載自微信公眾號(hào)「 Golang語(yǔ)言開(kāi)發(fā)?!梗梢酝ㄟ^(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系 Golang語(yǔ)言開(kāi)發(fā)棧公眾號(hào)。