Проверки работоспособности gRPC в ASP.NET Core

Автор: Джеймс Ньютон-Кинг (James Newton-King)

Протокол проверки работоспособности gRPC является стандартом для передачи сведений о работоспособности серверных приложений gRPC.

Проверки работоспособности предоставляются приложением в качестве службы gRPC. Они обычно используются с внешней службой мониторинга для проверки состояния приложения. Службу можно настроить для различных сценариев мониторинга в реальном времени:

  • Проверки работоспособности можно использовать с оркестраторами контейнеров и подсистемами балансировки нагрузки, чтобы проверять состояние приложения. Например, Kubernetes поддерживает пробы активности, готовности и запуска gRPC. Kubernetes можно настроить для перенаправления трафика или перезапуска неработоспособных контейнеров на основе результатов проверки работоспособности gRPC.
  • Использование памяти, диска и других ресурсов физического сервера можно отслеживать с точки зрения работоспособности.
  • Проверки работоспособности позволяют проверять зависимости приложения, такие как базы данных и конечные точки внешних служб, чтобы убедиться в доступности и нормальной работе.

Настройка проверок работоспособности gRPC

В gRPC ASP.NET Core есть встроенная поддержка проверок работоспособности gRPC, обеспечиваемая пакетом Grpc.AspNetCore.HealthChecks. Результаты проверок работоспособности .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 выдается при отсутствии результатов работоспособности.
    • NotServing выдается при наличии каких-либо результатов работоспособности HealthStatus.Unhealthy.
    • В противном случае выдается 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, обеспечиваемая пакетом Grpc.AspNetCore.HealthChecks. Результаты проверок работоспособности .NET передаются вызывающим объектам.

Чтобы настроить проверки работоспособности gRPC в приложении, сделайте следующее:

  • Добавьте ссылку на пакет Grpc.AspNetCore.HealthChecks.
  • Регистрация службы проверка работоспособности gRPC вStartup.cs:
    • 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 выдается при отсутствии результатов работоспособности.
    • NotServing выдается при наличии каких-либо результатов работоспособности HealthStatus.Unhealthy.
    • В противном случае выдается 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.

Дополнительные ресурсы