您好,登錄后才能下訂單哦!
C#中怎么利用Consul集群實現服務注冊與發現,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
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存儲集群。
看完上述內容,你們掌握C#中怎么利用Consul集群實現服務注冊與發現的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。