添加健康檢查 - 在C#課程中構建一個示例API
在 C# 中使用 ASP.NET Core 開發和測試 RESTful API 是現代後端開發者的實用技能。 在他的教程視頻中,Adding Health Checks - Building a Sample API in C# Course,Tim Corey 講解了如何構建具有健康檢查功能的樣本 API。 這篇文章完全基於 Tim 的文字記錄,逐步解釋了整個過程,涵蓋了使用公共異步任務、int id、var app 以及其他 HTTP 請求方法等關鍵點。
讓我們深入了解 Tim Corey 如何在 Visual Studio Code 中設置健康檢查 C# API 專案。
介紹樣本 API 和健康檢查
Tim 解釋說,樣本 API 是學習網頁開發時的強大工具。 它允許開發者使用 GET、POST、PUT 和 DELETE 方法模擬 API 呼叫,並使用適當的請求數據和狀態碼。 Tim 構建的 API 支援:
-
具有數據模型的樣本數據
-
API 請求的 RESTful 行為
-
JSON 格式的回應
-
健康檢查
- 可以作為 Docker 容器和網頁應用程式部署
安裝健康檢查套件
Tim 在 Visual Studio Code 中開啟專案,右鍵點擊 Dependencies 以管理 NuGet 套件。 他搜索並安裝了 AspNetCore.HealthChecks.UI.Client 包。 這使應用程序能夠支援兩種類型的健康檢查。
建立健康檢查類別
Tim 在 API 專案文件夾內新增了一個名為 HealthChecks 的新文件夾。 在這裡,他創建了多個實現 IHealthCheck 介面的類,每個類代表不同的狀態:健康、降級、不健康和隨機。
HealthyHealthCheck.cs
此類使用公共異步 Task
return Task.FromResult(HealthCheckResult.Healthy("This is a test healthy service."));
return Task.FromResult(HealthCheckResult.Healthy("This is a test healthy service."));
這模擬了一個健康狀態,有助於測試前端如何處理穩定的服務。
DegradedHealthCheck.cs
return Task.FromResult(HealthCheckResult.Degraded("This is a test degraded service."));
return Task.FromResult(HealthCheckResult.Degraded("This is a test degraded service."));
這個檢查返回一個降級的服務響應。 這是一個模擬部分失敗或性能問題的簡單方法。
UnhealthyHealthCheck.cs
return Task.FromResult(HealthCheckResult.Unhealthy("This is a test unhealthy service."));
return Task.FromResult(HealthCheckResult.Unhealthy("This is a test unhealthy service."));
這模仿了一個失敗的服務,模擬您期望出現 500 HTTP 狀態碼或返回 NotFound() 的情況。
RandomHealthCheck.cs
此健康檢查使用隨機整數模擬三種狀況之一:
int randomResult = Random.Shared.Next(1, 4);
return randomResult switch
{
1 => Task.FromResult(HealthCheckResult.Healthy("This is a test random service.")),
2 => Task.FromResult(HealthCheckResult.Degraded("This is a test random service.")),
3 => Task.FromResult(HealthCheckResult.Unhealthy("This is a test random service.")),
_ => Task.FromResult(HealthCheckResult.Healthy("This is a test random service."))
};
int randomResult = Random.Shared.Next(1, 4);
return randomResult switch
{
1 => Task.FromResult(HealthCheckResult.Healthy("This is a test random service.")),
2 => Task.FromResult(HealthCheckResult.Degraded("This is a test random service.")),
3 => Task.FromResult(HealthCheckResult.Unhealthy("This is a test random service.")),
_ => Task.FromResult(HealthCheckResult.Healthy("This is a test random service."))
};
Tim 強調這對於測試變化條件下的行為非常有用。
在啟動配置中註冊健康檢查
Tim 在 Startup 或配置文件夾中新增了一個新的靜態類 HealthChecksConfig.cs。 此類包含兩個靜態方法:
AddAllHealthChecks()
services.AddHealthChecks()
.AddCheck<RandomHealthCheck>("random", tags: new[] { "random" })
.AddCheck<HealthyHealthCheck>("healthy", tags: new[] { "healthy" })
.AddCheck<DegradedHealthCheck>("degraded", tags: new[] { "degraded" })
.AddCheck<UnhealthyHealthCheck>("unhealthy", tags: new[] { "unhealthy" });
services.AddHealthChecks()
.AddCheck<RandomHealthCheck>("random", tags: new[] { "random" })
.AddCheck<HealthyHealthCheck>("healthy", tags: new[] { "healthy" })
.AddCheck<DegradedHealthCheck>("degraded", tags: new[] { "degraded" })
.AddCheck<UnhealthyHealthCheck>("unhealthy", tags: new[] { "unhealthy" });
這為 ASP.NET Core 的服務容器中的依賴注入註冊所有的健康檢查。
MapAllHealthChecks()
app.MapHealthChecks("/health");
app.MapHealthChecks("/health");
這創建了一個單一的端點 /health,將所有服務一起評估。 如果有任何一個不健康,整個檢查返回不健康。
建立特定的健康端點
為了測試個別組件,Tim 按照標籤映射每個健康檢查:
app.MapHealthChecks("/health/healthy", new HealthCheckOptions {
Predicate = x => x.Tags.Contains("healthy")
});
app.MapHealthChecks("/health/healthy", new HealthCheckOptions {
Predicate = x => x.Tags.Contains("healthy")
});
他對 /health/degraded、/health/unhealthy 和 /health/random 重複此操作。 每個都允許開發人員測試特定行為以及他們的前端對其的反應。
當訪問 /health/random 時,輸出會根據隨機結果在"健康"、"降級"和"不健康"之間變化。
為健康檢查添加 UI 支援
Tim 透過啟用每個健康檢查路由的 UI 回應來加強端點。 這提供了一個 JSON 輸出:
app.MapHealthChecks("/healthui", new HealthCheckOptions
{
ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse
});
app.MapHealthChecks("/healthui", new HealthCheckOptions
{
ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse
});
這允許檢查每個健康檢查,數據包括持續時間、標籤和狀態。 接下來,Tim 為每個健康端點建立了 UI 版本:
-
/healthui/healthy
-
/healthui/degraded
-
/healthui/unhealthy
- /healthui/random
每個皆回應詳細的 JSON 格式,對於 RESTful API 和從移動設備或網頁測試非常理想。
包裝 API 專案
Tim 指出,即便有這些功能,Program.cs 仍然只有21行。 他將其歸功於:
-
優秀的專案文件夾結構
-
將模型保持在 Models 文件夾中
-
將端點和控制器放在各自的文件夾中
- 使用異步 Task 方法為每個健康檢查類別
他也強調這個樣本 API 在生產環境中,對於在部署前模擬延遲或故障是多麼有用。
"我們可以用此 API 做更多的測試,不僅僅是對它進行 GET 呼叫,"Tim 總結說。
接下來會發生什麼
Tim 預告了下一課,他將添加模擬的減速(例如 5 秒延遲)和錯誤,例如返回 NotFound() 或返回 BadRequest(),以進一步測試 API 行為。
結論
在這個 視頻教程中,Tim Corey 條理分明地介紹了使用 ASP.NET Core 構建帶有集成健康檢查的最小 API。 關鍵組件包括:
-
健康檢查類(Healthy、Degraded、Unhealthy、Random)
-
通過 AddHealthChecks() 進行依賴注入
-
使用 MapHealthChecks() 映射端點
- 支援結構化的 JSON 回應
這種方法使驗證 REST API、模擬故障以及加強網頁應用程式對於開發和生產環境都變得更容易。
