.Net Core微服務——自動收縮、健康檢查:Consul(三)

Max 發表於 2021-07-26
微服務 .Net

繼續上一篇的話題,順便放上一篇的傳送門:點這裡

健康檢查

經過之前的操作,我的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搞起來:

.Net Core微服務——自動收縮、健康檢查:Consul(三)

 進去訪問下:

.Net Core微服務——自動收縮、健康檢查:Consul(三)

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

.Net Core微服務——自動收縮、健康檢查:Consul(三)

 看下consul控制檯:

.Net Core微服務——自動收縮、健康檢查:Consul(三)

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

.Net Core微服務——自動收縮、健康檢查:Consul(三)

 5051狀態自動更新成failing,而且沒過一會兒,它就會自動移除。5050這時候去再去訪問,就訪問不到5051了:

.Net Core微服務——自動收縮、健康檢查:Consul(三) 

 再然後偷偷把5051跑起來,重新呼叫:

.Net Core微服務——自動收縮、健康檢查:Consul(三)

 又可以訪問了不是?

新例項啟動自動發現,例項狀態異常自動剔除,下端呼叫無需任何調整,舒坦。起碼我這個懶人覺得很舒服。

tips:新的服務預設狀態是failing,註冊成功後會馬上發起一次檢查,成功後才會變更狀態。而且服務登出沒有那麼快,耗時一般都會比設定的時間長。

最後一點

關於consul寫了3篇了,要是都看完,想在專案裡用起來是沒問題的,不過要上生產環境仍然有個隱患:單點故障。你想啊,consul這麼能幹,萬一它掛了可咋整。。。。所以叢集是必要的,而且叢集之後的服務註冊、呼叫自然就不能和單體一樣。這問題三言兩語還說不清,後面再寫吧。