ASP.NET Core 中的 gRPC 健康情況檢查
注意
這不是這篇文章的最新版本。 如需目前的版本,請參閱 本文的 .NET 9 版本。
警告
不再支援此版本的 ASP.NET Core。 如需詳細資訊,請參閱 .NET 和 .NET Core 支持原則。 如需目前的版本,請參閱 本文的 .NET 9 版本。
gRPC 健康情況檢查通訊協定是報告 gRPC 伺服器應用程式健康情況的標準。
健康情況檢查是由應用程式做為 gRPC 服務對外公開。 它們通常與外部監視服務搭配使用,以檢查應用程式的狀態。 該服務可以針對各種即時監視案例進行設定:
- 容器協調器和負載平衡器可以使用健康狀態探查,來檢查應用程式的狀態。 例如,Kubernetes 可支援 gRPC 活躍度、整備度和啟動探查。 而你可將 Kubernetes 設定為根據 gRPC 健康情況檢查結果來重新路由傳送流量或重新啟動狀況不良的容器。
- 您可以監控所使用記憶體、磁碟及其他實體伺服器資源的健康狀態。
- 健康狀態檢查可以測試應用程式的相依性 (例如資料庫和外部服務端點),確認其是否可用且正常運作。
設定 gRPC 健康情況檢查
gRPC ASP.NET Core 具備 Grpc.AspNetCore.HealthChecks
套件,內建支援 gRPC 健康情況檢查。 來自 .NET 健康情況檢查的結果會回報給呼叫端。
若要在應用程式中設定 gRPC 健康情況檢查:
- 新增
Grpc.AspNetCore.HealthChecks
套件參考。 - 註冊 gRPC 健康情況檢查服務:
AddGrpcHealthChecks
代表註冊啟用健康情況檢查的服務。MapGrpcHealthChecksService
代表新增健康情況檢查服務端點。
- 藉由實作 IHealthCheck 或使用 AddCheck 方法來新增健康情況檢查。
using GrpcServiceHC.Services;
using Microsoft.Extensions.Diagnostics.HealthChecks;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddGrpc();
builder.Services.AddGrpcHealthChecks()
.AddCheck("Sample", () => HealthCheckResult.Healthy());
var app = builder.Build();
app.MapGrpcService<GreeterService>();
app.MapGrpcHealthChecksService();
// Code removed for brevity.
設定好健康情況檢查後:
- 即會將健康情況檢查服務新增至伺服器應用程式。
- 定期執行在應用程式中註冊的 .NET 健康情況檢查以獲得健康情況結果。 根據預設,應用程式啟動後會有 5 秒的延遲,然後每隔 30 秒執行健康情況檢查一次。 健康情況檢查的執行間隔可以透過
HealthCheckPublisherOptions
進行自訂。 - 健康情況結果會決定 gRPC 服務報告的內容:
- 如果沒有健康情況結果,會報告
Unknown
。 - 當有 HealthStatus.Unhealthy 的任何健康情況結果時,則報告
NotServing
。 - 否則,報告
Serving
。
- 如果沒有健康情況結果,會報告
健康情況檢查服務安全性
gRPC 健康情況檢查會傳回應用程式的健全狀態,這可能是敏感性資訊。 請務必小心限制 gRPC 健康情況檢查服務的存取權。
您可以透過標準 ASP.NET 核心授權延伸模組方法來控制服務的存取,例如 AllowAnonymous
和 RequireAuthorization
。
例如,如果應用程式預設已設定為需要授權,請使用 AllowAnonymous
設定 gRPC 健康情況檢查端點,以略過驗證和授權。
app.MapGrpcHealthChecksService().AllowAnonymous();
設定 Grpc.AspNetCore.HealthChecks
根據預設,gRPC 健康情況檢查服務會使用所有已註冊的健康情況檢查來判斷健康狀態。 當註冊使用健康情況檢查的子集時,可以自訂 gRPC 健康情況檢查。 MapService
方法用於將健康情況結果對應到服務名稱,並附帶一個用於篩選健康情況結果的述詞:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddGrpc();
builder.Services.AddGrpcHealthChecks(o =>
{
o.Services.MapService("", r => r.Tags.Contains("public"));
});
var app = builder.Build();
上述程式碼會覆寫預設服務 (""
),僅使用帶有 "public" 標記的健康情況結果。
gRPC 健康情況檢查支援用戶端在檢查健康情況時指定服務名稱引數。 藉由提供服務名稱給 MapService
即可支援多個服務:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddGrpc();
builder.Services.AddGrpcHealthChecks(o =>
{
o.Services.MapService("greet.Greeter", r => r.Tags.Contains("greeter"));
o.Services.MapService("count.Counter", r => r.Tags.Contains("counter"));
});
var app = builder.Build();
用戶端指定的服務名稱通常是預設值 (""
) 或者是您應用程式中某個服務的套件限定名稱。 不過,這都無礙於用戶端使用任意值來檢查應用程式的健康情況。
設定健康情況檢查的執行間隔
呼叫 Check
時,會立即執行健康情況檢查。 Watch
是一種串流方法,其行為與 Check
不同:長時間執行的資料流會定期執行 IHealthCheckPublisher 來收集健康情況結果,隨時間的推移報告健康情況檢查結果。 根據預設,發行者會:
- 在應用程式啟動後等候 5 秒,再執行健康情況檢查。
- 每隔 30 秒執行健康情況檢查一次。
您可以在啟動時使用 HealthCheckPublisherOptions 來設定發行者間隔:
builder.Services.Configure<HealthCheckPublisherOptions>(options =>
{
options.Delay = TimeSpan.Zero;
options.Period = TimeSpan.FromSeconds(10);
});
呼叫 gRPC 健康情況檢查服務
Grpc.HealthCheck
套件包含用於 gRPC 健康情況檢查的用戶端:
var channel = GrpcChannel.ForAddress("https://localhost:5001");
var client = new Health.HealthClient(channel);
var response = await client.CheckAsync(new HealthCheckRequest());
var status = response.Status;
Health
服務上有兩種方法:
Check
是一元方法,可取得目前的健康狀態。 呼叫Check
時,會立即執行健康情況檢查。 如果用戶端要求未知的服務名稱,伺服器會傳回NOT_FOUND
錯誤回應。 如果尚未發佈健康情況結果,當應用程式啟動時就會發生此情況。Watch
是一種串流方法,可報告一段時間的健全狀態變化。 IHealthCheckPublisher 會定期執行以收集健康情況結果。 如果用戶端要求未知的服務名稱,伺服器會傳回Unknown
狀態。
Grpc.HealthCheck
用戶端可用於用戶端處理站方法:
builder.Services
.AddGrpcClient<Health.HealthClient>(o =>
{
o.Address = new Uri("https://localhost:5001");
});
在上述範例中,Health.HealthClient
執行個體的用戶端處理站會向相依性插入系統註冊。 然後,這些執行個體會插入服務中,以執行健康情況檢查呼叫。
如需詳細資訊,請參閱 .NET 中的 gRPC 用戶端 Factory 整合。
其他資源
gRPC 健康情況檢查通訊協定是報告 gRPC 伺服器應用程式健康情況的標準。
健康情況檢查是由應用程式做為 gRPC 服務對外公開。 這些通常與外部監視服務搭配使用,以檢查應用程式的狀態。 該服務可以針對各種即時監視案例進行設定:
- 容器協調器和負載平衡器可以使用健康狀態探查,來檢查應用程式的狀態。 例如,Kubernetes 可支援 gRPC 活躍度、整備度和啟動探查。 而你可將 Kubernetes 設定為根據 gRPC 健康情況檢查結果來重新路由傳送流量或重新啟動狀況不良的容器。
- 您可以監控所使用記憶體、磁碟及其他實體伺服器資源的健康狀態。
- 健康狀態檢查可以測試應用程式的相依性 (例如資料庫和外部服務端點),確認其是否可用且正常運作。
設定 gRPC 健康情況檢查
gRPC ASP.NET Core 具備 Grpc.AspNetCore.HealthChecks
套件,內建支援 gRPC 健康情況檢查。 來自 .NET 健康情況檢查的結果會回報給呼叫端。
若要在應用程式中設定 gRPC 健康情況檢查:
- 新增
Grpc.AspNetCore.HealthChecks
套件參考。 - 在
Startup.cs
中註冊 gRPC 健康情況檢查服務:AddGrpcHealthChecks
代表註冊啟用健康情況檢查的服務。MapGrpcHealthChecksService
代表新增健康情況檢查服務端點。
- 藉由實作 IHealthCheck 或使用 AddCheck 方法來新增健康情況檢查。
public void ConfigureServices(IServiceCollection services)
{
services.AddGrpc();
services
.AddGrpcHealthChecks()
.AddCheck("Sample", () => HealthCheckResult.Healthy());
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapGrpcService<GreeterService>();
endpoints.MapGrpcHealthChecksService();
});
}
設定好健康情況檢查後:
- 即會將健康情況檢查服務新增至伺服器應用程式。
- 定期執行在應用程式中註冊的 .NET 健康情況檢查以獲得健康情況結果。 根據預設,應用程式啟動後會有 5 秒的延遲,然後每隔 30 秒執行健康情況檢查一次。 健康情況檢查的執行間隔可以透過
HealthCheckPublisherOptions
進行自訂。 - 健康情況結果會決定 gRPC 服務報告的內容:
- 如果沒有健康情況結果,會報告
Unknown
。 - 當有 HealthStatus.Unhealthy 的任何健康情況結果時,則報告
NotServing
。 - 否則,報告
Serving
。
- 如果沒有健康情況結果,會報告
設定 Grpc.AspNetCore.HealthChecks
根據預設,gRPC 健康情況檢查服務會使用所有已註冊的健康情況檢查來判斷健康狀態。 當註冊使用健康情況檢查的子集時,可以自訂 gRPC 健康情況檢查。 MapService
方法用於將健康情況結果對應到服務名稱,並附帶一個用於篩選健康情況結果的述詞:
services.AddGrpcHealthChecks(o =>
{
o.Services.MapService("", r => r.Tags.Contains("public"));
});
上述程式碼會覆寫預設服務 (""
),僅使用帶有 "public" 標記的健康情況結果。
gRPC 健康情況檢查支援用戶端在檢查健康情況時指定服務名稱引數。 藉由提供服務名稱給 MapService
即可支援多個服務:
services.AddGrpcHealthChecks(o =>
{
o.Services.MapService("greet.Greeter", r => r.Tags.Contains("greeter"));
o.Services.MapService("count.Counter", r => r.Tags.Contains("counter"));
});
用戶端指定的服務名稱通常是預設值 (""
) 或者是您應用程式中某個服務的套件限定名稱。 不過,這都無礙於用戶端使用任意值來檢查應用程式的健康情況。
設定健康情況檢查的執行間隔
呼叫 Check
時,會立即執行健康情況檢查。 Watch
是一種串流方法,其行為與 Check
不同:長時間執行的資料流會定期執行 IHealthCheckPublisher 來收集健康情況結果,隨時間的推移報告健康情況檢查結果。 根據預設,發行者會:
- 在應用程式啟動後等候 5 秒,再執行健康情況檢查。
- 每隔 30 秒執行健康情況檢查一次。
您可以在啟動時使用 HealthCheckPublisherOptions 來設定發行者間隔:
services.Configure<HealthCheckPublisherOptions>(options =>
{
options.Delay = TimeSpan.Zero;
options.Period = TimeSpan.FromSeconds(10);
});
呼叫 gRPC 健康情況檢查服務
Grpc.HealthCheck
套件包含用於 gRPC 健康情況檢查的用戶端:
var channel = GrpcChannel.ForAddress("https://localhost:5001");
var client = new Health.HealthClient(channel);
var response = client.CheckAsync(new HealthCheckRequest());
var status = response.Status;
Health
服務上有兩種方法:
Check
是一元方法,可取得目前的健康狀態。 呼叫Check
時,會立即執行健康情況檢查。 如果用戶端要求未知的服務名稱,伺服器會傳回NOT_FOUND
錯誤回應。 如果尚未發佈健康情況結果,當應用程式啟動時就會發生此情況。Watch
是一種串流方法,可報告一段時間的健全狀態變化。 IHealthCheckPublisher 會定期執行以收集健康情況結果。 如果用戶端要求未知的服務名稱,伺服器會傳回Unknown
狀態。