C#中怎么利用Consul集群實現(xiàn)服務(wù)注冊與發(fā)現(xiàn)

C#中怎么利用Consul集群實現(xiàn)服務(wù)注冊與發(fā)現(xiàn),相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。

創(chuàng)新互聯(lián)建站是專業(yè)的商丘網(wǎng)站建設(shè)公司,商丘接單;提供成都做網(wǎng)站、成都網(wǎng)站建設(shè)、成都外貿(mào)網(wǎng)站建設(shè),網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進行商丘網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!

Consul簡介

Consul一個什么,我想大家通過搜索引擎一定可以搜索到;所以,我就不在重復(fù)他的官方描述了。

這里,我為大家提供一個更加好理解的描述。

Consul是什么?

Consul本質(zhì)上是一個Socket通信中間件。

它主要實現(xiàn)了兩個功能,服務(wù)注冊與發(fā)現(xiàn)與自身的負(fù)載均衡的集群。

我們可以把他理解為一個沒有界面的應(yīng)用程序,因為沒有界面,所以想啟動Consul就只能使用命令行了;也因為沒有界面,一旦使用命令行啟動了Consul,那么,執(zhí)行該命令行的cmd.exe程序,就成了Consul的宿主了;一旦關(guān)閉Cmd窗口,Consul就停止運行了。

服務(wù)注冊與發(fā)現(xiàn)的本質(zhì)是什么?

其實服務(wù)注冊與發(fā)現(xiàn)的原理很簡單。

當(dāng)我們在本機運行Consul時,他會自動監(jiān)聽8500端口;然后我們通過一個開源類庫(這個開源類庫可以在nuget上檢索到,文章下面會介紹),調(diào)用其下不同的方法來向這個Consul進程發(fā)送TCP消息,來注冊服務(wù)或者發(fā)現(xiàn)服務(wù)。

Consul進程在接收到注冊消息時,就把注冊的服務(wù)信息存儲到本地磁盤或內(nèi)存(因為我沒有具體去調(diào)查Consul存儲數(shù)據(jù)是否使用了數(shù)據(jù)庫,但我們都知道數(shù)據(jù)庫的數(shù)據(jù)也是保存在本地磁盤的,所以,它肯定是把數(shù)據(jù)存進磁盤或者內(nèi)存中了)。

數(shù)據(jù)中心

Consul存儲數(shù)據(jù)的地方,官方為其命名為數(shù)據(jù)中心,也就是上面說的保存我們注冊的服務(wù)信息的本地磁盤或者內(nèi)存。

Consul提供負(fù)載均衡的集群

Consul的集群也很好理解,在我們成功啟動Consul以后,它除了監(jiān)聽8500端口以外,它還監(jiān)聽了一個8031端口。

這個8031端口就是用于Consul集群相互通信的。

我們都知道集群是要兩臺以上的電腦的,所以,我們就必須找到兩臺或以上的電腦安裝Consul中間件。

然后,使用Consul的命令行,將兩臺電腦連接到一起,這樣集群就形成了。

在集群內(nèi)每臺電腦上安裝的Consul中間件,我們統(tǒng)稱為服務(wù)器代理(Agent);當(dāng)集群啟動后,會在多個代理服務(wù)器之間選舉出一個Leader。

選舉Leader自然就是服務(wù)器代理之間的通信了,也就是通過上面提到的8031端口通信的。

選舉了Leader,服務(wù)器代理就可以將自身的負(fù)載信息發(fā)送給Leader了,這樣客戶端調(diào)用Consul檢索服務(wù)數(shù)據(jù)時,就可以去性能最優(yōu)的那臺機器上獲取信息了。(注:這個就是舉例說明,并非Consul的負(fù)載均衡的真實處理模式)

Consul代理服務(wù)器安裝

首先,去官網(wǎng)下載Consul,官網(wǎng)下載地址https://www.consul.io/downloads.html

拉到網(wǎng)站的最下方,選擇Window64-bit的Consul下載,如下圖:

下載完成后,我們得到一個壓縮包consul_1.6.2_windows_amd64.zip;解壓縮后,得到consul.exe文件,如下圖:

因為我們要使用命令行來運行consul,所以,我們將consul.exe所在的目錄添加進環(huán)境變量,這樣,當(dāng)我們在CMD窗口中執(zhí)行consul的相關(guān)命令時,系統(tǒng)就會自動將這個些命令發(fā)送給consul.exe文件執(zhí)行了。

配置環(huán)境變量如下圖所示:

配置完環(huán)境變量,我們打開一個cmd的命令行窗口,然后輸入consul來確認(rèn)我們的環(huán)境變量是否配置成功,如下圖:

看到圖中的信息,就代表我們的consul的環(huán)境變量配置成功了,已經(jīng)可以運行了。

接下來,我們在這個cmd窗體中輸入consul的命令來啟動consul服務(wù)器代理,命令如下:

命令解釋如下:

consul agent -server -ui -bootstrap-expect=1 -data-dir=/tmp/consul -node=consul-1 -client=0.0.0.0 -bind=192.168.1.111 -datacenter=dc1

其實consul命令大家是可以在網(wǎng)絡(luò)上搜到它們的定義的,不過我覺得解釋的還是太官方,所以,我在這里提供了一份我認(rèn)為更好的解釋。

consul agent:命令頭,必須要有。

-server:表面我們現(xiàn)在要啟動服務(wù)器代理(agent)是服務(wù)模式的。Consul Agent的運行模式有兩種,Server模式和Client模式。其區(qū)別簡單來說就是Server模式的Agent可以被選舉為Leader,而Client模式的不可以,當(dāng)然還有其他區(qū)別,有興趣大家可以自行了解。

-ui:consul運行后,會提供一個http://127.0.0.1:8500/ui/的網(wǎng)站,里面存儲了Consul Agent各個節(jié)點以及注冊的服務(wù)等相關(guān)信息,即數(shù)據(jù)中心的網(wǎng)頁形式體現(xiàn)。這個參數(shù)代表是否創(chuàng)建這個網(wǎng)站,這個參數(shù)與這個數(shù)據(jù)中心網(wǎng)站有關(guān)。

bind:本機的ip地址,集群內(nèi)其他代理服務(wù)器可以通過這個ip來訪問這臺電腦的consul代理服務(wù)器。

bootstrap-expect:是集群啟動條件,指當(dāng)服務(wù)器端模式(Server模式)的代理達(dá)到這個數(shù)目后,才開始運行。

data-dir:是存放數(shù)據(jù)中心數(shù)據(jù)的,該目錄必須是穩(wěn)定的,系統(tǒng)重啟后也繼續(xù)存在的。

datacenter:當(dāng)前agent的中心數(shù)據(jù)的名稱,默認(rèn)是dc1。

node:節(jié)點在集群中的名稱,在一個集群中必須是唯一的,默認(rèn)是該節(jié)點的主機名(代表一個機器)。

client:本地ip地址,這里使用 0.0.0.0 ,就表示這個服務(wù)器所有IP都可以,即當(dāng)這臺電腦有倆ip,192.168.1.111和192.168.1.112,那么通過這倆IP都可以訪問到這臺機器的consul代理服務(wù)器。

運行該命令,如下圖所示:

可以看到,我們的Consul代理服務(wù)已經(jīng)成功運行了。

現(xiàn)在,我們在去另一臺電腦,打開cmd窗口,運行如下consul命令:

consul agent -server -ui -bootstrap-expect=1 -data-dir=d:\consul -node=consul-2 -client=0.0.0.0 -bind=192.168.80.112 -datacenter=dc1 -join 192.168.80.111

可以看到,我們在命令行最后面追加了一個join 192.168.80.111;通過這個命令,我們把這臺電腦的代理服務(wù)器成功的加入到了上文中的consul集群。

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

Consul的服務(wù)注冊

首先,我們創(chuàng)建一個WebAPI,這里為使用了Core框架創(chuàng)建了一個Web API,為了方便測試,我就直接拿本地的VisualStudio啟動測試了。

創(chuàng)建WebAPI后,我們在Nuget中查找Consul的Net版本類庫。

在Nuget中搜索Consul,然后選中下圖中的選項進行安裝。

然后,我們在Startup文件中,增加一個函數(shù),如下:

public static void RegisterConsul(){  var consulClient = new ConsulClient(p => { p.Address = new Uri($"http://127.0.0.1:8500"); });//請求注冊的 Consul 地址  //這里的這個ip 就是本機的ip,這個端口8500 這個是默認(rèn)注冊服務(wù)端口   var httpCheck = new AgentServiceCheck()  {    DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5),//服務(wù)啟動多久后注冊    Interval = TimeSpan.FromSeconds(10),//間隔固定的時間訪問一次,https://localhost:44308/api/Health    HTTP = $"https://localhost:44308/api/Health",//健康檢查地址 44308是visualstudio啟動的端口    Timeout = TimeSpan.FromSeconds(5)  };     var registration = new AgentServiceRegistration()  {    Checks = new[] { httpCheck },     ID = Guid.NewGuid().ToString(),    Name = "test1",    Address = "https://localhost/",    Port = 44308,      };  consulClient.Agent.ServiceRegister(registration).Wait();//注冊服務(wù)   //consulClient.Agent.ServiceDeregister(registration.ID).Wait();//registration.ID是guid  //當(dāng)服務(wù)停止時需要取消服務(wù)注冊,不然,下次啟動服務(wù)時,會再注冊一個服務(wù)。  //但是,如果該服務(wù)長期不啟動,那consul會自動刪除這個服務(wù),大約2,3分鐘就會刪了 }

然后在Configure中調(diào)用這個方法,這樣,當(dāng)我們調(diào)試或運行這個項目時,就會自動將這個Webapi注冊到Consul里了。

public void Configure(IApplicationBuilder app, IWebHostEnvironment env){  if (env.IsDevelopment())  {    app.UseDeveloperExceptionPage();  }    app.UseHttpsRedirection();  app.UseRouting();  app.UseAuthorization();  app.UseEndpoints(endpoints =>  {    endpoints.MapControllers();  });  RegisterConsul();//注冊本服務(wù)到consul集群 }

服務(wù)注冊完后,可以訪問本地數(shù)據(jù)中心的網(wǎng)站【http://127.0.0.1:8500/ui/dc1/services】來查看注冊服務(wù)的狀態(tài)。

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

服務(wù)注冊完成后,我們再創(chuàng)建一個控制臺項目來進行服務(wù)發(fā)現(xiàn)。

創(chuàng)建完成項目后,也需要引用consul類庫,同服務(wù)端一樣在Nuget中搜索。

編寫代碼如下:

static void Main(string[] args){  var consulClient = new ConsulClient(x => x.Address = new Uri($"http://192.168.1.178:8500"));//請求注冊的 Consul 地址  var ret = consulClient.Agent.Services();     var allServer = ret.GetAwaiter().GetResult();  //這個是個dictionary的返回值,他的key是string類型,就是8500/ui上services的instance的id  var allServerDic = allServer.Response;  var test1 = allServerDic.First();  string name = test1.Value.Service;//服務(wù)名,就是注冊的那個test1  string serverAddress = test1.Value.Address;   int serverPort = test1.Value.Port;  Console.WriteLine($"serverAddress:{serverAddress}==serverPort{serverPort}");  //我們可以在客戶端啟動的時候,調(diào)用一下consul來查找服務(wù)  //比如,我們可以在服務(wù)集合里查找 服務(wù)名叫test1的服務(wù) 然后在調(diào)用它  //這樣,當(dāng)服務(wù)器改變了test1的ip和端口,我們依然可以在集群里找他test1新的ip和端口了  Console.ReadKey();}

運行結(jié)果如下:

可以看到,我們已經(jīng)成功調(diào)用了Consul,也成功的獲取到了服務(wù)信息。

其實Consul除了服務(wù)注冊與查詢,還可以進行Key-Value存儲,也就是說,這個是一個分布式Key-Value存儲集群。

看完上述內(nèi)容,你們掌握C#中怎么利用Consul集群實現(xiàn)服務(wù)注冊與發(fā)現(xiàn)的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!

當(dāng)前名稱:C#中怎么利用Consul集群實現(xiàn)服務(wù)注冊與發(fā)現(xiàn)
文章路徑:http://bm7419.com/article14/gijhge.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營銷型網(wǎng)站建設(shè)、搜索引擎優(yōu)化、關(guān)鍵詞優(yōu)化、手機網(wǎng)站建設(shè)網(wǎng)站排名、網(wǎng)頁設(shè)計公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作