一、概念:什麼是consul:
Consul 是有多個元件組成的一個整體,作用和Eureka,Zookeeper相當,都是用來做服務的發現與治理。
Consul的特性:
1、 服務的發現:consul可以把注冊到其中的服務提供給使用者,也可以主動發現服務,在consul的用戶端界面中使用者可以得到,服務的資訊,比如IP端口等資訊,在用戶端界面中可以很容易的找到注冊的服務,
2、 健康檢查:這裡健康檢查就是檢查服務是否在良好的運作,這裡判斷服務是否運作良好,可以用Web服務的狀态進行判斷,也可以用伺服器的利用狀态進行判斷,可以根據這些狀态來判斷那些服務是良好運作的那些是不健康的()這裡不健康可以是伺服器的使用率)進而根據這些判斷路由遠離不健康的服務。
3、 KVStore:就是KEY/Value的存儲,在使用中可以根據KV的存儲功能做很多事情比如,動态的進行配置,進行一些特征的标記,協調,管理的選舉,KV存儲的API是基于HTTP的。
4、 多資料中心:consul支援多哦資料中心,意味着我們這是用consul的過程中不必擔心多做更多的工作來進行擴充。
Consul是一個分布式的高可用的系統。每一個向consul注冊的的服務,在服務無本身都會運作一個(agents)代理,運作代理的最終目的是為了對目前服務進行健康檢查,以便通知Consul系統,目前節點的健康與否,在consul的特性(健康檢查)我們已經舉過例子。
每個資料中心運作一個領事伺服器叢集。當提出跨資料中心服務發現或配置請求時,本地(agents)伺服器将請求轉發到遠端資料中心并傳回結果。
(白話)進行健康檢查就是為了決定能不能用這個節點服務,這個節點的服務是否是所有已知節點中性能最好的,不是最好的換一個就是了。在使用的過程中每一個伺服器運作時建議模拟出多個可以導緻服務失敗、資料丢失的場景,然後為每一個服務推薦用作安全的伺服器。在這個過程中有一個最大的功臣就是代理(agents),代理實作了和伺服器之間的交流。
了解更多:https://www.consul.io/intro/index.html
二、Consul的安裝:
1、 Consul的下載下傳:
位址: https://www.consul.io/
點選DOWNLOAO 進入下載下傳頁面如下:
我下載下傳的是win版本并且已解壓,大小非常的小
2、安裝運作:
安裝指令為:Consul.exe agent -dev 開發者模式安裝 Ctrl+ C 可以停止運作 如下圖:
開發者模式安裝隻适用于單個伺服器的環境,不用于生産,開發者模式不儲存任何的狀态。
安裝成功後,我們可以看到,輸出的日志資訊中包含了。Client addr: 用戶端位址為,127.0.0.1:8500,DNS為8600 我們可以在浏覽器中進行通路,
通路結果如下:
在頁面中我們可以看到我們的服務、 consul 在會預設把自己注冊成為一個服務節點,界面中向我們展示了自己的運作狀态,IP伺服器等資訊
我們還可以通過指令來進行檢視 服務的資訊
指令: consul members 下圖是輸出:
圖中向我們輸出了我們自己更加詳細的資訊,位址、狀态、角色、版本資訊
在後期我們使用的過程中我們會添加很多的服務,這個時候的輸出可能更多,因為服務的資訊是通過通訊協定擷取以及注冊的,為了避免consul視圖中的服務狀态,和伺服器上的狀态保持一緻,就需要通過HttpApi将服務的狀态發送給consul中的管理(agent) 結合上文中consul的特性3KVStore我們可以更好的了解。
官方翻譯
中斷代理之後,您應該看到它離開叢集并關閉。通過優雅地離開,領事通知其他叢集成員節點已離開。如果您強制終止代理程序,叢集的其他成員将檢測到節點失敗。當成員離開時,其服務和檢查将從目錄中删除。當一個成員失敗時,它的健康狀态被簡單地标記為關鍵,但它不會從目錄中删除。領事将自動嘗試重新連接配接到失敗的節點,允許它從某些網絡條件中恢複,而不再與左側節點聯系。此外,如果代理作為伺服器運作,那麼優雅的休假對于避免可能導緻影響協商一緻協定的可用性中斷非常重要。
三、Consul的簡單使用:
1、建立一個AspNetCoreAPI項目:
如下圖:
2、在項目中的Startup中Configure方法中實作注冊:
代碼如下:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseMvc();
String ip = Configuration["ip"];//部署到不同伺服器的時候不能寫成127.0.0.1或者0.0.0.0,因為這是讓服務消費者調用的位址
int port = int.Parse(Configuration["port"]);//擷取服務端口
var client = new ConsulClient(ConfigurationOverview); //回調擷取
var result = client.Agent.ServiceRegister(new AgentServiceRegistration()
{
ID = "ServerNameFirst" + Guid.NewGuid(),//服務編号保證不重複
Name = "ServerFirst",//服務的名稱
Address = ip,//服務ip位址
Port = port,//服務端口
Check = new AgentServiceCheck //健康檢查
{
DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5),//服務啟動多久後反注冊
Interval = TimeSpan.FromSeconds(10),//健康檢查時間間隔,或者稱為心跳間隔(定時檢查服務是否健康)
HTTP = $"http://{ip}:{port}/api/Health",//健康檢查位址
Timeout = TimeSpan.FromSeconds(5)//服務的注冊時間
}
});
}
View Code
/// <summary>
/// 擷取Consul的執行個體
/// </summary>
/// <param name="obj"></param>
private static void ConfigurationOverview(ConsulClientConfiguration obj)
{
//consul的位址
obj.Address = new Uri("http://127.0.0.1:8500");
//資料中心命名
obj.Datacenter = "dc1";
}
3、啟動:首先確定Consul已啟動,我們運作項目注冊
步驟如下:
編譯Api 成功後我們通過指令行的方式運作:
執行指令:dotnet 項目DLL --ip 設定ip -- port 設定端口(dotnet Framework.WebApi.dll --ip 127.0.0.1 --port 5001) 敲擊回車運作項目
同一個項目我們可以運作多個在指令運作時設定不同端口就可以運作了
重新整理consul用戶端我們可以看到我們的服務注冊成功了
結果如下:
文章參考:如鵬網楊中科老師的AspNetCore 微服務普及推廣内容:
有不足之處 希望大家指出互相學習
不要在自己迷茫的時候不學習