繼續上一篇的話題,順便放上一篇的傳送門:點這里,
健康檢查
經過之前的操作,我的consul已經支持自動擴展,并且呼叫也很靠譜,但是這里有個問題,一旦服務串列里的某個服務掛了,consul并不知道,還是會把實際無效的地址回傳給我,就算重啟consul容器也無法重繪到最新的狀態,所以,咱們要監控服務可用性,主動區分出不可用服務,這種手段,就稱之為健康檢查,
進入編碼環節,老規矩,還是進入到之前我封裝好的注冊方法,在注冊時增加健康檢查的內容:
client.Agent.ServiceRegister(new AgentServiceRegistration()
{
ID = $"server {ip}:{port}",
Name = "shenzhen-ma",
Address = ip,
Port = int.Parse(port),
Tags = new string[] { weight },
Check = new AgentServiceCheck()
{
Interval = TimeSpan.FromSeconds(10),//每隔10秒發起檢查
HTTP = $"http://{ip}:{port}/v1/client/base/index",//檢查請求地址
Timeout = TimeSpan.FromSeconds(5),//超時時長5秒
DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(10)//超過10秒還沒能連接到服務,就開始注銷本服務
}
});
變色部分就是健康檢查的配置了,根據上面的配置,consul會周期性發起健康檢查,并且根據結果自動移除不可用的服務,
這次我要嚴謹一些,用真實的遠程服務器來模擬生產環境,手頭服務器太多,很多有專案在跑,仔細翻了翻,發現還有兩臺相對空閑的服務器,一臺是win server,另一臺centos,嘿嘿,正好,centos做consul服務器,win服務器用來做下游呼叫方,
先把consul搞起來:

進去訪問下:

OK了,現在轉到另一臺服務器跑幾個客戶端,這里偷個懶,直接把可運行檔案拷貝過去,哈哈:

看下consul控制臺:

還是熟悉的shenzhen-ma,兩個服務已經穩穩的待在分組串列里了,注意我框起來的位置,它表示服務已經通過了健康檢查,這時候我把5051這個程式關掉,再來看看:

5051狀態自動更新成failing,而且沒過一會兒,它就會自動移除,5050這時候去再去訪問,就訪問不到5051了:
再然后偷偷把5051跑起來,重新呼叫:

又可以訪問了不是?
新實體啟動自動發現,實體狀態例外自動剔除,下端呼叫無需任何調整,舒坦,起碼我這個懶人覺得很舒服,
tips:新的服務默認狀態是failing,注冊成功后會馬上發起一次檢查,成功后才會變更狀態,而且服務注銷沒有那么快,耗時一般都會比設定的時間長,
最后一點
關于consul寫了3篇了,要是都看完,想在專案里用起來是沒問題的,不過要上生產環境仍然有個隱患:單點故障,你想啊,consul這么能干,萬一它掛了可咋整,,,,所以集群是必要的,而且集群之后的服務注冊、呼叫自然就不能和單體一樣,這問題三言兩語還說不清,后面再寫吧,
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/290204.html
標籤:.NET Core
