一、Consul的集羣介紹
Consul Agent有兩種運行模式:Server和Client。這裏的Server和Client只是Consul集羣層面的區分,與搭建在Cluster之上的應用服務無關, 以Server模式運行的Consul Agent節點用於維護Consul集羣的狀態,官方建議每個Consul Cluster至少有3個或以上的運行在Server Mode的Agent,Client節點不限。
1、Server節點需要三臺或以上機器
2、Client節點不限
二、Consul環境準備
準備了三臺Linux(CentOS)虛擬機(Consul Server)二臺Linux(CentOS)虛擬機(Consul Client)
Consul Server服務IP分別爲:
192.168.31.175
192.168.31.176
192.168.31.177
Consul Client服務IP分別爲:
192.168.31.178
192.168.31.179
其中,192.168.31.175會作爲leader角色,其餘兩臺192.168.31.176和192.168.31.177會作爲follower角色。當然,實際環境中leader角色不會是一個固定的,會隨着環境的變化(比如Leader宕機或失聯)由算法選出新的leader。在進行下面的操作會前,請確保三臺節點能夠相互ping通,並能夠和宿主機也ping通。另外,192.168.31.178和192.168.31.179會作爲client角色,並且和其餘三臺虛擬機互相ping通。
三、Consul正式安裝
可以參考上一篇文章的安裝方法:.netcore consul實現服務註冊與發現-單臺節點
一定保證以上五臺安裝成功
1、測試Consul是否安裝成功
如下圖表示成功:
2、Consul Server服務端安裝(啓動與配置Consul服務)
服務端192.168.31.175執行
服務端192.168.31.176執行
服務端192.168.31.177執行
注:因爲是集羣安裝,bootstrap-expect=3,以服務端的數量爲準
datacenter=dc1,三臺必須在一個數據中心
176和177的啓動命令中,有一句 -join 192.168.31.175 => 有了這一句,就把176和177加入到了175所在的集羣中。
啓動之後,集羣就開始了Vote(投票選Leader)的過程
命令:查看各個server的情況:
命令:查看目前全部的consul的角色狀態:
3、通過UI查看集羣狀態
Consul不僅提供了豐富的命令查看集羣情況,還提供了一個WebUI,默認端口8500,我們可以通過訪問這個URL(eg. http://192.168.31.175:8500)得到如下圖所示的WebUI:
3、模擬Leader掛掉,查看Consul集羣的新選舉Leader
直接停止192.168.31.175的服務,或者暴力直接關機
輸入命令查看服務狀態
查看其餘兩個節點的日誌或者命令可以發現,consul-176被選爲了新的leader
我們也可以在次通過UI界面來查看狀態:
雖然這裏192.168.31.175這個原leader節點掛掉了,但是隻要超過一半的Server(這裏是2/3還活着)還活着,集羣是可以正常工作的,這也是爲什麼像Consul、ZooKeeper這樣的分佈式管理組件推薦我們使用3個或5個節點來部署的原因。
注:以上也可以將.netcore項目部署在Consul Server上,但官方建議用Consul Client來關聯,分別做各自的事情,互不影響。
4、Consul Client安裝
爲了節約虛擬機,目前在192.168.31.178部署.netcore項目
啓動並運行mvc,webapi兩個項目,保證能正常訪問,如圖正常訪問
5、將.netcore服務註冊到Consul(通過配置文件來註冊服務)
在Consul Client 192.168.31.178運行命令:
如下圖表示正常啓動,並將192.168.31.178加入到服務集羣192.168.31.175中
6、查看Consul集羣狀態
可以看到192.168.31.178加入到了集羣中,表示正常,還能看到.netcore的兩個服務哦,也表示正常
Consul不僅僅提供了服務註冊,還提供了服務發現,我們可以通過調用其提供的API來發現服務的IP和Port。
四、總結與後續工作
本篇主要基於一個最小化的集羣搭建了一個Consul服務治理組件,並將ASP.NET Core API程序註冊到了Consul(通過配置文件註冊),並嘗試通過Consul進行服務發現。希望整理這篇文章對大家有一些幫助,同時希望大家把.NET Core應用起來,將來能夠跑在Linux和Docker上,希望大家早日實現目標。
後續我會繼續嘗試基於Ocelot構建API網關,到時會結合Consul進行進一步的集成。另外,還會嘗試Polly進行熔斷降級、Identity Server進行驗證
Exceptionless作分佈式日誌開源框架,Log4net,NLog,Autofac屬性注入,Consul API接口服務註冊實例等開源地址:https://github.com/hailang2ll/DMS