.NET .NET Aspire 中的健康檢查
健康情況檢查提供應用程式的可用性和狀態資訊。 健康檢查通常會暴露為 HTTP 端點,但也可以由應用程式在內部使用,根據目前的健康狀態寫入記錄或執行其他工作。 健康情況檢查通常與外部監視服務或容器協調器搭配使用,以檢查應用程式的狀態。 健康情況檢查所報告的數據可用於各種案例:
- 影響容器協調器、負載平衡器、API 閘道和其他管理服務所做的決策。 例如,如果容器化應用程式的健康檢查失敗,負載平衡器在路由流量時可能會略過該應用程式。
- 確認基礎相依性可供使用,例如資料庫或快取,並傳回適當的狀態消息。
- 當應用程式未如預期回應時觸發警示或通知。
.NET .NET Aspire 健康檢查端點
當從 Program.cs 檔案呼叫 AddServiceDefaults
和 MapDefaultEndpoints
方法時,.NET.NET Aspire 會在 開發 環境中公開兩個預設健康情況檢查 HTTP 端點:
/health
端點指出應用程式是否正常執行,而應用程式已準備好接收要求。 所有健康檢查必須通過,應用程式才會在啟動後被視為準備接受流量。GET /health
當應用程式 健康時,
/health
端點會傳回 HTTP 狀態代碼 200 和text/plain
值 Healthy。/alive
指出應用程式是否正在執行或已當機,且必須重新啟動。 只有貼有即時標籤的健康檢查必須通過,應用程式才能被視為運作中。GET /alive
當應用程式 運作時,
/alive
端點會傳回 HTTP 狀態代碼 200 和text/plain
值Healthy。
除了健康情況檢查之外,AddServiceDefaults
和 MapDefaultEndpoints
方法也會將各種設定套用至您的應用程式,例如 OpenTelemetry 和 服務探索 組態。
非開發環境
在非開發環境中,預設會停用 /health
和 /alive
端點。 如果您需要啟用它們,建議使用各種路由功能來保護這些端點,例如主機篩選和/或授權。 如需詳細資訊,請參閱 ASP.NET Core中的健康情況檢查。
此外,為這些端點設定請求逾時和輸出快取可能會帶來好處,這可以防止濫用或拒絕服務攻擊。 若要這樣做,請考慮下列已修改的 AddDefaultHealthChecks
方法:
public static IHostApplicationBuilder AddDefaultHealthChecks(this IHostApplicationBuilder builder)
{
builder.Services.AddRequestTimeouts(
configure: static timeouts =>
timeouts.AddPolicy("HealthChecks", TimeSpan.FromSeconds(5)));
builder.Services.AddOutputCache(
configureOptions: static caching =>
caching.AddPolicy("HealthChecks",
build: static policy => policy.Expire(TimeSpan.FromSeconds(10))));
builder.Services.AddHealthChecks()
// Add a default liveness check to ensure app is responsive
.AddCheck("self", () => HealthCheckResult.Healthy(), ["live"]);
return builder;
}
上述程式代碼:
- 將健康檢查請求的逾時設定為5秒,並使用名為
HealthChecks
的原則。 - 使用名為
HealthChecks
的原則,將健康檢查回應加入 10 秒的快取。
現在,請考慮更新的 MapDefaultEndpoints
方法:
public static WebApplication MapDefaultEndpoints(this WebApplication app)
{
var healthChecks = app.MapGroup("");
healthChecks
.CacheOutput("HealthChecks")
.WithRequestTimeout("HealthChecks");
// All health checks must pass for app to be
// considered ready to accept traffic after starting
healthChecks.MapHealthChecks("/health");
// Only health checks tagged with the "live" tag
// must pass for app to be considered alive
healthChecks.MapHealthChecks("/alive", new()
{
Predicate = static r => r.Tags.Contains("live")
});
return app;
}
上述程式代碼:
- 將健康情況檢查端點分組在
/
路徑下。 - 快取輸出,並使用對應的
HealthChecks
原則指定要求時間。
除了更新的 AddDefaultHealthChecks
和 MapDefaultEndpoints
方法之外,您還必須為請求逾時和輸出快取添加相應的服務。
在合適的使用應用程式進入點(通常是 Program.cs 檔案)中,新增以下程式碼:
// Wherever your services are being registered.
// Before the call to Build().
builder.Services.AddRequestTimeouts();
builder.Services.AddOutputCache();
var app = builder.Build();
// Wherever your app has been built, before the call to Run().
app.UseRequestTimeouts();
app.UseOutputCache();
app.Run();
如需詳細資訊,請參閱
整合健康檢測
.NET
.NET Aspire 整合可以為您的應用程式註冊額外的健康檢查。 這些健康狀態檢查有助於 /health
和 /alive
端點的傳回狀態。 例如,.NET AspirePostgreSQL 整合會自動新增健康情況檢查,以確認下列條件:
- 可以建立資料庫連線
- 可以成功執行資料庫查詢
如果其中一項作業失敗,對應的健康情況檢查也會失敗。
設定健康檢查
您可以使用其中一個可用的組態選項來停用特定整合的健康檢查。 .NET .NET Aspire 整合支援 Microsoft.Extensions.Configurations,以透過組態檔(如 appsettings.json)來套用設定:
{
"Aspire": {
"Npgsql": {
"DisableHealthChecks": true,
}
}
}
您也可以使用內嵌委派來設定健康檢查。
builder.AddNpgsqlDbContext<MyDbContext>(
"postgresdb",
static settings => settings.DisableHealthChecks = true);
另請參閱
- .NET 在 C# 中應用程式健康情況檢查
中的 健康情況檢查