Kiểm tra sức khỏe gRPC (gRPC health checks) trong ASP.NET Core
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:
- Health probes (đầu dò sức khỏe) có thể được sử dụng bởi các container orchestrators và load balancers để kiểm tra trạng thái của ứng dụng. Ví dụ, Kubernetes hỗ trợ gRPC liveness, readiness và startup probes. Kubernetes có thể được cấu hình để chuyển hướng traffic hoặc khởi động lại các container không khỏe mạnh dựa trên kết quả kiểm tra sức khỏe gRPC.
- Việc sử dụng bộ nhớ, đĩa, và các tài nguyên server vật lý khác có thể được giám sát về trạng thái khỏe mạnh.
- Health checks có thể kiểm tra các phụ thuộc của ứng dụng, như databases và các external service endpoint, để xác nhận tính khả dụng và hoạt động bình thường.
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:
- Thêm tham chiếu package
Grpc.AspNetCore.HealthChecks. - Đăng ký gRPC health checks service:
AddGrpcHealthChecksđể đăng ký các service cho phép health checks.MapGrpcHealthChecksServiceđể thêm một health checks service endpoint.- Thêm health checks bằng cách triển khai
IHealthCheckhoặc sử dụng phương thứcAddCheck.
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:
- Health checks service được thêm vào ứng dụng server.
- Các .NET health check đã đăng ký với ứng dụng được thực thi định kỳ để lấy kết quả sức khỏe. Theo mặc định, có độ trễ 5 giây sau khi khởi động ứng dụng, sau đó health checks được thực thi mỗi 30 giây. Khoảng thời gian thực thi có thể được tùy chỉnh bằng
HealthCheckPublisherOptions. - Kết quả health xác định những gì gRPC service báo cáo:
Unknownđược báo cáo khi không có kết quả health.NotServingđược báo cáo khi có bất kỳ kết quả health nào làHealthStatus.Unhealthy.- Ngược lại,
Servingđược báo cáo.
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ư AllowAnonymous và RequireAuthorization.
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:
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:
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:
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:
- Chờ 5 giây sau khi khởi động ứng dụng trước khi chạy health checks.
- Chạy health checks mỗi 30 giây.
Khoảng thời gian của publisher có thể được cấu hình bằng HealthCheckPublisherOptions khi khởi động:
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:
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:
Checklà một phương thức unary để lấy trạng thái sức khỏe hiện tại. Health checks được thực thi ngay lập tức khiCheckđược gọi. Server trả về response lỗiNOT_FOUNDnếu client yêu cầu một tên service không xác định. Điều này có thể xảy ra khi khởi động ứng dụng nếu kết quả health chưa được publish.Watchlà một phương thức streaming báo cáo các thay đổi về trạng thái sức khỏe theo thời gian.IHealthCheckPublisherđược thực thi định kỳ để thu thập kết quả health. Server trả về trạng tháiUnknownnếu client yêu cầu một tên service không xác định.
Client Grpc.HealthCheck có thể được sử dụng theo cách tiếp cận client factory:
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.