다음을 통해 공유


ASP.NET Core의 gRPC 상태 검사

참고 항목

이 문서의 최신 버전은 아닙니다. 현재 릴리스는 이 문서의 .NET 8 버전을 참조 하세요.

Warning

이 버전의 ASP.NET Core는 더 이상 지원되지 않습니다. 자세한 내용은 .NET 및 .NET Core 지원 정책을 참조 하세요. 현재 릴리스는 이 문서의 .NET 8 버전을 참조 하세요.

Important

이 정보는 상업적으로 출시되기 전에 실질적으로 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적, 또는 묵시적인 보증을 하지 않습니다.

현재 릴리스는 이 문서의 .NET 8 버전을 참조 하세요.

작성자: 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 상태 검사는 중요한 정보일 수 있는 앱에 대한 상태를 반환합니다. gRPC 상태 검사 서비스에 대한 액세스를 제한하려면 주의해야 합니다.

서비스에 대한 액세스는 표준 ASP.NET Core 권한 부여 확장 방법(예: AllowAnonymousRequireAuthorization)을 통해 제어할 수 있습니다.

예를 들어 앱이 기본적으로 권한 부여를 요구하도록 구성된 경우 인증 및 권한 부여를 건너뛰도록 gRPC 상태 검사 엔드포인트를 AllowAnonymous 구성합니다.

app.MapGrpcHealthChecksService().AllowAnonymous();

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 상태 검사 서비스를 등록합니다.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 상태를 반환합니다.

추가 리소스