Nguon: Microsoft Learn · .NET 8.0

Kiểm tra sức khỏe gRPC (gRPC health checks) trong ASP.NET Core

Nguồn: gRPC health checks in ASP.NET Core

Bởi James Newton-King

Giao thức kiểm tra sức khỏe gRPC (gRPC health checking protocol) là một tiêu chuẩn để báo cáo trạng thái sức khỏe của các ứng dụng gRPC server.

Các health check (kiểm tra sức khỏe) được ứng dụng expose (công khai) dưới dạng gRPC service. Chúng thường được sử dụng với một dịch vụ giám sát bên ngoài để kiểm tra trạng thái của ứng dụng. Service có thể được cấu hình cho nhiều tình huống giám sát thời gian thực:

Thiết lập gRPC health checks

gRPC ASP.NET Core có hỗ trợ tích hợp sẵn cho gRPC health checks với package Grpc.AspNetCore.HealthChecks. Kết quả từ .NET health checks được báo cáo cho người gọi.

Để thiết lập gRPC health checks trong ứng dụng:

csharp
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 đã được rút gọn.

Khi health checks được thiết lập:

Bảo mật health checks service

gRPC health checks trả về trạng thái sức khỏe của ứng dụng, đây có thể là thông tin nhạy cảm. Cần cẩn thận để hạn chế quyền truy cập vào gRPC health checks service.

Quyền truy cập vào service có thể được kiểm soát thông qua các phương thức extension authorization tiêu chuẩn của ASP.NET Core, như AllowAnonymousRequireAuthorization.

Ví dụ, nếu ứng dụng đã được cấu hình để yêu cầu authorization theo mặc định, cấu hình gRPC health checks endpoint với AllowAnonymous để bỏ qua xác thực và phân quyền:

csharp
app.MapGrpcHealthChecksService().AllowAnonymous();

Cấu hình Grpc.AspNetCore.HealthChecks

Theo mặc định, gRPC health checks service sử dụng tất cả các health check đã đăng ký để xác định trạng thái sức khỏe. gRPC health checks có thể được tùy chỉnh khi đăng ký để sử dụng một tập con của health checks. Phương thức MapService được dùng để ánh xạ kết quả health đến tên service, cùng với một predicate (vị từ lọc) để lọc kết quả health:

csharp
var builder = WebApplication.CreateBuilder(args);

builder.Services.AddGrpc();
builder.Services.AddGrpcHealthChecks(o =>
{
    o.Services.MapService("", r => r.Tags.Contains("public"));
});

var app = builder.Build();

Code trên ghi đè service mặc định ("") để chỉ sử dụng kết quả health có tag "public".

gRPC health checks hỗ trợ client chỉ định tham số tên service khi kiểm tra sức khỏe. Nhiều service được hỗ trợ bằng cách cung cấp tên service cho MapService:

csharp
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();

Tên service được client chỉ định thường là mặc định ("") hoặc tên đủ điều kiện gói (package-qualified name) của một service trong ứng dụng của bạn. Tuy nhiên, không có gì ngăn client sử dụng các giá trị tùy ý để kiểm tra sức khỏe ứng dụng.

Cấu hình khoảng thời gian thực thi health checks

Health checks được chạy ngay lập tức khi Check được gọi. Watch là một phương thức streaming và có hành vi khác với Check: Stream chạy lâu dài báo cáo kết quả health checks theo thời gian bằng cách định kỳ thực thi IHealthCheckPublisher để thu thập kết quả health. Theo mặc định, publisher:

Khoảng thời gian của publisher có thể được cấu hình bằng HealthCheckPublisherOptions khi khởi động:

csharp
builder.Services.Configure<HealthCheckPublisherOptions>(options =>
{
    options.Delay = TimeSpan.Zero;
    options.Period = TimeSpan.FromSeconds(10);
});

Gọi gRPC health checks service

Package Grpc.HealthCheck bao gồm một client cho gRPC health checks:

csharp
var channel = GrpcChannel.ForAddress("https://localhost:5001");
var client = new Health.HealthClient(channel);

var response = await client.CheckAsync(new HealthCheckRequest());
var status = response.Status;

Có hai phương thức trên Health service:

Client Grpc.HealthCheck có thể được sử dụng theo cách tiếp cận client factory:

csharp
builder.Services
    .AddGrpcClient<Health.HealthClient>(o =>
    {
        o.Address = new Uri("https://localhost:5001");
    });

Trong ví dụ trên, một client factory cho các instance Health.HealthClient được đăng ký với hệ thống dependency injection. Sau đó, các instance này được inject vào các service để thực thi các lệnh gọi health check.

Để biết thêm thông tin, xem Tích hợp gRPC client factory trong .NET.

Tài nguyên bổ sung