Compartilhar via


Verificações de integridade do gRPC no ASP.NET Core

Por James Newton-King

O protocolo de verificação de integridade do gRPC é um padrão para relatar a integridade de aplicativos de servidor gRPC.

As verificações de integridade são expostas por um aplicativo como serviço do gRPC. Normalmente, eles são usados com um serviço de monitoramento externo para verificar o status de um aplicativo. O serviço pode ser configurado para vários cenários de monitoramento em tempo real:

  • As investigações de integridade podem ser usadas por orquestradores de contêineres e balanceadores de carga para verificar o status de um aplicativo. Por exemplo, o Kubernetes dá suporte à atividade, à preparação e às investigações de inicialização do gRPC. O Kubernetes pode ser configurado para redirecionar o tráfego ou reiniciar contêineres não íntegros com base nos resultados de verificação de integridade do gRPC.
  • O uso de memória, disco e outros recursos de servidor físico pode ser monitorado quanto ao status de integridade.
  • As verificações de integridade podem testar as dependências do aplicativo, como bancos de dados e pontos de extremidade de serviço externo, para confirmar a disponibilidade e o funcionamento normal.

Configurar as verificações de integridade do gRPC

O ASP.NET Core do gRPC tem suporte interno para verificações de integridade do gRPC com o pacote Grpc.AspNetCore.HealthChecks. Os resultados das verificações de integridade do .NET são relatados aos chamadores.

Para configurar verificações de integridade do gRPC em um aplicativo:

  • Adicione uma referência de pacote Grpc.AspNetCore.HealthChecks.
  • Registre o serviço de verificações de integridade do gRPC:
    • AddGrpcHealthChecks para registrar serviços que habilitam verificações de integridade.
    • MapGrpcHealthChecksService para adicionar um ponto de extremidade do serviço de verificações de integridade.
  • Adicione verificações de integridade implementando IHealthCheck ou usando o método 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.

Quando as verificações de integridade são configuradas:

  • O serviço de verificações de integridade é adicionado ao aplicativo do servidor.
  • As verificações de integridade do .NET registradas com o aplicativo são executadas periodicamente para obter resultados de integridade. Por padrão, há um atraso de 5 segundos após a inicialização do aplicativo e, em seguida, as verificações de integridade são executadas a cada 30 segundos. O intervalo de execução de verificação de integridade pode ser personalizado com HealthCheckPublisherOptions.
  • Os resultados de integridade determinam o que o serviço do gRPC relata:
    • Unknown é relatado quando não há resultados de integridade.
    • NotServing é relatado quando não há resultados de integridade do HealthStatus.Unhealthy.
    • Caso contrário, Serving será relatado.

configurar Grpc.AspNetCore.HealthChecks

Por padrão, o serviço de verificações de integridade do gRPC usa todas as verificações de integridade registradas para determinar o status de integridade. As verificações de integridade do gRPC podem ser personalizadas quando registradas para usar um subconjunto de verificações de integridade. O método MapService é usado para mapear resultados de integridade para nomes de serviço, juntamente com um predicado para filtrar os resultados de integridade:

var builder = WebApplication.CreateBuilder(args);

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

var app = builder.Build();

O código anterior substitui o serviço padrão ("") para usar apenas os resultados de integridade com a marcação "público".

As verificações de integridade do gRPC dão suporte ao cliente que especifica um argumento de nome de serviço ao verificar a integridade. Há suporte para vários serviços fornecendo um nome de serviço para 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();

O nome do serviço especificado pelo cliente geralmente é o padrão ("") ou um nome qualificado por pacote de um serviço em seu aplicativo. No entanto, nada impede que o cliente use valores arbitrários para verificar a integridade do aplicativo.

Configurar o intervalo de execução de verificações de integridade

As verificações de integridade são executadas imediatamente quando Check é chamado. Watch é um método de streaming e tem um comportamento diferente de Check: o fluxo de execução prolongada relata resultados de verificações de integridade ao longo do tempo executando IHealthCheckPublisher periodicamente para coletar resultados de integridade. Por padrão, o editor:

  • Aguarda cinco segundos após a inicialização do aplicativo antes de executar verificações de integridade.
  • Executa verificações de integridade a cada 30 segundos.

Os intervalos do publicador podem ser configurados usando HealthCheckPublisherOptions na inicialização:

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

Chamar o serviço de verificações de integridade do gRPC

O pacote Grpc.HealthCheck inclui um cliente para verificações de integridade do 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;

Há dois métodos no serviço Health:

  • Checké um método unário para obter o status de integridade atual. As verificações de integridade são executadas imediatamente quando Check é chamado. O servidor retornará uma resposta de erro NOT_FOUND se o cliente solicitar um nome de serviço desconhecido. Isso pode acontecer na inicialização do aplicativo se os resultados de integridade ainda não tiverem sido publicados.
  • Watch é um método de streaming que relata alterações no status de integridade ao longo do tempo. IHealthCheckPublisher é executado periodicamente usando para coletar resultados de integridade. O servidor retornará um status Unknown se o cliente solicitar um nome de serviço desconhecido.

O cliente Grpc.HealthCheck pode ser usado em uma abordagem de fábrica de clientes:

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

No exemplo anterior, uma fábrica de clientes para instâncias Health.HealthClient é registrada no sistema de injeção de dependência. Em seguida, essas instâncias são injetadas em serviços para a execução de chamadas de verificação de integridade.

Para saber mais, confira Integração de fábrica do cliente gRPC no .NET.

Recursos adicionais

Por James Newton-King

O protocolo de verificação de integridade do gRPC é um padrão para relatar a integridade de aplicativos de servidor gRPC.

As verificações de integridade são expostas por um aplicativo como serviço do gRPC. Normalmente, eles são usados com um serviço de monitoramento externo para verificar o status de um aplicativo. O serviço pode ser configurado para vários cenários de monitoramento em tempo real:

  • As investigações de integridade podem ser usadas por orquestradores de contêineres e balanceadores de carga para verificar o status de um aplicativo. Por exemplo, o Kubernetes dá suporte à atividade, à preparação e às investigações de inicialização do gRPC. O Kubernetes pode ser configurado para redirecionar o tráfego ou reiniciar contêineres não íntegros com base nos resultados de verificação de integridade do gRPC.
  • O uso de memória, disco e outros recursos de servidor físico pode ser monitorado quanto ao status de integridade.
  • As verificações de integridade podem testar as dependências do aplicativo, como bancos de dados e pontos de extremidade de serviço externo, para confirmar a disponibilidade e o funcionamento normal.

Configurar as verificações de integridade do gRPC

O ASP.NET Core do gRPC tem suporte interno para verificações de integridade do gRPC com o pacote Grpc.AspNetCore.HealthChecks. Os resultados das verificações de integridade do .NET são relatados aos chamadores.

Para configurar verificações de integridade do gRPC em um aplicativo:

  • Adicione uma referência de pacote Grpc.AspNetCore.HealthChecks.
  • Registre o serviço de verificações de integridade do gRPC em Startup.cs:
    • AddGrpcHealthChecks para registrar serviços que habilitam verificações de integridade.
    • MapGrpcHealthChecksService para adicionar um ponto de extremidade do serviço de verificações de integridade.
  • Adicione verificações de integridade implementando IHealthCheck ou usando o método 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();
    });
}

Quando as verificações de integridade são configuradas:

  • O serviço de verificações de integridade é adicionado ao aplicativo do servidor.
  • As verificações de integridade do .NET registradas com o aplicativo são executadas periodicamente para obter resultados de integridade. Por padrão, há um atraso de cinco segundos após a inicialização do aplicativo e, em seguida, as verificações de integridade são executadas a cada 30 segundos. O intervalo de execução de verificação de integridade pode ser personalizado com HealthCheckPublisherOptions.
  • Os resultados de integridade determinam o que o serviço do gRPC relata:
    • Unknown é relatado quando não há resultados de integridade.
    • NotServing é relatado quando não há resultados de integridade do HealthStatus.Unhealthy.
    • Caso contrário, Serving será relatado.

configurar Grpc.AspNetCore.HealthChecks

Por padrão, o serviço de verificações de integridade do gRPC usa todas as verificações de integridade registradas para determinar o status de integridade. As verificações de integridade do gRPC podem ser personalizadas quando registradas para usar um subconjunto de verificações de integridade. O método MapService é usado para mapear resultados de integridade para nomes de serviço, juntamente com um predicado para filtrar os resultados de integridade:

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

O código anterior substitui o serviço padrão ("") para usar apenas os resultados de integridade com a marcação "público".

As verificações de integridade do gRPC dão suporte ao cliente que especifica um argumento de nome de serviço ao verificar a integridade. Há suporte para vários serviços fornecendo um nome de serviço para MapService:

services.AddGrpcHealthChecks(o =>
{
    o.Services.MapService("greet.Greeter", r => r.Tags.Contains("greeter"));
    o.Services.MapService("count.Counter", r => r.Tags.Contains("counter"));
});

O nome do serviço especificado pelo cliente geralmente é o padrão ("") ou um nome qualificado por pacote de um serviço em seu aplicativo. No entanto, nada impede que o cliente use valores arbitrários para verificar a integridade do aplicativo.

Configurar o intervalo de execução de verificações de integridade

As verificações de integridade são executadas imediatamente quando Check é chamado. Watch é um método de streaming e tem um comportamento diferente de Check: o fluxo de execução prolongada relata resultados de verificações de integridade ao longo do tempo executando IHealthCheckPublisher periodicamente para coletar resultados de integridade. Por padrão, o editor:

  • Aguarda cinco segundos após a inicialização do aplicativo antes de executar verificações de integridade.
  • Executa verificações de integridade a cada 30 segundos.

Os intervalos do publicador podem ser configurados usando HealthCheckPublisherOptions na inicialização:

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

Chamar o serviço de verificações de integridade do gRPC

O pacote Grpc.HealthCheck inclui um cliente para verificações de integridade do gRPC:

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

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

Há dois métodos no serviço Health:

  • Checké um método unário para obter o status de integridade atual. As verificações de integridade são executadas imediatamente quando Check é chamado. O servidor retornará uma resposta de erro NOT_FOUND se o cliente solicitar um nome de serviço desconhecido. Isso pode acontecer na inicialização do aplicativo se os resultados de integridade ainda não tiverem sido publicados.
  • Watch é um método de streaming que relata alterações no status de integridade ao longo do tempo. IHealthCheckPublisher é executado periodicamente usando para coletar resultados de integridade. O servidor retornará um status Unknown se o cliente solicitar um nome de serviço desconhecido.

Recursos adicionais