다음을 통해 공유


ASP.NET Core의 gRPC 상태 검사

작성자: James Newton-King

gRPC 상태 검사 프로토콜은 gRPC 서버 앱의 상태를 보고하기 위한 표준입니다.

상태 검사는 앱에 의해 gRPC 서비스로 노출됩니다. 일반적으로 외부 모니터링 서비스와 함께 앱의 상태 검사 데 사용됩니다. 이 서비스는 다양한 실시간 모니터링 시나리오에 맞게 구성할 수 있습니다.

  • 상태 프로브는 컨테이너 오케스트레이터와 부하 분산 장치가 앱 상태를 검사하는 데 사용할 수 있습니다. 예를 들어 Kubernetes는 gRPC 활동성, 준비 상태 및 시작 프로브를 지원합니다. gRPC 상태 검사 결과에 따라 트래픽을 다시 라우팅하거나 비정상 컨테이너를 다시 시작하도록 Kubernetes를 구성할 수 있습니다.
  • 메모리, 디스크 및 기타 물리적 서버 리소스의 사용이 정상적인 상태인지 모니터링할 수 있습니다.
  • 상태 검사는 데이터베이스 및 외부 서비스 엔드포인트와 같은 앱 종속성을 테스트하여 가용성 및 정상 작동 여부를 확인할 수 있습니다.

gRPC 상태 검사 설정

gRPC ASP.NET Core는 Grpc.AspNetCore.HealthChecks 패키지에서 gRPC 상태 검사를 기본적으로 지원합니다. .NET 상태 검사의 결과는 호출자에게 보고됩니다.

앱에서 gRPC 상태 검사를 설정하려면

  • Grpc.AspNetCore.HealthChecks 패키지 참조를 추가합니다.
  • gRPC 상태 검사 서비스를 등록합니다.
    • AddGrpcHealthChecks - 상태 검사를 사용하는 서비스를 등록합니다.
    • MapGrpcHealthChecksService - 상태 검사 서비스 엔드포인트를 추가합니다.
  • IHealthCheck를 구현하거나 AddCheck 메서드를 사용하여 상태 검사를 추가합니다.
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.

상태 검사가 설정된 경우:

  • 상태 검사 서비스가 서버 앱에 추가됩니다.
  • 앱에 등록된 .NET 상태 검사는 주기적으로 실행되어 상태 결과를 가져옵니다. 기본적으로 앱 시작 후 5초 지연이 발생하며 상태 검사 30초마다 실행됩니다. 상태 검사 실행 간격은 HealthCheckPublisherOptions를 사용하여 사용자 지정할 수 있습니다.
  • 상태 결과에 따라 gRPC 서비스가 보고하는 내용이 결정됩니다.
    • 상태 결과가 없으면 Unknown를 보고합니다.
    • 상태 결과가 HealthStatus.Unhealthy이면 NotServing을 보고합니다.
    • 그렇지 않으면 Serving을 보고합니다.

Grpc.AspNetCore.HealthChecks 구성

기본적으로 gRPC 상태 검사 서비스는 등록된 모든 상태 검사를 사용하여 상태를 확인합니다. 상태 검사의 하위 집합을 사용하도록 등록할 경우 gRPC 상태 검사를 사용자 지정할 수 있습니다. MapService 메서드는 상태 결과를 필터링하기 위한 조건자와 함께 상태 결과를 서비스 이름에 매핑하는 데 사용됩니다.

var builder = WebApplication.CreateBuilder(args);

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

var app = builder.Build();

위의 코드는 기본 서비스("")를 재정의하여 "public" 태그가 있는 상태 결과만 사용합니다.

gRPC 상태 검사는 클라이언트가 상태를 확인할 때 서비스 이름 인수를 지정하도록 지원합니다. 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();

클라이언트에서 지정한 서비스 이름은 일반적으로 앱에서 서비스의 기본("") 또는 패키지 정규화된 이름입니다. 그러나 클라이언트는 임의의 값을 사용하여 앱 상태를 확인할 수 있습니다.

상태 검사 실행 간격 구성

상태 검사 호출되면 즉시 Check 실행됩니다. Watch는 스트리밍 메서드이며 다른 동작Check을 가집니다. 장기 실행 스트림은 상태 결과를 수집하기 위해 주기적으로 실행하여 IHealthCheckPublisher 시간에 따른 상태 검사 결과를 보고합니다. 기본적으로 게시자는 다음을 수행합니다.

  • 상태 검사 실행하기 전에 앱 시작 후 5초 동안 기다립니다.
  • 30초마다 상태 검사 실행합니다.

시작 시 HealthCheckPublisherOptions를 사용하여 게시자 간격을 구성할 수 있습니다.

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

gRPC 상태 검사 서비스 호출

Grpc.HealthCheck 패키지에는 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;

Health 서비스에는 다음 두 가지 메서드가 있습니다.

  • Check는 현재 상태를 가져오기 위한 단항 메서드입니다. 상태 검사 호출될 때 Check 즉시 실행됩니다. 클라이언트가 알 수 없는 서비스 이름을 요청하는 경우 서버는 NOT_FOUND 오류 응답을 반환합니다. 이는 앱 시작 시 상태 결과가 아직 게시되지 않은 경우 발생할 수 있습니다.
  • Watch는 상태의 경시적 변화를 보고하는 스트리밍 메서드입니다. IHealthCheckPublisher 는 주기적으로 실행되어 상태 결과를 수집합니다. 클라이언트가 알 수 없는 서비스 이름을 요청하는 경우 서버는 Unknown 상태를 반환합니다.

클라이언트 팩터 Grpc.HealthCheck 리 접근 방식에서 클라이언트를 사용할 수 있습니다.

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

이전 예제에서 인스턴스에 대한 Health.HealthClient 클라이언트 팩터리는 종속성 주입 시스템에 등록됩니다. 그런 다음, 이러한 인스턴스는 상태 검사 호출을 실행하기 위해 서비스에 삽입됩니다.

자세한 내용은 .NET의 gRPC 클라이언트 팩터리 통합을 참조하세요.

추가 리소스

작성자: James Newton-King

gRPC 상태 검사 프로토콜은 gRPC 서버 앱의 상태를 보고하기 위한 표준입니다.

상태 검사는 앱에 의해 gRPC 서비스로 노출됩니다. 일반적으로 외부 모니터링 서비스와 함께 앱의 상태를 확인하는 데 사용됩니다. 이 서비스는 다양한 실시간 모니터링 시나리오에 맞게 구성할 수 있습니다.

  • 상태 프로브는 컨테이너 오케스트레이터와 부하 분산 장치가 앱 상태를 검사하는 데 사용할 수 있습니다. 예를 들어 Kubernetes는 gRPC 활동성, 준비 상태 및 시작 프로브를 지원합니다. gRPC 상태 검사 결과에 따라 트래픽을 다시 라우팅하거나 비정상 컨테이너를 다시 시작하도록 Kubernetes를 구성할 수 있습니다.
  • 메모리, 디스크 및 기타 물리적 서버 리소스의 사용이 정상적인 상태인지 모니터링할 수 있습니다.
  • 상태 검사는 데이터베이스 및 외부 서비스 엔드포인트와 같은 앱 종속성을 테스트하여 가용성 및 정상 작동 여부를 확인할 수 있습니다.

gRPC 상태 검사 설정

gRPC ASP.NET Core는 Grpc.AspNetCore.HealthChecks 패키지에서 gRPC 상태 검사를 기본적으로 지원합니다. .NET 상태 검사의 결과는 호출자에게 보고됩니다.

앱에서 gRPC 상태 검사를 설정하려면

  • Grpc.AspNetCore.HealthChecks 패키지 참조를 추가합니다.
  • 다음에서 gRPC 상태 검사s 서비스를 등록합니다.Startup.cs
    • AddGrpcHealthChecks - 상태 검사를 사용하는 서비스를 등록합니다.
    • MapGrpcHealthChecksService - 상태 검사 서비스 엔드포인트를 추가합니다.
  • IHealthCheck를 구현하거나 AddCheck 메서드를 사용하여 상태 검사를 추가합니다.
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();
    });
}

상태 검사가 설정된 경우:

  • 상태 검사 서비스가 서버 앱에 추가됩니다.
  • 앱에 등록된 .NET 상태 검사는 주기적으로 실행되어 상태 결과를 가져옵니다. 기본적으로 앱 시작 후 5초간 지연이 발생하며 30초마다 상태 검사가 실행됩니다. 상태 검사 실행 간격은 HealthCheckPublisherOptions를 사용하여 사용자 지정할 수 있습니다.
  • 상태 결과에 따라 gRPC 서비스가 보고하는 내용이 결정됩니다.
    • 상태 결과가 없으면 Unknown를 보고합니다.
    • 상태 결과가 HealthStatus.Unhealthy이면 NotServing을 보고합니다.
    • 그렇지 않으면 Serving을 보고합니다.

Grpc.AspNetCore.HealthChecks 구성

기본적으로 gRPC 상태 검사 서비스는 등록된 모든 상태 검사를 사용하여 상태를 확인합니다. 상태 검사의 하위 집합을 사용하도록 등록할 경우 gRPC 상태 검사를 사용자 지정할 수 있습니다. MapService 메서드는 상태 결과를 필터링하기 위한 조건자와 함께 상태 결과를 서비스 이름에 매핑하는 데 사용됩니다.

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

위의 코드는 기본 서비스("")를 재정의하여 "public" 태그가 있는 상태 결과만 사용합니다.

gRPC 상태 검사는 클라이언트가 상태를 확인할 때 서비스 이름 인수를 지정하도록 지원합니다. MapService에 서비스 이름을 제공하면 여러 서비스가 지원됩니다.

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

클라이언트에서 지정한 서비스 이름은 일반적으로 앱에서 서비스의 기본("") 또는 패키지 정규화된 이름입니다. 그러나 클라이언트는 임의의 값을 사용하여 앱 상태를 확인할 수 있습니다.

상태 검사 실행 간격 구성

상태 검사 호출되면 즉시 Check 실행됩니다. Watch는 스트리밍 메서드이며 다른 동작Check을 가집니다. 장기 실행 스트림은 상태 결과를 수집하기 위해 주기적으로 실행하여 IHealthCheckPublisher 시간에 따른 상태 검사 결과를 보고합니다. 기본적으로 게시자는 다음을 수행합니다.

  • 상태 검사 실행하기 전에 앱 시작 후 5초 동안 기다립니다.
  • 30초마다 상태 검사 실행합니다.

시작 시 HealthCheckPublisherOptions를 사용하여 게시자 간격을 구성할 수 있습니다.

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

gRPC 상태 검사 서비스 호출

Grpc.HealthCheck 패키지에는 gRPC 상태 검사를 위한 클라이언트가 포함되어 있습니다.

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

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

Health 서비스에는 다음 두 가지 메서드가 있습니다.

  • Check는 현재 상태를 가져오기 위한 단항 메서드입니다. 상태 검사 호출될 때 Check 즉시 실행됩니다. 클라이언트가 알 수 없는 서비스 이름을 요청하는 경우 서버는 NOT_FOUND 오류 응답을 반환합니다. 이는 앱 시작 시 상태 결과가 아직 게시되지 않은 경우 발생할 수 있습니다.
  • Watch는 상태의 경시적 변화를 보고하는 스트리밍 메서드입니다. IHealthCheckPublisher 는 주기적으로 실행되어 상태 결과를 수집합니다. 클라이언트가 알 수 없는 서비스 이름을 요청하는 경우 서버는 Unknown 상태를 반환합니다.

추가 리소스