Freigeben über


gRPC-Integritätsprüfungen in ASP.NET Core

Hinweis

Dies ist nicht die neueste Version dieses Artikels. Informationen zum aktuellen Release finden Sie in der .NET 8-Version dieses Artikels.

Warnung

Diese Version von ASP.NET Core wird nicht mehr unterstützt. Weitere Informationen finden Sie in der Supportrichtlinie für .NET und .NET Core. Informationen zum aktuellen Release finden Sie in der .NET 8-Version dieses Artikels.

Wichtig

Diese Informationen beziehen sich auf ein Vorabversionsprodukt, das vor der kommerziellen Freigabe möglicherweise noch wesentlichen Änderungen unterliegt. Microsoft gibt keine Garantie, weder ausdrücklich noch impliziert, hinsichtlich der hier bereitgestellten Informationen.

Informationen zum aktuellen Release finden Sie in der .NET 8-Version dieses Artikels.

Von James Newton-King

Das gRPC-Integritätsprüfungsprotokoll ist ein Standard zum Melden der Integrität von gRPC-Server-Apps.

Integritätsprüfungen werden von einer App als gRPC-Dienst verfügbar gemacht. Sie werden normalerweise mit einem externen Überwachungsdienst verwendet, der den Status einer App überprüft. Der Dienst kann für verschiedene Echtzeitüberwachungsszenarien konfiguriert werden:

  • Integritätstests können von Containerorchestratoren und Lastenausgleichsmodulen verwendet werden, um den Status einer App zu überprüfen. Kubernetes unterstützt zum Beispiel gRPC-Live-, Bereitschafts- und Starttests. Kubernetes kann so konfiguriert werden, dass der Datenverkehr umgeleitet wird oder fehlerhafte Container auf Grundlage der Ergebnisse der gRPC-Integritätsprüfung neu gestartet werden.
  • Die Nutzung von Arbeitsspeicher, Datenträgern und anderen physischen Serverressourcen kann auf einen fehlerfreien Status überwacht werden.
  • Integritätsprüfungen können die Abhängigkeiten einer App testen, wie z.B. Datenbanken und externe Dienstendpunkte, um Verfügbarkeit und normale Funktionsweise zu bestätigen.

Einrichten von gRPC-Integritätsprüfungen

gRPC in ASP.NET Core bietet mit dem Paket Grpc.AspNetCore.HealthChecks integrierte Unterstützung für gRPC-Integritätprüfungen. Ergebnisse von .NET-Integritätsprüfungen werden Aufrufern gemeldet.

So richten Sie gRPC-Integritätsprüfungen in einer App ein

  • Fügen Sie einen Grpc.AspNetCore.HealthChecks-Paketverweis hinzu.
  • Registrieren Sie den gRPC-Integritätsüberprüfungsdienst:
    • AddGrpcHealthChecks zum Registrieren von Diensten, die die Integritätsprüfungen ermöglichen
    • MapGrpcHealthChecksService, um einen Dienstendpunkt für Integritätsprüfungen hinzuzufügen
  • Fügen Sie Integritätsprüfungen durch Implementieren von IHealthCheck oder Verwenden der Methode AddCheck hinzu.
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.

Wenn Integritätsprüfungen eingerichtet sind:

  • Der Integritätsüberprüfungsdienst wird der Server-App hinzugefügt.
  • Bei der App registrierte .NET-Integritätsprüfungen werden regelmäßig ausgeführt. Standardmäßig gibt es eine Verzögerung von 5 Sekunden nach dem Start der App, und dann werden alle 30 Sekunden Integritätsprüfungen ausgeführt. Das Ausführungsintervall der Integritätsprüfung kann mit HealthCheckPublisherOptionsangepasst werden.
  • Die Ergebnisse bestimmen, was der gRPC-Dienst meldet:
    • Unknown wird gemeldet, wenn es keine Integritätsergebnisse gibt.
    • NotServing wird gemeldet, wenn es Integritätsergebnisse des Typs HealthStatus.Unhealthy gibt.
    • Andernfalls wird Serving gemeldet.

Sicherheit des Integritätsüberprüfungsdienstes

gRPC-Überprüfungen geben den Integritätsstatus einer Anwendung zurück, bei dem es sich um sensible Informationen handeln könnte. Es sollte darauf geachtet werden, den Zugriff auf den gRPC-Integritätsüberprüfungsdienst einzuschränken.

Der Zugriff auf den Dienst kann über standardmäßige ASP.NET Core-Autorisierungserweiterungsmethoden wie z. B. AllowAnonymous und RequireAuthorization kontrolliert werden.

Wenn eine App beispielsweise so konfiguriert wurde, dass sie standardmäßig eine Autorisierung erfordert, konfigurieren Sie den gRPC-Endpunkt für Integritätsprüfungen mit AllowAnonymous, um die Authentifizierung und Autorisierung zu überspringen.

app.MapGrpcHealthChecksService().AllowAnonymous();

Konfigurieren von Grpc.AspNetCore.HealthChecks

Standardmäßig verwendet der gRPC-Integritätsüberprüfungsdienst alle registrierten Integritätsprüfungen, um den Integritätsstatus zu bestimmen. gRPC-Integritätsprüfungen können bei der Registrierung so angepasst werden, dass eine Teilmenge der Integritätsprüfungen verwendet wird. Die Methode MapService dient der Zuordnung von Integritätsergebnissen zu Dienstnamen und bietet außerdem ein Prädikat zu deren Filterung:

var builder = WebApplication.CreateBuilder(args);

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

var app = builder.Build();

Der vorstehende Code überschreibt den Standarddienst (""), um nur Integritätsergebnisse mit dem Tag „public“ zu verwenden.

gRPC-Integritätsprüfungen unterstützen den Client, der bei der Prüfung der Integrität ein Argument für den Dienstnamen angibt. Mehrere Dienste werden unterstützt, indem für MapService ein Dienstname angegeben wird:

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();

Der vom Client angegebene Dienstname ist in der Regel der Standardname ("") oder ein durch ein Paket qualifizierter Name eines Diensts in Ihrer App. Nichts hindert den Client jedoch daran, beliebige Werte zur Überprüfung der Anwendungsintegrität zu verwenden.

Konfigurieren des Ausführungsintervalls für Integritätsprüfungen

Integritätsprüfungen werden sofort ausgeführt, wenn Check aufgerufen wird. Watch ist eine Streamingmethode und weist ein anderes Verhalten als Check auf: Der zeitintensive Stream meldet Integritätsprüfungsergebnisse im Laufe der Zeit, indem er regelmäßig IHealthCheckPublisher ausführt, um Integritätsergebnisse zu sammeln. Standardmäßig macht der Herausgeber Folgendes:

  • Wartet 5 Sekunden nach dem Start der App, bevor Integritätsprüfungen ausgeführt werden.
  • Führt alle 30 Sekunden Integritätsprüfungen aus.

Herausgeberintervalle können beim Start mit HealthCheckPublisherOptions konfiguriert werden:

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

Aufrufen des gRPC-Integritätsüberprüfungsdiensts

Das Paket Grpc.HealthCheck enthält einen Client für gRPC-Integritätsprüfungen:

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

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

Es gibt zwei Methoden für den Health-Dienst:

  • Check ist eine unäre Methode zum Abrufen des aktuellen Integritätsstatus. Integritätsprüfungen werden sofort ausgeführt, wenn Check aufgerufen wird. Der Server gibt eine NOT_FOUND-Fehlerantwort zurück, wenn der Client einen unbekannten Dienstnamen anfordert. Dies kann beim Start der App passieren, wenn die Integritätsergebnisse noch nicht veröffentlicht wurden.
  • Watch ist eine Streamingmethode, die Änderungen im Integritätsstatus im Laufe der Zeit meldet. IHealthCheckPublisher wird regelmäßig ausgeführt, um Integritätsergebnisse zu sammeln. Der Server gibt einen Unknown-Status zurück, wenn der Client einen unbekannten Dienstnamen anfordert.

Der Grpc.HealthCheck-Client kann in einem Clientfactory-Ansatz verwendet werden:

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

Im vorherigen Beispiel wird eine Clientfactory für Health.HealthClient-Instanzen mit dem Abhängigkeitseinfügungssystem registriert. Anschließend werden diese Instanzen in Dienste zum Ausführen von Integritätsprüfungsaufrufen eingefügt.

Weitere Informationen finden Sie unter gRPC-Clientfactoryintegration in .NET.

Zusätzliche Ressourcen

Von James Newton-King

Das gRPC-Integritätsprüfungsprotokoll ist ein Standard zum Melden der Integrität von gRPC-Server-Apps.

Integritätsprüfungen werden von einer App als gRPC-Dienst verfügbar gemacht. Sie werden normalerweise mit einem externen Überwachungsdienst verwendet, der den Status einer App überprüft. Der Dienst kann für verschiedene Echtzeitüberwachungsszenarien konfiguriert werden:

  • Integritätstests können von Containerorchestratoren und Lastenausgleichsmodulen verwendet werden, um den Status einer App zu überprüfen. Kubernetes unterstützt zum Beispiel gRPC-Live-, Bereitschafts- und Starttests. Kubernetes kann so konfiguriert werden, dass der Datenverkehr umgeleitet wird oder fehlerhafte Container auf Grundlage der Ergebnisse der gRPC-Integritätsprüfung neu gestartet werden.
  • Die Nutzung von Arbeitsspeicher, Datenträgern und anderen physischen Serverressourcen kann auf einen fehlerfreien Status überwacht werden.
  • Integritätsprüfungen können die Abhängigkeiten einer App testen, wie z.B. Datenbanken und externe Dienstendpunkte, um Verfügbarkeit und normale Funktionsweise zu bestätigen.

Einrichten von gRPC-Integritätsprüfungen

gRPC in ASP.NET Core bietet mit dem Paket Grpc.AspNetCore.HealthChecks integrierte Unterstützung für gRPC-Integritätprüfungen. Ergebnisse von .NET-Integritätsprüfungen werden Aufrufern gemeldet.

So richten Sie gRPC-Integritätsprüfungen in einer App ein

  • Fügen Sie einen Grpc.AspNetCore.HealthChecks-Paketverweis hinzu.
  • Registrieren Sie den gRPC-Integritätsüberprüfungsdienst om Startup.cs:
    • AddGrpcHealthChecks zum Registrieren von Diensten, die die Integritätsprüfungen ermöglichen
    • MapGrpcHealthChecksService, um einen Dienstendpunkt für Integritätsprüfungen hinzuzufügen
  • Fügen Sie Integritätsprüfungen durch Implementieren von IHealthCheck oder Verwenden der Methode AddCheck hinzu.
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();
    });
}

Wenn Integritätsprüfungen eingerichtet sind:

  • Der Integritätsüberprüfungsdienst wird der Server-App hinzugefügt.
  • Bei der App registrierte .NET-Integritätsprüfungen werden regelmäßig ausgeführt. Standardmäßig gibt es eine Verzögerung von 5 Sekunden nach dem Start der App, und dann werden alle 30 Sekunden Integritätsprüfungen ausgeführt. Das Ausführungsintervall der Integritätsprüfung kann mit HealthCheckPublisherOptionsangepasst werden.
  • Die Ergebnisse bestimmen, was der gRPC-Dienst meldet:
    • Unknown wird gemeldet, wenn es keine Integritätsergebnisse gibt.
    • NotServing wird gemeldet, wenn es Integritätsergebnisse des Typs HealthStatus.Unhealthy gibt.
    • Andernfalls wird Serving gemeldet.

Konfigurieren von Grpc.AspNetCore.HealthChecks

Standardmäßig verwendet der gRPC-Integritätsüberprüfungsdienst alle registrierten Integritätsprüfungen, um den Integritätsstatus zu bestimmen. gRPC-Integritätsprüfungen können bei der Registrierung so angepasst werden, dass eine Teilmenge der Integritätsprüfungen verwendet wird. Die Methode MapService dient der Zuordnung von Integritätsergebnissen zu Dienstnamen und bietet außerdem ein Prädikat zu deren Filterung:

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

Der vorstehende Code überschreibt den Standarddienst (""), um nur Integritätsergebnisse mit dem Tag „public“ zu verwenden.

gRPC-Integritätsprüfungen unterstützen den Client, der bei der Prüfung der Integrität ein Argument für den Dienstnamen angibt. Mehrere Dienste werden unterstützt, indem für MapService ein Dienstname angegeben wird:

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

Der vom Client angegebene Dienstname ist in der Regel der Standardname ("") oder ein durch ein Paket qualifizierter Name eines Diensts in Ihrer App. Nichts hindert den Client jedoch daran, beliebige Werte zur Überprüfung der Anwendungsintegrität zu verwenden.

Konfigurieren des Ausführungsintervalls für Integritätsprüfungen

Integritätsprüfungen werden sofort ausgeführt, wenn Check aufgerufen wird. Watch ist eine Streamingmethode und weist ein anderes Verhalten als Check auf: Der zeitintensive Stream meldet Integritätsprüfungsergebnisse im Laufe der Zeit, indem er regelmäßig IHealthCheckPublisher ausführt, um Integritätsergebnisse zu sammeln. Standardmäßig macht der Herausgeber Folgendes:

  • Wartet 5 Sekunden nach dem Start der App, bevor Integritätsprüfungen ausgeführt werden.
  • Führt alle 30 Sekunden Integritätsprüfungen aus.

Herausgeberintervalle können beim Start mit HealthCheckPublisherOptions konfiguriert werden:

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

Aufrufen des gRPC-Integritätsüberprüfungsdiensts

Das Paket Grpc.HealthCheck enthält einen Client für gRPC-Integritätsprüfungen:

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

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

Es gibt zwei Methoden für den Health-Dienst:

  • Check ist eine unäre Methode zum Abrufen des aktuellen Integritätsstatus. Integritätsprüfungen werden sofort ausgeführt, wenn Check aufgerufen wird. Der Server gibt eine NOT_FOUND-Fehlerantwort zurück, wenn der Client einen unbekannten Dienstnamen anfordert. Dies kann beim Start der App passieren, wenn die Integritätsergebnisse noch nicht veröffentlicht wurden.
  • Watch ist eine Streamingmethode, die Änderungen im Integritätsstatus im Laufe der Zeit meldet. IHealthCheckPublisher wird regelmäßig ausgeführt, um Integritätsergebnisse zu sammeln. Der Server gibt einen Unknown-Status zurück, wenn der Client einen unbekannten Dienstnamen anfordert.

Zusätzliche Ressourcen