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
Ordinare randomicamente una lista in C#
Utilizzare i variable font nel CSS
Utilizzare una qualunque lista per i parametri di tipo params in C#
Esporre i propri servizi applicativi con Semantic Kernel e ASP.NET Web API
Configurare e gestire sidecar container in Azure App Service
Applicare un filtro per recuperare alcune issue di GitHub
Eseguire script pre e post esecuzione di un workflow di GitHub
Inference di dati strutturati da testo con Semantic Kernel e ASP.NET Core Web API
Rendere i propri workflow e le GitHub Action utilizzate più sicure
Generare velocemente pagine CRUD in Blazor con QuickGrid
Configurare il nome della run di un workflow di GitHub in base al contesto di esecuzione
Gestione degli stili CSS con le regole @layer