Condividi tramite


Controlli di integrità gRPC in ASP.NET Core

Nota

Questa non è la versione più recente di questo articolo. Per la versione corrente, vedere la versione .NET 9 di questo articolo.

Avviso

Questa versione di ASP.NET Core non è più supportata. Per altre informazioni, vedere i criteri di supporto di .NET e .NET Core. Per la versione corrente, vedere la versione .NET 9 di questo articolo.

Importante

Queste informazioni si riferiscono a un prodotto non definitive che può essere modificato in modo sostanziale prima che venga rilasciato commercialmente. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.

Per la versione corrente, vedere la versione .NET 9 di questo articolo.

Di James Newton-King

Il protocollo di controllo dell'integrità gRPC è uno standard per segnalare l'integrità delle app server gRPC.

I controlli di integrità vengono esposti da un'app come servizio gRPC. Vengono in genere usati con un servizio di monitoraggio esterno per controllare lo stato di un'app. Il servizio può essere configurato per vari scenari di monitoraggio in tempo reale:

  • I probe di integrità possono essere usati dagli agenti di orchestrazione e dai servizi di bilanciamento del carico per controllare lo stato di un'app. Ad esempio, Kubernetes supporta liveness gRPC, idoneità e probe di avvio. Kubernetes può essere configurato per reindirizzare il traffico o riavviare contenitori non integri in base ai risultati del controllo integro gRPC.
  • È possibile monitorare lo stato di integrità di memoria, disco e altre risorse fisiche del server.
  • I controlli di integrità possono testare le dipendenze di un'app, ad esempio i database e gli endpoint di servizio esterni, per verificare la disponibilità e il normale funzionamento.

Configurare i controlli di integrità gRPC

gRPC ASP.NET Core include il supporto predefinito per i controlli di integrità gRPC con il Grpc.AspNetCore.HealthChecks pacchetto. I risultati dei controlli di integrità .NET vengono segnalati ai chiamanti.

Per configurare i controlli di integrità gRPC in un'app:

  • Aggiungere un riferimento al Grpc.AspNetCore.HealthChecks pacchetto.
  • Registrare il servizio controlli di integrità gRPC:
    • AddGrpcHealthChecks per registrare i servizi che abilitano i controlli di integrità.
    • MapGrpcHealthChecksService per aggiungere un endpoint del servizio di controllo dell'integrità.
  • Aggiungere controlli di integrità implementando IHealthCheck o usando il AddCheck metodo .
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 vengono configurati i controlli di integrità:

  • Il servizio controlli di integrità viene aggiunto all'app server.
  • I controlli di integrità .NET registrati con l'app vengono eseguiti periodicamente per i risultati di integrità. Per impostazione predefinita, si verifica un ritardo di 5 secondi dopo l'avvio dell'app e quindi i controlli di integrità vengono eseguiti ogni 30 secondi. L'intervallo di esecuzione del controllo integrità può essere personalizzato con HealthCheckPublisherOptions.
  • I risultati dell'integrità determinano i report del servizio gRPC:
    • Unknown viene segnalato quando non sono presenti risultati di integrità.
    • NotServing viene segnalato quando sono presenti risultati di integrità di HealthStatus.Unhealthy.
    • In caso contrario, Serving viene segnalato.

Sicurezza del servizio Controlli integrità

I controlli di integrità gRPC restituiscono lo stato di integrità di un'app, che potrebbe essere informazioni riservate. Prestare attenzione a limitare l'accesso al servizio di controlli di integrità gRPC.

L'accesso al servizio può essere controllato tramite metodi standard ASP.NET di estensione dell'autorizzazione Core, ad esempio AllowAnonymous e RequireAuthorization.

Ad esempio, se un'app è stata configurata per richiedere l'autorizzazione per impostazione predefinita, configurare l'endpoint dei controlli di integrità gRPC con AllowAnonymous per ignorare l'autenticazione e l'autorizzazione.

app.MapGrpcHealthChecksService().AllowAnonymous();

ConfigurareGrpc.AspNetCore.HealthChecks

Per impostazione predefinita, il servizio controlli di integrità gRPC usa tutti i controlli di integrità registrati per determinare lo stato di integrità. I controlli di integrità gRPC possono essere personalizzati quando registrati per l'uso di un subset di controlli di integrità. Il metodo viene usato per eseguire il MapService mapping dei risultati di integrità ai nomi dei servizi, insieme a un predicato per filtrare i risultati dell'integrità:

var builder = WebApplication.CreateBuilder(args);

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

var app = builder.Build();

Il codice precedente esegue l'override del servizio predefinito ("") per usare solo i risultati di integrità con il tag "public".

I controlli di integrità gRPC supportano il client che specifica un argomento del nome del servizio durante il controllo dell'integrità. Sono supportati più servizi fornendo un nome di servizio a 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();

Il nome del servizio specificato dal client è in genere il nome predefinito ("") o un nome completo del pacchetto di un servizio nell'app. Tuttavia, nulla impedisce al client di usare valori arbitrari per controllare l'integrità dell'app.

Configurare l'intervallo di esecuzione dei controlli di integrità

I controlli di integrità vengono eseguiti immediatamente quando Check viene chiamato . Watch è un metodo di streaming e ha un comportamento diverso da Check: il flusso a esecuzione prolungata segnala i risultati dei controlli di integrità nel tempo eseguendo IHealthCheckPublisher periodicamente per raccogliere i risultati di integrità. Per impostazione predefinita, l'editore:

  • Attende 5 secondi dopo l'avvio dell'app prima di eseguire i controlli di integrità.
  • Esegue controlli di integrità ogni 30 secondi.

Gli intervalli del server di pubblicazione possono essere configurati usando HealthCheckPublisherOptions all'avvio:

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

Chiamare il servizio controlli di integrità gRPC

Il Grpc.HealthCheck pacchetto include un client per i controlli di integrità 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;

Esistono due metodi nel Health servizio:

  • Check è un metodo unario per ottenere lo stato di integrità corrente. I controlli di integrità vengono eseguiti immediatamente quando Check viene chiamato . Il server restituisce una NOT_FOUND risposta di errore se il client richiede un nome di servizio sconosciuto. Questo problema può verificarsi all'avvio dell'app se i risultati dell'integrità non sono ancora stati pubblicati.
  • Watch è un metodo di streaming che segnala le modifiche apportate allo stato di integrità nel tempo. IHealthCheckPublisher viene eseguito periodicamente per raccogliere i risultati di integrità. Il server restituisce uno Unknown stato se il client richiede un nome di servizio sconosciuto.

Il Grpc.HealthCheck client può essere usato in un approccio client factory:

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

Nell'esempio precedente una factory client per Health.HealthClient le istanze viene registrata con il sistema di inserimento delle dipendenze. Quindi, queste istanze vengono inserite nei servizi per l'esecuzione di chiamate di controllo integrità.

Per altre informazioni, vedere Integrazione della factory client gRPC in .NET.

Risorse aggiuntive

Di James Newton-King

Il protocollo di controllo dell'integrità gRPC è uno standard per segnalare l'integrità delle app server gRPC.

I controlli di integrità vengono esposti da un'app come servizio gRPC. Vengono in genere usati con un servizio di monitoraggio esterno per controllare lo stato di un'app. Il servizio può essere configurato per vari scenari di monitoraggio in tempo reale:

  • I probe di integrità possono essere usati dagli agenti di orchestrazione e dai servizi di bilanciamento del carico per controllare lo stato di un'app. Ad esempio, Kubernetes supporta liveness gRPC, idoneità e probe di avvio. Kubernetes può essere configurato per reindirizzare il traffico o riavviare contenitori non integri in base ai risultati del controllo integro gRPC.
  • È possibile monitorare lo stato di integrità di memoria, disco e altre risorse fisiche del server.
  • I controlli di integrità possono testare le dipendenze di un'app, ad esempio i database e gli endpoint di servizio esterni, per verificare la disponibilità e il normale funzionamento.

Configurare i controlli di integrità gRPC

gRPC ASP.NET Core include il supporto predefinito per i controlli di integrità gRPC con il Grpc.AspNetCore.HealthChecks pacchetto. I risultati dei controlli di integrità .NET vengono segnalati ai chiamanti.

Per configurare i controlli di integrità gRPC in un'app:

  • Aggiungere un riferimento al Grpc.AspNetCore.HealthChecks pacchetto.
  • Registrare il servizio controlli di integrità gRPC in Startup.cs:
    • AddGrpcHealthChecks per registrare i servizi che abilitano i controlli di integrità.
    • MapGrpcHealthChecksService per aggiungere un endpoint del servizio di controllo dell'integrità.
  • Aggiungere controlli di integrità implementando IHealthCheck o usando il AddCheck metodo .
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 vengono configurati i controlli di integrità:

  • Il servizio controlli di integrità viene aggiunto all'app server.
  • I controlli di integrità .NET registrati con l'app vengono eseguiti periodicamente per i risultati di integrità. Per impostazione predefinita, si verifica un ritardo di 5 secondi dopo l'avvio dell'app e quindi i controlli di integrità vengono eseguiti ogni 30 secondi. L'intervallo di esecuzione del controllo integrità può essere personalizzato con HealthCheckPublisherOptions.
  • I risultati dell'integrità determinano i report del servizio gRPC:
    • Unknown viene segnalato quando non sono presenti risultati di integrità.
    • NotServing viene segnalato quando sono presenti risultati di integrità di HealthStatus.Unhealthy.
    • In caso contrario, Serving viene segnalato.

ConfigurareGrpc.AspNetCore.HealthChecks

Per impostazione predefinita, il servizio controlli di integrità gRPC usa tutti i controlli di integrità registrati per determinare lo stato di integrità. I controlli di integrità gRPC possono essere personalizzati quando registrati per l'uso di un subset di controlli di integrità. Il metodo viene usato per eseguire il MapService mapping dei risultati di integrità ai nomi dei servizi, insieme a un predicato per filtrare i risultati dell'integrità:

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

Il codice precedente esegue l'override del servizio predefinito ("") per usare solo i risultati di integrità con il tag "public".

I controlli di integrità gRPC supportano il client che specifica un argomento del nome del servizio durante il controllo dell'integrità. Sono supportati più servizi fornendo un nome di servizio a MapService:

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

Il nome del servizio specificato dal client è in genere il nome predefinito ("") o un nome completo del pacchetto di un servizio nell'app. Tuttavia, nulla impedisce al client di usare valori arbitrari per controllare l'integrità dell'app.

Configurare l'intervallo di esecuzione dei controlli di integrità

I controlli di integrità vengono eseguiti immediatamente quando Check viene chiamato . Watch è un metodo di streaming e ha un comportamento diverso da Check: il flusso a esecuzione prolungata segnala i risultati dei controlli di integrità nel tempo eseguendo IHealthCheckPublisher periodicamente per raccogliere i risultati di integrità. Per impostazione predefinita, l'editore:

  • Attende 5 secondi dopo l'avvio dell'app prima di eseguire i controlli di integrità.
  • Esegue controlli di integrità ogni 30 secondi.

Gli intervalli del server di pubblicazione possono essere configurati usando HealthCheckPublisherOptions all'avvio:

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

Chiamare il servizio controlli di integrità gRPC

Il Grpc.HealthCheck pacchetto include un client per i controlli di integrità gRPC:

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

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

Esistono due metodi nel Health servizio:

  • Check è un metodo unario per ottenere lo stato di integrità corrente. I controlli di integrità vengono eseguiti immediatamente quando Check viene chiamato . Il server restituisce una NOT_FOUND risposta di errore se il client richiede un nome di servizio sconosciuto. Questo problema può verificarsi all'avvio dell'app se i risultati dell'integrità non sono ancora stati pubblicati.
  • Watch è un metodo di streaming che segnala le modifiche apportate allo stato di integrità nel tempo. IHealthCheckPublisher viene eseguito periodicamente per raccogliere i risultati di integrità. Il server restituisce uno Unknown stato se il client richiede un nome di servizio sconosciuto.

Risorse aggiuntive