events
ASP.NET Core の gRPC 正常性チェック
注意
これは、この記事の最新バージョンではありません。 現在のリリースについては、この記事の .NET 9 バージョンを参照してください。
警告
このバージョンの ASP.NET Core はサポート対象から除外されました。 詳細については、 .NET および .NET Core サポート ポリシーを参照してください。 現在のリリースについては、この記事の .NET 9 バージョンを参照してください。
重要
この情報はリリース前の製品に関する事項であり、正式版がリリースされるまでに大幅に変更される可能性があります。 Microsoft はここに示されている情報について、明示か黙示かを問わず、一切保証しません。
現在のリリースについては、この記事の .NET 9 バージョンを参照してください。
作成者: James Newton-King
gRPC 正常性チェック プロトコルは、gRPC サーバー アプリの正常性を報告するための標準です。
正常性チェックは、アプリによって gRPC サービスとして公開されます。 これらは通常、アプリの状態を確認するために、外部の監視サービスと共に使用されます。 このサービスは、さまざまなリアルタイム監視シナリオに合わせて構成できます。
- 正常性プローブは、アプリの状態を確認する目的でコンテナー オーケストレーターとロード バランサーによって使用できます。 たとえば、Kubernetes は gRPC の liveness、readiness、startup の各 probe をサポートしています。 gRPC 正常性チェックの結果に基づいて、トラフィックを再ルーティングしたり、異常なコンテナーを再起動するように Kubernetes を構成できます。
- メモリ、ディスク、その他の物理サーバー リソースの使用を監視し、正常性の状態を確認できます。
- 正常性チェックでは、データベースや外部サービス エンドポイントなど、アプリの依存関係をテストし、それらが利用できることと正常に機能していることを確認できます。
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 正常性チェック サービスへのアクセスを制限するように注意する必要があります。
このサービスへのアクセスは、AllowAnonymous
や RequireAuthorization
などの標準的な ASP.NET Core 認可拡張メソッドを通して制御できます。
たとえば、アプリが既定で承認を要求するように構成されている場合は、AllowAnonymous
を使用して認証と承認をスキップするように gRPC 正常性チェック エンドポイントを構成します。
app.MapGrpcHealthChecksService().AllowAnonymous();
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.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
サービスには、次の 2 つのメソッドがあります。
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 クライアント ファクトリの統合」を参照してください。
作成者: James Newton-King
gRPC 正常性チェック プロトコルは、gRPC サーバー アプリの正常性を報告するための標準です。
正常性チェックは、アプリによって gRPC サービスとして公開されます。 通常、アプリの状態を確認するために、外部の監視サービスと併用されます。 このサービスは、さまざまなリアルタイム監視シナリオに合わせて構成できます。
- 正常性プローブは、アプリの状態を確認する目的でコンテナー オーケストレーターとロード バランサーによって使用できます。 たとえば、Kubernetes は gRPC の liveness、readiness、startup の各 probe をサポートしています。 gRPC 正常性チェックの結果に基づいて、トラフィックを再ルーティングしたり、異常なコンテナーを再起動するように Kubernetes を構成できます。
- メモリ、ディスク、その他の物理サーバー リソースの使用を監視し、正常性の状態を確認できます。
- 正常性チェックでは、データベースや外部サービス エンドポイントなど、アプリの依存関係をテストし、それらが利用できることと正常に機能していることを確認できます。
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 正常性チェック サービスの既定では、登録されているすべての正常性チェックを使って正常性状態が判断されます。 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.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
サービスには、次の 2 つのメソッドがあります。
Check
は、現在の正常性状態を取得するための単項メソッドです。 正常性チェックは、Check
が呼び出されると直ちに実行されます。 クライアントが不明なサービス名を要求した場合、サーバーはNOT_FOUND
エラー応答を返します。 これは、アプリの起動時に、正常性の結果がまだ発行されていない場合に発生する可能性があります。Watch
は、時間の経過に伴う正常性状態の変化を報告するストリーミング メソッドです。 IHealthCheckPublisher は、正常性の結果を収集するために定期的に実行されます。 クライアントが不明なサービス名を要求した場合、サーバーはUnknown
状態を返します。
ASP.NET Core に関するフィードバック
ASP.NET Core はオープンソース プロジェクトです。 フィードバックを提供するにはリンクを選択します。
その他のリソース
トレーニング
モジュール
クラウド ネイティブのマイクロサービスに回復性を実装する - Training
このモジュールでは、Kubernetes Service の .NET マイクロサービス アプリに回復性を実装する方法について説明します。
ドキュメント
-
ASP.NET Core で gRPCurl と gRPCui を使用して gRPC サービスをテストする
gRPC ツールを使用してサービスをテストする方法について説明します。 gRPCurl は、gRPC サービスと対話するためのコマンドライン ツールです。 gRPCui は、対話型の Web UI です。
-
クライアント ファクトリを使用して gRPC クライアントを作成する方法について説明します。
-
.NET を使用したコードファーストの gRPC サービスとクライアント
.NET を使用したコードファーストの gRPC を作成する際の基本的な概念について説明します。