In un articolo precedente (https://www.aspitalia.com/articoli/asp.net-core5/grpc/usare-grpc-infrastruttura-nostri-servizi-web.aspx) abbiamo introdotto il protocollo gRPC: una tecnologia di comunicazione che si contrappone al mondo Web API, utilizzando serializzazione binaria e contratti definiti in file Protobuf.
Così come per le Web API, anche per l'interrogazione gRPC potremmo voler sapere se il servizio è effettivamente pronto, risposta che può variare a seconda di vari fattori, come reperibilità di servizi terzi, oppure, se inserito all'interno di un container, possiamo utilizzare i controlli Health Check per sapere se il container e l'applicazione sono stati inizializzati correttamente.
Essendo l'Health Check eseguito side-by-side all'applicazione, l'implementazione inizierà dal file Program.cs abilitando il servizio, ed aggiungendone uno creato ad-hoc per gRPC, fornito dal namespace Grpc.HealthCheck, infine svilupperemo un BackgroundService nel quale scriveremo la logica che stabilirà lo stato.
using Grpc.HealthCheck; builder.Services.AddHealthChecks(); builder.Services.AddSingleton<HealthServiceImpl>(); builder.Services.AddHostedService<StatusService>();
All'interno del BackgroundService controlliamo, tramite un ciclo infinito intervallato da un timer, nel metodo ExecuteAsync, lo stato del servizio attraverso le istanze di HealthServiceImpl e HealthCheckService
using Grpc.Health.V1; using Grpc.HealthCheck; using Microsoft.Extensions.Diagnostics.HealthChecks; public class StatusService : BackgroundService { private readonly HealthServiceImpl _healthService; private readonly HealthCheckService _healthCheckService; public StatusService(HealthServiceImpl healthService, HealthCheckService healthCheckService) { _healthService = healthService; _healthCheckService = healthCheckService; } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationRequested) { var health = await _healthCheckService.CheckHealthAsync(stoppingToken); _healthService.SetStatus("MyService", health.Status == HealthStatus.Healthy ? HealthCheckResponse.Types.ServingStatus.Serving : HealthCheckResponse.Types.ServingStatus.NotServing); await Task.Delay(TimeSpan.FromSeconds(15), stoppingToken); } } }
Alla nostra applicazione non resterà altro che esporre questa informazione verso l'esterno: tornando al Program.cs inseriamo l'endpoint per conoscere l'Health Check ed eseguiamo il mapping del servizio gRPC apposito.
app.MapHealthChecks("/health"); app.MapGrpcService<HealthServiceImpl>();
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Recuperare App Service cancellati su Azure
Utilizzare il metodo CountBy di LINQ per semplificare raggruppamenti e i conteggi
Anonimizzare i dati sensibili nei log di Azure Front Door
Utilizzare un numero per gestire la concorrenza ottimistica con SQL Server ed Entity Framework
Cancellare una run di un workflow di GitHub
Effettuare il refresh dei dati di una QuickGrid di Blazor
Creare una libreria CSS universale: Cards
Referenziare un @layer più alto in CSS
Ordinare randomicamente una lista in C#
Utilizzare l'espressione if inline in una pipeline di Azure DevOps
Gestire eccezioni nei plugin di Semantic Kernel in ASP.NET Core Web API
Generare HTML a runtime a partire da un componente Razor in ASP.NET Core