主頁 > .NET開發 > C#使用Consul集群進行服務注冊與發現

C#使用Consul集群進行服務注冊與發現

2020-09-21 10:11:31 .NET開發

前言

我個人覺得,中間件的部署與使用是非常難記憶的;也就是說,如果兩次使用中間件的時間間隔比較長,那基本上等于要重新學習使用,

所以,我覺得學習中間件的文章,越詳細越好;因為,這對作者而言也是一份珍貴的備忘資料,

Consul簡介

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

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

Consul是什么?

Consul本質上是一個Socket通信中間件,

它主要實作了兩個功能,服務注冊與發現與自身的負載均衡的集群,

我們可以把他理解為一個沒有界面的應用程式,因為沒有界面,所以想啟動Consul就只能使用命令列了;也因為沒有界面,一旦使用命令列啟動了Consul,那么,執行該命令列的cmd.exe程式,就成了Consul的宿主了;一旦關閉Cmd視窗,Consul就停止運行了,

服務注冊與發現的本質是什么?

其實服務注冊與發現的原理很簡單,

當我們在本機運行Consul時,他會自動監聽8500埠;然后我們通過一個開源類別庫(這個開源類別庫可以在nuget上檢索到,文章下面會介紹),呼叫其下不同的方法來向這個Consul行程發送TCP訊息,來注冊服務或者發現服務,

Consul行程在接收到注冊訊息時,就把注冊的服務資訊存盤到本地磁盤或記憶體(因為我沒有具體去調查Consul存盤資料是否使用了資料庫,但我們都知道資料庫的資料也是保存在本地磁盤的,所以,它肯定是把資料存進磁盤或者記憶體中了),

資料中心

Consul存盤資料的地方,官方為其命名為資料中心,也就是上面說的保存我們注冊的服務資訊的本地磁盤或者記憶體,

Consul提供負載均衡的集群

Consul的集群也很好理解,在我們成功啟動Consul以后,它除了監聽8500埠以外,它還監聽了一個8031埠,

這個8031埠就是用于Consul集群相互通信的,

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

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

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

選舉Leader自然就是服務器代理之間的通信了,也就是通過上面提到的8031埠通信的,

選舉了Leader,服務器代理就可以將自身的負載資訊發送給Leader了,這樣客戶端呼叫Consul檢索服務資料時,就可以去性能最優的那臺機器上獲取資訊了,(注:這個就是舉例說明,并非Consul的負載均衡的真實處理模式)

Consul代理服務器安裝

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

拉到網站的最下方,選擇Window64-bit的Consul下載,如下圖:

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

因為我們要使用命令列來運行consul,所以,我們將consul.exe所在的目錄添加進環境變數,這樣,當我們在CMD視窗中執行consul的相關命令時,系統就會自動將這個些命令發送給consul.exe檔案執行了,

配置環境變數如下圖所示:

 配置完環境變數,我們打開一個cmd的命令列視窗,然后輸入consul來確認我們的環境變數是否配置成功,如下圖:

看到圖中的資訊,就代表我們的consul的環境變數配置成功了,已經可以運行了,

接下來,我們在這個cmd表單中輸入consul的命令來啟動consul服務器代理,命令如下:

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命令大家是可以在網路上搜到它們的定義的,不過我覺得解釋的還是太官方,所以,我在這里提供了一份我認為更好的解釋,

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

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

-ui:consul運行后,會提供一個http://127.0.0.1:8500/ui/的網站,里面存盤了Consul Agent各個節點以及注冊的服務等相關資訊,即資料中心的網頁形式體現,這個引數代表是否創建這個網站,這個引數與這個資料中心網站有關,

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

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

data-dir:是存放資料中心資料的,該目錄必須是穩定的,系統重啟后也繼續存在的,

datacenter:當前agent的中心資料的名稱,默認是dc1,

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

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

----------------------------------------------------------------------------------------------------

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

可以看到,我們的Consul代理服務已經成功運行了,

現在,我們在去另一臺電腦,打開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;通過這個命令,我們把這臺電腦的代理服務器成功的加入到了上文中的consul集群,

服務注冊與發現

Consul的服務注冊

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

創建WebAPI后,我們在Nuget中查找Consul的Net版本類別庫,

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

然后,我們在Startup檔案中,增加一個函式,如下:

public static void RegisterConsul()
{
    var consulClient = new ConsulClient(p => { p.Address = new Uri($"http://127.0.0.1:8500"); });//請求注冊的 Consul 地址
    //這里的這個ip 就是本機的ip,這個埠8500 這個是默認注冊服務埠 
    var httpCheck = new AgentServiceCheck()
    {
        DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5),//服務啟動多久后注冊
        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();//注冊服務 

    //consulClient.Agent.ServiceDeregister(registration.ID).Wait();//registration.ID是guid
    //當服務停止時需要取消服務注冊,不然,下次啟動服務時,會再注冊一個服務,
    //但是,如果該服務長期不啟動,那consul會自動洗掉這個服務,大約2,3分鐘就會刪了 

}

然后在Configure中呼叫這個方法,這樣,當我們除錯或運行這個專案時,就會自動將這個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();//注冊本服務到consul集群
  
}

服務注冊完后,可以訪問本地資料中心的網站【http://127.0.0.1:8500/ui/dc1/services】來查看注冊服務的狀態,

Consul服務發現

服務注冊完成后,我們再創建一個控制臺專案來進行服務發現,

創建完成專案后,也需要參考consul類別庫,同服務端一樣在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;//服務名,就是注冊的那個test1
    string serverAddress = test1.Value.Address; 
    int serverPort = test1.Value.Port;
    Console.WriteLine($"serverAddress:{serverAddress}==serverPort{serverPort}");
    //我們可以在客戶端啟動的時候,呼叫一下consul來查找服務
    //比如,我們可以在服務集合里查找 服務名叫test1的服務 然后在呼叫它
    //這樣,當服務器改變了test1的ip和埠,我們依然可以在集群里找他test1新的ip和埠了
    Console.ReadKey();
}

運行結果如下:

可以看到,我們已經成功呼叫了Consul,也成功的獲取到了服務資訊, 

----------------------------------------------------------------------------------------------------

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

Key-Value存盤的用法在Github已經有例子了,網址:https://github.com/PlayFab/consuldotnet,

----------------------------------------------------------------------------------------------------

C#使用Consul進行服務注冊與發現就講完了,

代碼已經傳到Github上了,歡迎大家下載,

Github地址:https://github.com/kiba518/KibaConsul

----------------------------------------------------------------------------------------------------

注:此文章為原創,任何形式的轉載都請聯系作者獲得授權并注明出處!
若您覺得這篇文章還不錯,請點擊下方的推薦】,非常感謝!

https://www.cnblogs.com/kiba/p/11703073.html

 

 

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/96191.html

標籤:C#

上一篇:輸出詢問“你要我請你吃飯嗎?”,選擇“好的/不需要?(y/n):”,如果輸入為y則列印“我們一起去吃飯”,若輸出為n,則繼續詢問。

下一篇:請問Gridcontrol系結的資料源是datatable 然后想讓某個單元格中的內容能夠換行怎么設定呢

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • C#多執行緒學習(二) 如何操縱一個執行緒

    <a href="https://www.cnblogs.com/x-zhi/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2943582/20220801082530.png" alt="" /></...

    uj5u.com 2023-04-19 09:17:20 more
  • C#多執行緒學習(二) 如何操縱一個執行緒

    C#多執行緒學習(二) 如何操縱一個執行緒 執行緒學習第一篇:C#多執行緒學習(一) 多執行緒的相關概念 下面我們就動手來創建一個執行緒,使用Thread類創建執行緒時,只需提供執行緒入口即可。(執行緒入口使程式知道該讓這個執行緒干什么事) 在C#中,執行緒入口是通過ThreadStart代理(delegate)來提供的 ......

    uj5u.com 2023-04-19 09:16:49 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    <a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...

    uj5u.com 2023-04-18 08:39:04 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    一:背景 1. 講故事 前段時間協助訓練營里的一位朋友分析了一個程式卡死的問題,回過頭來看這個案例比較經典,這篇稍微整理一下供后來者少踩坑吧。 二:WinDbg 分析 1. 為什么會卡死 因為是表單程式,理所當然就是看主執行緒此時正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ......

    uj5u.com 2023-04-18 08:33:10 more
  • SignalR, No Connection with that ID,IIS

    <a href="https://www.cnblogs.com/smartstar/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u36196.jpg" alt="" /></a>...

    uj5u.com 2023-03-30 17:21:52 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:15:33 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:13:31 more
  • C#遍歷指定檔案夾中所有檔案的3種方法

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-03-27 14:46:55 more
  • C#/VB.NET:如何將PDF轉為PDF/A

    <a href="https://www.cnblogs.com/Carina-baby/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2859233/20220427162558.png" alt="" />...

    uj5u.com 2023-03-27 14:46:35 more
  • 武裝你的WEBAPI-OData聚合查詢

    <a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...

    uj5u.com 2023-03-27 14:46:16 more