前言html
我我的以爲,中間件的部署與使用是很是難記憶的;也就是說,若是兩次使用中間件的時間間隔比較長,那基本上等於要從新學習使用。node
因此,我以爲學習中間件的文章,越詳細越好;由於,這對做者而言也是一份珍貴的備忘資料。git
Consul簡介github
Consul一個什麼,我想你們經過搜索引擎必定能夠搜索到;因此,我就不在重複他的官方描述了。數據庫
這裏,我爲你們提供一個更加好理解的描述。bootstrap
Consul是什麼?windows
Consul本質上是一個Socket通訊中間件。api
它主要實現了兩個功能,服務註冊與發現與自身的負載均衡的集羣。服務器
咱們能夠把他理解爲一個沒有界面的應用程序,由於沒有界面,因此想啓動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
----------------------------------------------------------------------------------------------------
注:此文章爲原創,任何形式的轉載都請聯繫做者得到受權並註明出處!
若您以爲這篇文章還不錯,請點擊下方的【推薦】,很是感謝!
http://www.javashuo.com/article/p-yiyczbzz-bc.html