ASP.NET Core 中的 gRPC 运行状况检查
注意
此版本不是本文的最新版本。 对于当前版本,请参阅此文的 .NET 8 版本。
警告
此版本的 ASP.NET Core 不再受支持。 有关详细信息,请参阅 .NET 和 .NET Core 支持策略。 对于当前版本,请参阅此文的 .NET 8 版本。
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 授权扩展方法(例如 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 客户端工厂集成。
其他资源
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
状态。