.Net Core服務(wù)治理Consul搭建集群
延續(xù)上一篇的話題繼續(xù),順便放上一篇的傳送門:點(diǎn)這里。
集群的必要性
consul本身就是管理集群的,現(xiàn)在還需要給consul搞個(gè)集群,這是為啥?因?yàn)閏onsul單點(diǎn)也容易掛??!萬(wàn)一管理集群的consul掛掉了,那么相當(dāng)于上下游應(yīng)用都變成了瞎子,看不到也調(diào)不到。所以集群的必要性不用我說(shuō)了吧?
Server & Client
生產(chǎn)環(huán)境下,可以選擇上面兩種模式,下面我就簡(jiǎn)稱S端、C端。說(shuō)說(shuō)它倆有啥不一樣:
S端:
- 1、數(shù)量不宜過(guò)多,一般推薦3、5個(gè),要求是奇數(shù)。
- 2、持久化保存節(jié)點(diǎn)數(shù)據(jù)。
- 3、多個(gè)S端之間是主從關(guān)系(Leader/Follower),Leader要額外負(fù)責(zé)監(jiān)控各節(jié)點(diǎn)的健康并且同步給Follower。
C端:
- 1、數(shù)量沒(méi)限制。
- 2、不保存節(jié)點(diǎn)數(shù)據(jù)。
相同點(diǎn)就是S端、C端都可以注冊(cè)、查詢。
Leader & Follower
這模式我簡(jiǎn)稱主從好了,它只針對(duì)S端。Leader是根據(jù)Raft算法自動(dòng)選舉得出的,不用手動(dòng)指定,所有的Follower接到信息以后,都要提交給Leader,然后Leader同步給其他的Follower。并且Leader要一直發(fā)心跳給所有的Follower證明“我還活著”,否則其他的Follower之間就要再選舉出一個(gè)新的Leader了。這就導(dǎo)致S端最好不要擴(kuò)展太多,否則你會(huì)懷疑人生。至于為什么要求S端數(shù)量是奇數(shù),其實(shí)很好理解,偶數(shù)容易影響選舉結(jié)果導(dǎo)致效率變低,比如兩票對(duì)兩票,誰(shuí)來(lái)當(dāng)Leader?其實(shí)去了解一下Raft算法就知道這里的主從怎么運(yùn)行的,什么原理。我上個(gè)神器:戳這里,不用謝我。
S端
老規(guī)矩,還是用docker。先跑三個(gè)起來(lái):
docker run -d --restart=always --name=server1 -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt":true}' -p 8300:8300 -p 8301:8301 -p 8301:8301/udp -p 8302:8302/udp -p 8302:8302 -p 8400:8400 -p 8500:8500 -p 8600:8600 -h server1 consul agent -server -bind=0.0.0.0 -bootstrap-expect=3 -node=server1 -data-dir=/tmp/data-dir -client 0.0.0.0 -ui docker run -d --restart=always --name=server2 -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt":true}' -p 9300:8300 -p 9301:8301 -p 9301:8301/udp -p 9302:8302/udp -p 9302:8302 -p 9400:8400 -p 9500:8500 -p 9600:8600 -h server2 consul agent -server -bind=0.0.0.0 -join=你服務(wù)器的IP -node=server2 -data-dir=/tmp/data-dir -client 0.0.0.0 -ui docker run -d --restart=always --name=server3 -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt":true}' -p 10300:8300 -p 10301:8301 -p 10301:8301/udp -p 10302:8302/udp -p 10302:8302 -p 10400:8400 -p 10500:8500 -p 10600:8600 -h server3 consul agent -server -bind=0.0.0.0 -join=你服務(wù)器的IP -node=server3 -data-dir=/tmp/data-dir -client 0.0.0.0 -ui
bootstrap-expect:集群所需S端的最小數(shù)量,低于這個(gè)數(shù)量無(wú)法選舉出leader。
join:加入到哪個(gè)集群,需要目標(biāo)服務(wù)器放通tcp8301端口,否則會(huì)出現(xiàn)這種情況
可以語(yǔ)句查看主從關(guān)系:
docker exec -t server1 consul operator raft list-peers
也可以直接進(jìn)入頁(yè)面查看主從關(guān)系,結(jié)果一樣:
把現(xiàn)在的leader干掉的話,會(huì)自動(dòng)選舉一個(gè)新的leader出來(lái):
server3成為了新的leader,而且只要它不掛,leader身份是不會(huì)轉(zhuǎn)移的。比如我把server1啟動(dòng)以后,leader沒(méi)有轉(zhuǎn)移過(guò)去:
OK,現(xiàn)在S端已經(jīng)是集群了,而且它們之間的數(shù)據(jù)都是互通共存的。驗(yàn)證一下:
server1新增鍵值,key=shenzhenma,value=hellow:
server2查看:
server3修改value=hellow world以后,server1查看:
C端
現(xiàn)在再來(lái)啟動(dòng)客戶端:
docker run -d --restart=always --name=client1 -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt":true}' -p 11300:8300 -p 11301:8301 -p 11301:8301/udp -p 11302:8302/udp -p 11302:8302 -p 11400:8400 -p 11500:8500 -p 11600:8600 -h client1 consul agent -bind=0.0.0.0 -retry-join=你服務(wù)器的IP -node=client1 -data-dir=/tmp/data-dir -client 0.0.0.0 -ui
想要多個(gè)客戶端的話,改一下端口和名字就可以了,我這里跑了3個(gè),如圖:
和剛才的3個(gè)S端一起,這6個(gè)都是一體的,數(shù)據(jù)都會(huì)自動(dòng)同步,任意節(jié)點(diǎn)注冊(cè)修改數(shù)據(jù)都會(huì)在其他節(jié)點(diǎn)看到。
入口統(tǒng)一
我把集群弄好了,但是現(xiàn)在的集群還沒(méi)有發(fā)揮作用。前幾篇文章有講服務(wù)注冊(cè),consul注冊(cè)的時(shí)候需要一個(gè)固定的地址。集群有很多節(jié)點(diǎn),每一個(gè)IP端口都不一樣,如果下端只和其中一個(gè)節(jié)點(diǎn)產(chǎn)生聯(lián)系,萬(wàn)一這個(gè)節(jié)點(diǎn)掛了,下端就失去consul的支持了,集群的作用也沒(méi)發(fā)揮出來(lái)。所以給下端一個(gè)統(tǒng)一的入口是必要的,這里用Nginx的Upstream模式實(shí)現(xiàn),修改下配置文件就行了:
upstream myconsul { server 42.XX.XX.64:8500; server 42.XX.XX.64:9500; server 42.XX.XX.64:10500; server 42.XX.XX.64:11500; server 42.XX.XX.64:12500; server 42.XX.XX.64:13500; } server{ listen 88; server_name localhost; location / { proxy_pass http://myconsul; } }
配置文件修改好重啟一下,進(jìn)去看看能不能訪問(wèn):
OK,下端注冊(cè)服務(wù)時(shí),統(tǒng)一用這個(gè)地址就可以了。跑兩個(gè)試試(下端代碼就不發(fā)了,前面幾篇文章有):
成功了!切換到其他consul節(jié)點(diǎn)看下能否正確展示:
很顯然是OK的?;谖抑盀榉?wù)配置的健康檢查,最后來(lái)看下服務(wù)狀態(tài)變化會(huì)不會(huì)同步給其他節(jié)點(diǎn),比如我停掉其中一個(gè):
變更的狀態(tài)也很快同步到了其他節(jié)點(diǎn)。到這里為止,consul的集群就已經(jīng)實(shí)現(xiàn)了,東西還是有點(diǎn)多的,如果實(shí)踐遇到麻煩,歡迎討論。
到此這篇關(guān)于.Net Core服務(wù)治理Consul搭建集群的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- .Net?Core3.0?WebApi?項(xiàng)目框架搭建之使用Serilog替換掉Log4j
- 基于Jenkins搭建.NET Core持續(xù)集成環(huán)境過(guò)程圖解
- Centos7系統(tǒng)下搭建.NET Core2.0+Nginx+Supervisor環(huán)境
- CodeFirst從零開(kāi)始搭建Asp.Net Core2.0網(wǎng)站
- .Net Core+Angular Cli/Angular4開(kāi)發(fā)環(huán)境搭建教程
- VS2015 搭建Asp.net core開(kāi)發(fā)環(huán)境的方法
- 詳解.Net Core + Angular2 環(huán)境搭建
- 云服務(wù)器下搭建ASP.NET Core環(huán)境
- Linux(Ubuntu)下搭建ASP.NET Core環(huán)境
- win10下ASP.NET Core部署環(huán)境搭建步驟
- Windows Server 2012 R2 Standard搭建ASP.NET Core環(huán)境圖文教程
- Ubuntu16.04系統(tǒng)搭建.Net Core開(kāi)發(fā)環(huán)境
相關(guān)文章
解讀ASP.NET 5 & MVC6系列教程(15):MvcOptions配置
這篇文章主要介紹了ASP.NET 5 MVC6中MvcOptions配置方法,需要的朋友可以參考下2016-06-06在ASP.NET 2.0中操作數(shù)據(jù)之四十九:為GridView控件添加RadioButton
本文主要講解ASP.NET 2.0為GridView的每一行添加RadioButton具體方法,并配合Literal控件實(shí)現(xiàn)單選的目的。2016-05-05在ASP.NET 2.0中操作數(shù)據(jù)之三十:格式化DataList和Repeater的數(shù)據(jù)
本文主要介紹ASP.NET 2.0使用DataList和Repeater如何呈現(xiàn)數(shù)據(jù),一種是在控件的ItemDataBound事件中處理,一種則是在綁定數(shù)據(jù)時(shí)調(diào)用后臺(tái)定義的方法來(lái)實(shí)現(xiàn)。2016-05-05.Net?Core服務(wù)治理Consul使用服務(wù)發(fā)現(xiàn)
Consul是HashiCorp公司推出的開(kāi)源工具,Consul由Go語(yǔ)言開(kāi)發(fā),部署起來(lái)非常容易,只需要極少的可執(zhí)行程序和配置文件,具有綠色、輕量級(jí)的特點(diǎn)。Consul是分布式的、高可用的、?可橫向擴(kuò)展的用于實(shí)現(xiàn)分布式系統(tǒng)的服務(wù)發(fā)現(xiàn)與配置2022-01-01無(wú)法在Web服務(wù)器上啟動(dòng)調(diào)試。未將項(xiàng)目配置為進(jìn)行調(diào)試
無(wú)法在Web服務(wù)器上啟動(dòng)調(diào)試。未將項(xiàng)目配置為進(jìn)行調(diào)試...2006-10-10在ASP.NET 2.0中操作數(shù)據(jù)之三十一:使用DataList來(lái)一行顯示多條記錄
ASP.NET 2.0中DataList默認(rèn)情況使用單列多行的table來(lái)顯示項(xiàng),本文介紹通過(guò)設(shè)置RepeatColumns屬性為每行的列數(shù)就可以達(dá)到顯示多條記錄這個(gè)目的。2016-05-05我今天開(kāi)始正式學(xué)習(xí).net遇到的問(wèn)題
我今天開(kāi)始正式學(xué)習(xí).net遇到的問(wèn)題...2006-10-10.Net?Core微服務(wù)網(wǎng)關(guān)Ocelot集成Consul
這篇文章介紹了.Net?Core微服務(wù)網(wǎng)關(guān)Ocelot集成Consul的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-01-01