註: 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)
修改程式碼如下:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
app.UseEndpoints(endpoints => | |
{ | |
endpoints.MapControllers(); | |
endpoints.MapHealthChecks("/health", new HealthCheckOptions() | |
{ | |
ResultStatusCodes = | |
{ | |
[HealthStatus.Healthy] = StatusCodes.Status200OK, | |
[HealthStatus.Unhealthy] = StatusCodes.Status503ServiceUnavailable, | |
[HealthStatus.Degraded] = StatusCodes.Status500InternalServerError, | |
}, | |
ResponseWriter = CreateHealthCheckResponse | |
}); | |
}); |
在 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 留言