ASP.NET Core 中的 gRPC 运行状况检查

注意

此版本不是本文的最新版本。 对于当前版本,请参阅此文的 .NET 8 版本

警告

此版本的 ASP.NET Core 不再受支持。 有关详细信息,请参阅 .NET 和 .NET Core 支持策略。 对于当前版本,请参阅此文的 .NET 8 版本

重要

此信息与预发布产品相关,相应产品在商业发布之前可能会进行重大修改。 Microsoft 对此处提供的信息不提供任何明示或暗示的保证。

对于当前版本,请参阅此文的 .NET 8 版本

作者: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 运行状况检查返回有关应用的运行状况,这可能是敏感信息。 应注意限制对 gRPC 运行状况检查服务的访问。

可以通过标准 ASP.NET Core 授权扩展方法(例如 AllowAnonymousRequireAuthorization)来控制对服务的访问。

例如,如果应用已配置为默认需要授权,请使用 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 客户端工厂集成

其他资源

作者: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 状态。

其他资源