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 状态。

其他资源