系統維運內對於網站狀態監控是不可或缺的,雖然建立了 heartbeat 與 status 提供監控系統做即時監控,但沒有及時的處置,仍會出現服務中斷的時期,進而可能損及企業利益 (如:影響交易)。本篇文章透過 Azure Load Balancer (負載平衡) 與 ASP.NET Core HealthChecks 建構相依服務監控與即時切換機制。本篇文章若有錯誤或任何建議,請各位先進不吝提出。


註: 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 設定,方便我們偵測服務狀態。
  1. 服務狀態為 Unhealthy 時,設定 HTTP Status Code 為 500 (Internal Server Error)
  2. 服務狀態為 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,即完成 相依服務監控即時反應導流 的目的