日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

consul使用的一些见解

發(fā)布時(shí)間:2024/4/15 编程问答 57 豆豆
生活随笔 收集整理的這篇文章主要介紹了 consul使用的一些见解 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

開(kāi)始接觸Consul,使用的主要目的就是做服務(wù)發(fā)現(xiàn),后來(lái)逐步應(yīng)用于生產(chǎn)環(huán)境,并總結(jié)了少許使用經(jīng)驗(yàn)。最開(kāi)始使用Consul的人不多,為了方便交流創(chuàng)建了一個(gè)QQ群,這兩年微服務(wù)越來(lái)越火,使用Consul的人也越來(lái)越多,目前群里已有400多人,經(jīng)常有人問(wèn)一些問(wèn)題,比如:

  • 服務(wù)注冊(cè)到節(jié)點(diǎn)后,其他節(jié)點(diǎn)為什么沒(méi)有同步?
  • Client是干什么的?(Client有什么作用?)
  • 能不能直接注冊(cè)到Server?(是否只有Server節(jié)點(diǎn)就夠了?)
  • 服務(wù)信息是保存在哪里的?
  • 如果節(jié)點(diǎn)掛了健康檢查能不能轉(zhuǎn)移到別的節(jié)點(diǎn)?

有些人可能對(duì)服務(wù)注冊(cè)和發(fā)現(xiàn)還沒(méi)有概念,有些人可能使用過(guò)其它服務(wù)發(fā)現(xiàn)的工具,比如zookeeper,etcd,會(huì)有一些先入為主的經(jīng)驗(yàn)。這篇文章將結(jié)合Consul的官方文檔和自己的實(shí)際經(jīng)驗(yàn),談一下Consul做服務(wù)發(fā)現(xiàn)的方式,文中盡量不依賴具體的框架和開(kāi)發(fā)語(yǔ)言,從原理上進(jìn)行說(shuō)明,希望能夠講清楚上邊的幾個(gè)問(wèn)題。

為什么使用服務(wù)發(fā)現(xiàn)

防止硬編碼、容災(zāi)、水平擴(kuò)縮容、提高運(yùn)維效率等等,只要你想使用服務(wù)發(fā)現(xiàn)總能找到合適的理由。

一般的說(shuō)法是因?yàn)槭褂梦⒎?wù)架構(gòu)。傳統(tǒng)的單體架構(gòu)不夠靈活不能很好的適應(yīng)變化,從而向微服務(wù)架構(gòu)進(jìn)行轉(zhuǎn)換,而伴隨著大量服務(wù)的出現(xiàn),管理運(yùn)維十分不便,于是開(kāi)始搞一些自動(dòng)化的策略,服務(wù)發(fā)現(xiàn)應(yīng)運(yùn)而生。所以如果需要使用服務(wù)發(fā)現(xiàn),你應(yīng)該有一些對(duì)服務(wù)治理的痛點(diǎn)。

但是引入服務(wù)發(fā)現(xiàn)就可能引入一些技術(shù)棧,增加系統(tǒng)總體的復(fù)雜度,如果你只有很少的幾個(gè)服務(wù),比如10個(gè)以下,并且業(yè)務(wù)不怎么變化,吞吐量預(yù)計(jì)也很穩(wěn)定,可能就沒(méi)有必要使用服務(wù)發(fā)現(xiàn)。

Consul內(nèi)部原理

下面這張圖來(lái)源于Consul官網(wǎng),很好的解釋了Consul的工作原理,先大致看一下。

首先Consul支持多數(shù)據(jù)中心,在上圖中有兩個(gè)DataCenter,他們通過(guò)Internet互聯(lián),同時(shí)請(qǐng)注意為了提高通信效率,只有Server節(jié)點(diǎn)才加入跨數(shù)據(jù)中心的通信。

在單個(gè)數(shù)據(jù)中心中,Consul分為Client和Server兩種節(jié)點(diǎn)(所有的節(jié)點(diǎn)也被稱為Agent),Server節(jié)點(diǎn)保存數(shù)據(jù),Client負(fù)責(zé)健康檢查及轉(zhuǎn)發(fā)數(shù)據(jù)請(qǐng)求到Server;Server節(jié)點(diǎn)有一個(gè)Leader和多個(gè)Follower,Leader節(jié)點(diǎn)會(huì)將數(shù)據(jù)同步到Follower,Server的數(shù)量推薦是3個(gè)或者5個(gè),在Leader掛掉的時(shí)候會(huì)啟動(dòng)選舉機(jī)制產(chǎn)生一個(gè)新的Leader。

集群內(nèi)的Consul節(jié)點(diǎn)通過(guò)gossip協(xié)議(流言協(xié)議)維護(hù)成員關(guān)系,也就是說(shuō)某個(gè)節(jié)點(diǎn)了解集群內(nèi)現(xiàn)在還有哪些節(jié)點(diǎn),這些節(jié)點(diǎn)是Client還是Server。單個(gè)數(shù)據(jù)中心的流言協(xié)議同時(shí)使用TCP和UDP通信,并且都使用8301端口。跨數(shù)據(jù)中心的流言協(xié)議也同時(shí)使用TCP和UDP通信,端口使用8302。

集群內(nèi)數(shù)據(jù)的讀寫(xiě)請(qǐng)求既可以直接發(fā)到Server,也可以通過(guò)Client使用RPC轉(zhuǎn)發(fā)到Server,請(qǐng)求最終會(huì)到達(dá)Leader節(jié)點(diǎn),在允許數(shù)據(jù)輕微陳舊的情況下,讀請(qǐng)求也可以在普通的Server節(jié)點(diǎn)完成,集群內(nèi)數(shù)據(jù)的讀寫(xiě)和復(fù)制都是通過(guò)TCP的8300端口完成。

Consul服務(wù)發(fā)現(xiàn)原理

下面這張圖是自己畫(huà)的,基本描述了服務(wù)發(fā)現(xiàn)的完整流程,先大致看一下。

首先需要有一個(gè)正常的Consul集群,有Server,有Leader。這里在服務(wù)器Server1、Server2、Server3上分別部署了Consul Server,假設(shè)他們選舉了Server2上的Consul Server節(jié)點(diǎn)為L(zhǎng)eader。這些服務(wù)器上最好只部署Consul程序,以盡量維護(hù)Consul Server的穩(wěn)定。

然后在服務(wù)器Server4和Server5上通過(guò)Consul Client分別注冊(cè)Service A、B、C,這里每個(gè)Service分別部署在了兩個(gè)服務(wù)器上,這樣可以避免Service的單點(diǎn)問(wèn)題。服務(wù)注冊(cè)到Consul可以通過(guò)HTTP API(8500端口)的方式,也可以通過(guò)Consul配置文件的方式。Consul Client可以認(rèn)為是無(wú)狀態(tài)的,它將注冊(cè)信息通過(guò)RPC轉(zhuǎn)發(fā)到Consul Server,服務(wù)信息保存在Server的各個(gè)節(jié)點(diǎn)中,并且通過(guò)Raft實(shí)現(xiàn)了強(qiáng)一致性。

最后在服務(wù)器Server6中Program D需要訪問(wèn)Service B,這時(shí)候Program D首先訪問(wèn)本機(jī)Consul Client提供的HTTP API,本機(jī)Client會(huì)將請(qǐng)求轉(zhuǎn)發(fā)到Consul Server,Consul Server查詢到Service B當(dāng)前的信息返回,最終Program D拿到了Service B的所有部署的IP和端口,然后就可以選擇Service B的其中一個(gè)部署并向其發(fā)起請(qǐng)求了。如果服務(wù)發(fā)現(xiàn)采用的是DNS方式,則Program D中直接使用Service B的服務(wù)發(fā)現(xiàn)域名,域名解析請(qǐng)求首先到達(dá)本機(jī)DNS代理,然后轉(zhuǎn)發(fā)到本機(jī)Consul Client,本機(jī)Client會(huì)將請(qǐng)求轉(zhuǎn)發(fā)到Consul Server,Consul Server查詢到Service B當(dāng)前的信息返回,最終Program D拿到了Service B的某個(gè)部署的IP和端口。

圖中描述的部署架構(gòu)筆者認(rèn)為是最普適最簡(jiǎn)單的方案,從某些默認(rèn)配置或設(shè)計(jì)上看也是官方希望使用者采用的方案,比如8500端口默認(rèn)監(jiān)聽(tīng)127.0.0.1,當(dāng)然有些同學(xué)不贊同,后邊會(huì)提到其他方案。

Consul實(shí)際使用

為了更快的熟悉Consul的原理及其使用方式,最好還是自己實(shí)際測(cè)試下。

Consul安裝十分簡(jiǎn)單,但是在一臺(tái)機(jī)器上不方便搭建集群進(jìn)行測(cè)試,使用虛擬機(jī)比較重,所以這里選擇了docker。這里用了Windows 10,需要是專業(yè)版,因?yàn)閃indows上的Docker依賴Hyper-V,而這個(gè)需要專業(yè)版才能支持。這里對(duì)于Docker的使用不會(huì)做過(guò)多的描述,如果遇到相關(guān)問(wèn)題請(qǐng)搜索一下。

安裝Docker

通過(guò)這個(gè)地址下載安裝:

https://store.docker.com/editions/community/docker-ce-desktop-windows

安裝完成后打開(kāi) Windows PowerShell,輸入docker –version,如果正常輸出docker版本就可以了。

啟動(dòng)Consul集群

在 Windows PowerShell中執(zhí)行命令拉取最新版本的Consul鏡像:

docker pull consul

然后就可以啟動(dòng)集群了,這里啟動(dòng)4個(gè)Consul Agent,3個(gè)Server(會(huì)選舉出一個(gè)leader),1個(gè)Client。

第1個(gè)啟動(dòng)容器的IP一般是172.17.0.2,后邊啟動(dòng)的幾個(gè)容器IP會(huì)排著來(lái):172.17.0.3、172.17.0.4、172.17.0.5。

這些Consul節(jié)點(diǎn)在Docker的容器內(nèi)是互通的,他們通過(guò)橋接的模式通信。但是如果主機(jī)要訪問(wèn)容器內(nèi)的網(wǎng)絡(luò),需要做端口映射。在啟動(dòng)第一個(gè)容器時(shí),將Consul的8500端口映射到了主機(jī)的8900端口,這樣就可以方便的通過(guò)主機(jī)的瀏覽器查看集群信息。

進(jìn)入容器consul1:

docker exec -it consul1 /bin/?sh#執(zhí)行l(wèi)s后可以看到consul就在根目錄ls

輸入exit可以跳出容器。

服務(wù)注冊(cè)

自己寫(xiě)一個(gè)web服務(wù),用最熟悉的開(kāi)發(fā)語(yǔ)言就好了,不過(guò)需要在容器中能夠跑起來(lái),可能需要安裝運(yùn)行環(huán)境,比如python、java、.net core等的sdk及web服務(wù)器,需要注意的是Consul的docker鏡像基于alpine系統(tǒng),具體運(yùn)行環(huán)境的安裝請(qǐng)搜索一下。

這里寫(xiě)了一個(gè)hello服務(wù),通過(guò)配置文件的方式注冊(cè)到Consul,服務(wù)的相關(guān)信息:

  • name:hello,服務(wù)名稱,需要能夠區(qū)分不同的業(yè)務(wù)服務(wù),可以部署多份并使用相同的name注冊(cè)。
  • id:hello1,服務(wù)id,在每個(gè)節(jié)點(diǎn)上需要唯一,如果有重復(fù)會(huì)被覆蓋。
  • address:172.17.0.5,服務(wù)所在機(jī)器的地址。
  • port:5000,服務(wù)的端口。
  • 健康檢查地址:http://localhost:5000/,如果返回HTTP狀態(tài)碼為200就代表服務(wù)健康,每10秒Consul請(qǐng)求一次,請(qǐng)求超時(shí)時(shí)間為1秒。

請(qǐng)將下面的內(nèi)容保存成文件services.json,并上傳到容器的/consul/config目錄中。

復(fù)制到consul config目錄:

docker?cp{這里請(qǐng)?zhí)鎿Q成services.json的本地路徑} consul4:/consul/config

重新加載consul配置:

consul reload

然后這個(gè)服務(wù)就注冊(cè)成功了。可以將這個(gè)服務(wù)部署到多個(gè)節(jié)點(diǎn),比如部署到consul1和consul4,并同時(shí)運(yùn)行。

服務(wù)發(fā)現(xiàn)

服務(wù)注冊(cè)成功以后,調(diào)用方獲取相應(yīng)服務(wù)地址的過(guò)程就是服務(wù)發(fā)現(xiàn)。Consul提供了多種方式。

HTTP API方式:

curl http:?//127.0.0.1:8500/v1/health/service/hello?passing=false

返回的信息包括注冊(cè)的Consul節(jié)點(diǎn)信息、服務(wù)信息及服務(wù)的健康檢查信息。這里用了一個(gè)參數(shù)passing=false,會(huì)自動(dòng)過(guò)濾掉不健康的服務(wù),包括本身不健康的服務(wù)和不健康的Consul節(jié)點(diǎn)上的服務(wù),從這個(gè)設(shè)計(jì)上可以看出Consul將服務(wù)的狀態(tài)綁定到了節(jié)點(diǎn)的狀態(tài)。

如果服務(wù)有多個(gè)部署,會(huì)返回服務(wù)的多條信息,調(diào)用方需要決定使用哪個(gè)部署,常見(jiàn)的可以隨機(jī)或者輪詢。為了提高服務(wù)吞吐量,以及減輕Consul的壓力,還可以緩存獲取到的服務(wù)節(jié)點(diǎn)信息,不過(guò)要做好容錯(cuò)的方案,因?yàn)榫彺娣?wù)部署可能會(huì)變得不可用。具體是否緩存需要結(jié)合自己的訪問(wèn)量及容錯(cuò)規(guī)則來(lái)確定。

上邊的參數(shù)passing默認(rèn)為false,也就是說(shuō)不健康的節(jié)點(diǎn)也會(huì)返回,結(jié)合獲取節(jié)點(diǎn)全部服務(wù)的方法,這里可以做到獲取全部服務(wù)的實(shí)時(shí)健康狀態(tài),并對(duì)不健康的服務(wù)進(jìn)行報(bào)警處理。

DNS方式:

hello服務(wù)的域名是:hello.service.dc1.consul,后邊的service代表服務(wù),固定;dc1是數(shù)據(jù)中心的名字,可以配置;最后的consul也可以配置。

官方在介紹DNS方式時(shí)經(jīng)常使用dig命令進(jìn)行測(cè)試,但是alpine系統(tǒng)中沒(méi)有dig命令,也沒(méi)有相關(guān)的包可以安裝,但是有人實(shí)現(xiàn)了,下載下來(lái)解壓到bin目錄就可以了。

curl -L https:?//github.com/sequenceiq/docker-alpine-dig/releases/download/v9.10.2/dig.tgz|tar -xzv -C /usr/local/bin

然后執(zhí)行dig命令:

dig @?127.0.?0.1-p?8600hello.service.dc1.consul. ANY

如果報(bào)錯(cuò):parse of /etc/resolv.conf failed ,請(qǐng)將resolv.conf中的search那行刪掉。

正常的話可以看到返回了服務(wù)部署的IP信息,如果有多個(gè)部署會(huì)看到多個(gè),如果某個(gè)部署不健康了會(huì)自動(dòng)剔除(包括部署所在節(jié)點(diǎn)不健康的情況)。需要注意這種方式不會(huì)返回服務(wù)的端口信息。

使用DNS的方式可以在程序中集成一個(gè)DNS解析庫(kù),也可以自定義本地的DNS Server。自定義本地DNS Server是指將.consul域的請(qǐng)求全部轉(zhuǎn)發(fā)到Consul Agent,Windows上有DNS Agent,Linux上有Dnsmasq;對(duì)于非Consul提供的服務(wù)則繼續(xù)請(qǐng)求原DNS;使用DNS Server時(shí)Consul會(huì)隨機(jī)返回具體服務(wù)的多個(gè)部署中的一個(gè),僅能提供簡(jiǎn)單的負(fù)載均衡。

DNS緩存問(wèn)題:DNS緩存一般存在于應(yīng)用程序的網(wǎng)絡(luò)庫(kù)、本地DNS客戶端或者代理,Consul Sever本身可以認(rèn)為是沒(méi)有緩存的(為了提高集群DNS吞吐量,可以設(shè)置使用普通Server上的陳舊數(shù)據(jù),但影響一般不大),DNS緩存可以減輕Consul Server的訪問(wèn)壓力,但是也會(huì)導(dǎo)致訪問(wèn)到不可用的服務(wù)。使用時(shí)需要根據(jù)實(shí)際訪問(wèn)量和容錯(cuò)能力確定DNS緩存方案。

Consul Template

Consul Template是Consul官方提供的一個(gè)工具,嚴(yán)格的來(lái)說(shuō)不是標(biāo)準(zhǔn)的服務(wù)發(fā)現(xiàn)方式。這個(gè)工具會(huì)通過(guò)Consul監(jiān)聽(tīng)數(shù)據(jù)變化然后替換模板中使用的標(biāo)簽,并發(fā)布替換后的文件到指定的目錄。在nginx等web服務(wù)器做反向代理和負(fù)載均衡時(shí)特別有用。

Consul的docker鏡像中沒(méi)有集成這個(gè)工具,需要自己安裝,比較簡(jiǎn)單:

curl -L https:?//releases.hashicorp.com/consul-template/0.19.5/consul-template_0.19.5_linux_amd64.tgz|tar -xzv -C /usr/local/bin

然后創(chuàng)建一個(gè)文件:in.tpl,內(nèi)容為:

{{ range service?"hello"}}server {{ .Name }}{{ .Address }}:{{ .Port }}{{ end }}

這個(gè)標(biāo)簽會(huì)遍歷hello服務(wù)的所有部署,并按照指定的格式輸出。在此文件目錄下執(zhí)行:

nohup consul-template -template?"in.tpl:out.txt"&

現(xiàn)在你可以cat out.txt查看根據(jù)模板生產(chǎn)的內(nèi)容,新增或者關(guān)閉服務(wù),文件內(nèi)容會(huì)自動(dòng)更新。

此工具我沒(méi)有用在生產(chǎn)環(huán)境,詳細(xì)使用請(qǐng)?jiān)L問(wèn):https://github.com/hashicorp/consul-template

節(jié)點(diǎn)和服務(wù)注銷

節(jié)點(diǎn)和服務(wù)的注銷可以使用HTTP API:

  • 注銷任意節(jié)點(diǎn)和服務(wù):/catalog/deregister
  • 注銷當(dāng)前節(jié)點(diǎn)的服務(wù):/agent/service/deregister/:service_id

如果某個(gè)節(jié)點(diǎn)不繼續(xù)使用了,也可以在本機(jī)使用consul leave命令,或者在其它節(jié)點(diǎn)使用consul force-leave 節(jié)點(diǎn)Id。

Consul的健康檢查

Consul做服務(wù)發(fā)現(xiàn)是專業(yè)的,健康檢查是其中一項(xiàng)必不可少的功能,其提供/TCP/HTTP+Interval,以及TTL等多種方式。服務(wù)的健康檢查由服務(wù)注冊(cè)到的Agent來(lái)處理,這個(gè)Agent既可以是Client也可以是Server。

很多同學(xué)都使用ZooKeeper或者etcd做服務(wù)發(fā)現(xiàn),使用Consul時(shí)發(fā)現(xiàn)節(jié)點(diǎn)掛掉后服務(wù)的狀態(tài)變?yōu)椴豢捎昧?#xff0c;所以有同學(xué)問(wèn)服務(wù)為什么不在各個(gè)節(jié)點(diǎn)之間同步?這個(gè)根本原因是服務(wù)發(fā)現(xiàn)的實(shí)現(xiàn)原理不同。

Consul與ZooKeeper、etcd的區(qū)別

后邊這兩個(gè)工具是通過(guò)鍵值存儲(chǔ)來(lái)實(shí)現(xiàn)服務(wù)的注冊(cè)與發(fā)現(xiàn)。

  • ZooKeeper利用臨時(shí)節(jié)點(diǎn)的機(jī)制,業(yè)務(wù)服務(wù)啟動(dòng)時(shí)創(chuàng)建臨時(shí)節(jié)點(diǎn),節(jié)點(diǎn)在服務(wù)就在,節(jié)點(diǎn)不存在服務(wù)就不存在。
  • etcd利用TTL機(jī)制,業(yè)務(wù)服務(wù)啟動(dòng)時(shí)創(chuàng)建鍵值對(duì),定時(shí)更新ttl,ttl過(guò)期則服務(wù)不可用。

ZooKeeper和etcd的鍵值存儲(chǔ)都是強(qiáng)一致性的,也就是說(shuō)鍵值對(duì)會(huì)自動(dòng)同步到多個(gè)節(jié)點(diǎn),只要在某個(gè)節(jié)點(diǎn)上存在就可以認(rèn)為對(duì)應(yīng)的業(yè)務(wù)服務(wù)是可用的。

Consul的數(shù)據(jù)同步也是強(qiáng)一致性的,服務(wù)的注冊(cè)信息會(huì)在Server節(jié)點(diǎn)之間同步,相比ZK、etcd,服務(wù)的信息還是持久化保存的,即使服務(wù)部署不可用了,仍舊可以查詢到這個(gè)服務(wù)部署。但是業(yè)務(wù)服務(wù)的可用狀態(tài)是由注冊(cè)到的Agent來(lái)維護(hù)的,Agent如果不能正常工作了,則無(wú)法確定服務(wù)的真實(shí)狀態(tài),并且Consul是相當(dāng)穩(wěn)定了,Agent掛掉的情況下大概率服務(wù)器的狀態(tài)也可能是不好的,此時(shí)屏蔽掉此節(jié)點(diǎn)上的服務(wù)是合理的。Consul也確實(shí)是這樣設(shè)計(jì)的,DNS接口會(huì)自動(dòng)屏蔽掛掉節(jié)點(diǎn)上的服務(wù),HTTP API也認(rèn)為掛掉節(jié)點(diǎn)上的服務(wù)不是passing的。

鑒于Consul健康檢查的這種機(jī)制,同時(shí)避免單點(diǎn)故障,所有的業(yè)務(wù)服務(wù)應(yīng)該部署多份,并注冊(cè)到不同的Consul節(jié)點(diǎn)。部署多份可能會(huì)給你的設(shè)計(jì)帶來(lái)一些挑戰(zhàn),因?yàn)檎{(diào)用方同時(shí)訪問(wèn)多個(gè)服務(wù)實(shí)例可能會(huì)由于會(huì)話不共享導(dǎo)致?tīng)顟B(tài)不一致,這個(gè)有許多成熟的解決方案,可以去查詢,這里不做說(shuō)明。

健康檢查能不能支持故障轉(zhuǎn)移?

上邊提到健康檢查是由服務(wù)注冊(cè)到的Agent來(lái)處理的,那么如果這個(gè)Agent掛掉了,會(huì)不會(huì)有別的Agent來(lái)接管健康檢查呢?答案是否定的。

從問(wèn)題產(chǎn)生的原因來(lái)看,在應(yīng)用于生產(chǎn)環(huán)境之前,肯定需要對(duì)各種場(chǎng)景進(jìn)行測(cè)試,沒(méi)有問(wèn)題才會(huì)上線,所以顯而易見(jiàn)的問(wèn)題可以屏蔽掉;如果是新版本Consul的BUG導(dǎo)致的,此時(shí)需要降級(jí);如果這個(gè)BUG是偶發(fā)的,那么只需要將Consul重新拉起來(lái)就可以了,這樣比較簡(jiǎn)單;如果是硬件、網(wǎng)絡(luò)或者操作系統(tǒng)故障,那么節(jié)點(diǎn)上服務(wù)的可用性也很難保障,不需要?jiǎng)e的Agent接管健康檢查。

從實(shí)現(xiàn)上看,選擇哪個(gè)節(jié)點(diǎn)是個(gè)問(wèn)題,這需要實(shí)時(shí)或準(zhǔn)實(shí)時(shí)同步各個(gè)節(jié)點(diǎn)的負(fù)載狀態(tài),而且由于業(yè)務(wù)服務(wù)運(yùn)行狀態(tài)多變,即使當(dāng)時(shí)選擇出了負(fù)載比較輕松的節(jié)點(diǎn),無(wú)法保證某個(gè)時(shí)段任務(wù)又變得繁重,可能造成新的更大范圍的崩潰。如果原來(lái)的節(jié)點(diǎn)還要啟動(dòng)起來(lái),那么接管的健康檢查是否還要撤銷,如果要,需要記錄服務(wù)們最初注冊(cè)的節(jié)點(diǎn),然后有一個(gè)監(jiān)聽(tīng)機(jī)制來(lái)觸發(fā),如果不要,通過(guò)服務(wù)發(fā)現(xiàn)就會(huì)獲取到很多冗余的信息,并且隨著時(shí)間推移,這種數(shù)據(jù)會(huì)越來(lái)越多,系統(tǒng)變的無(wú)序。

從實(shí)際應(yīng)用看,節(jié)點(diǎn)上的服務(wù)可能既要被發(fā)現(xiàn),又要發(fā)現(xiàn)別的服務(wù),如果節(jié)點(diǎn)掛掉了,僅提供被發(fā)現(xiàn)的功能實(shí)際上服務(wù)還是不可用的。當(dāng)然發(fā)現(xiàn)別的服務(wù)也可以不使用本機(jī)節(jié)點(diǎn),可以通過(guò)訪問(wèn)一個(gè)Nginx實(shí)現(xiàn)的若干Consul節(jié)點(diǎn)的負(fù)載均衡來(lái)實(shí)現(xiàn),這無(wú)疑又引入了新的技術(shù)棧。

如果不是上邊提到的問(wèn)題,或者你可以通過(guò)一些方式解決這些問(wèn)題,健康檢查接管的實(shí)現(xiàn)也必然是比較復(fù)雜的,因?yàn)榉植际较到y(tǒng)的狀態(tài)同步是比較復(fù)雜的。同時(shí)不要忘了服務(wù)部署了多份,掛掉一個(gè)不應(yīng)該影響系統(tǒng)的快速恢復(fù),所以沒(méi)必要去做這個(gè)接管。

Consul的其它部署架構(gòu)

如果你實(shí)在不想在每個(gè)主機(jī)部署Consul Client,還有一個(gè)多路注冊(cè)的方案可供選擇,這是交流群中獲得的思路。

如圖所示,在專門的服務(wù)器上部署Consul Client,然后每個(gè)服務(wù)都注冊(cè)到多個(gè)Client,這里為了避免服務(wù)單點(diǎn)問(wèn)題還是每個(gè)服務(wù)部署多份,需要服務(wù)發(fā)現(xiàn)時(shí),程序向一個(gè)提供負(fù)載均衡的程序發(fā)起請(qǐng)求,該程序?qū)⒄?qǐng)求轉(zhuǎn)發(fā)到某個(gè)Consul Client。這種方案需要注意將Consul的8500端口綁定到私網(wǎng)IP上,默認(rèn)只有127.0.0.1。

這個(gè)架構(gòu)的優(yōu)勢(shì):

  • Consul節(jié)點(diǎn)服務(wù)器與應(yīng)用服務(wù)器隔離,互相干擾少;
  • 不用每臺(tái)主機(jī)都部署Consul,方便Consul的集中管理;
  • 某個(gè)Consul Client掛掉的情況下,注冊(cè)到其上的服務(wù)仍有機(jī)會(huì)被訪問(wèn)到;

但也需要注意其缺點(diǎn):

  • 引入更多技術(shù)棧:負(fù)載均衡的實(shí)現(xiàn),不僅要考慮Consul Client的負(fù)載均衡,還要考慮負(fù)載均衡本身的單點(diǎn)問(wèn)題。
  • Client的節(jié)點(diǎn)數(shù)量:單個(gè)Client如果注冊(cè)的服務(wù)太多,負(fù)載較重,需要有個(gè)算法(比如hash一致)合理分配每個(gè)Client上的服務(wù)數(shù)量,以及確定Client的總體數(shù)量。
  • 服務(wù)發(fā)現(xiàn)要過(guò)濾掉重復(fù)的注冊(cè),因?yàn)樽?cè)到了多個(gè)節(jié)點(diǎn)會(huì)認(rèn)為是多個(gè)部署(DNS接口不會(huì)有這個(gè)問(wèn)題)。

這個(gè)方案其實(shí)還可以優(yōu)化,服務(wù)發(fā)現(xiàn)使用的負(fù)載均衡可以直接代理Server節(jié)點(diǎn),因?yàn)橄嚓P(guān)請(qǐng)求還是會(huì)轉(zhuǎn)發(fā)到Server節(jié)點(diǎn),不如直接就發(fā)到Server。

是否可以只有Server?

這個(gè)問(wèn)題的答案還是有關(guān)服務(wù)數(shù)量的問(wèn)題,首先Server的節(jié)點(diǎn)數(shù)量不是越多越好,3個(gè)或者5個(gè)是推薦的數(shù)量,數(shù)量越多數(shù)據(jù)同步的處理越慢(強(qiáng)一致性);然后每個(gè)節(jié)點(diǎn)可以注冊(cè)的服務(wù)數(shù)量是有上限的,這個(gè)受限于軟硬件的處理能力。所以如果你的服務(wù)只有10個(gè)左右,只有Server問(wèn)題是不大的,但是這時(shí)候有沒(méi)有必要使用Consul呢?因此正常使用Consul的時(shí)候還是要有Client才好,這也符合Consul的反熵設(shè)計(jì)。

大家可以將這個(gè)部署架構(gòu)與前文提到的普世架構(gòu)對(duì)比下,看看哪個(gè)更適合自己,或者你有更好的方案歡迎分享出來(lái)。

超強(qiáng)干貨來(lái)襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生

總結(jié)

以上是生活随笔為你收集整理的consul使用的一些见解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。