ASP.NET Core 中的 gRPC 健康情況檢查

作者:James Newton-King

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.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 狀態。

其他資源

作者:James Newton-King

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 狀態。

其他資源