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.
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 quandoCheck
viene chiamato . Il server restituisce unaNOT_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 unoUnknown
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
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 quandoCheck
viene chiamato . Il server restituisce unaNOT_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 unoUnknown
stato se il client richiede un nome di servizio sconosciuto.