註: Azure Application Gateway 與 ASP.NET Core HealthChecks 也能進行相依服務監控
下圖為一個簡單易範例,透過負載平衡 (Azure Load Balancer) 導向兩台虛擬機器 (Virtual Machine),而在虛擬機器上的網站相依於各自的服務:WebAPI、Redis 與 Database。
一般 負載平衡器 皆會監控虛擬機器狀況/網站營運狀況,但如果相依的其中一個服務壞了,有可能發生網站 偶爾成功/失敗 系統不穩定的情況發生,進而需要相關人員進場找問題。而負載平衡器仍把流量導入至有問題的站台,問題持續發生...
但使用 HealthChecks 監控相依性服務,只要發現相依的服務壞了,負載平衡收到 HealthChecks Response,即可即時接服務切到虛擬機器2。
HealthCheck 實作
因為這是系列文章,你可以在 如何為 ASP.NET Core 與相依服務建立執行狀態檢查 找到所有文章,也建議您從第一篇開始閱讀比較能銜接的上。完整範例程式 HealthCheckDemo。
因為 Azure Load Balancer/Azure Application Gateway 會透過設定健全狀態探查 (Health Probe) 設定監控網址與其狀態,所以我們需要更改 Health Check 設定,方便我們偵測服務狀態。
- 服務狀態為 Unhealthy 時,設定 HTTP Status Code 為 500 (Internal Server Error)
- 服務狀態為 Degraded 時,設定 HTTP Status Code 為 503 (Service Unavailable)
修改程式碼如下:
在 Startup.cs 內 Configure 方法內程式碼如下 (注意紅色框處):
系統架構範例
我們建立了 1 個 Azure Load Balancer、2 台 Windows 虛擬機器。每個虛擬機器上各有一個網站:Website1 與 Website2。並各自有相依的服務:WebAPI on App Service、Azure Cache for Redis 與 Azure SQL Database。
這次的實作情境為關掉 Website1 所相依的 App Service,HealthChecks 會顯示 WebAPI 停機,並且回傳 500 錯誤訊息。 Load balancer 會每 5 秒測試 Website1 健康狀態,2 次失敗將流量切到 Website 2。
下列圖片為在 Azure 環境中建立的 App Services 與 虛擬機器:
Azure Load Balancer 設定 - Standard (標準版)
在前端 IP 設定如下圖,我們能透過這個位置進入範例網站 (兩台虛擬機器上的 IIS)
新增兩個後端集區,分別是我們的兩台虛擬主機
新增健全狀態探查 (Health probe)
設定內容如下,特別注意通訊協定為 HTTP、連結埠與 路徑 /health
新增負載平衡規則
新增內容如下:
完成設定後,分別將網站佈署至 IIS, WebAPI 佈署至 App Service。開啟無痕視窗測試,可以看見 Load Balancer 將流量輪流轉向網站。
註:每次測試都需要完全關閉無痕視窗再開啟,或用不同瀏覽器
兩個網站目前運作狀態也正常
實際測試
我們關閉 WebSite1 相依的 WebAPI 服務
我們監控目前健全狀態,確認 Website 1出現問題...
無論我們怎麼重開瀏覽器,流量皆被導向 WebSite 2,即完成 相依服務監控 與 即時反應導流 的目的
0 留言