gRPC HealthCheck

2022. 12. 15. 00:00ASPNET/ASPNET 7

반응형

gRPC 상태를 검사하기 위한 방법이 있다. 

gRPC 상태 검사 프로토콜이 있고 이것은 server 앱의 상태를 보고하기 위한 표준이다.

 

 Grpc.AspNetCore.HealthChecks 패키지에서 gRPC 상태 검사를 기본적으로 지원한다.

.NET 상태 검사의 결과는 호출자에게 보고한다. 

 

gRPC 상태 검사 설정

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

 

gRPC service 프로젝트를 만듭니다. 

 

https://yogingang.tistory.com/230

 

grpc with aspnet core

aspnet core 를 통해 grpc server 를 생성 할 수 있다. Protos/greet.proto 수정 syntax = "proto3"; option csharp_namespace = "GrpcInterface"; //

yogingang.tistory.com

 

다음과 같이 nuget package 를 추가 합니다. 

dotnet add package Grpc.AspNetCore.HealthChecks

Program.cs 를 다음과 같이 변경합니다. 

using GrpcHealthCheck.Services;
using Microsoft.Extensions.Diagnostics.HealthChecks;

var builder = WebApplication.CreateBuilder(args);

// Additional configuration is required to successfully run gRPC on macOS.
// For instructions on how to configure Kestrel and gRPC clients on macOS, visit https://go.microsoft.com/fwlink/?linkid=2099682

// Add services to the container.
builder.Services.AddGrpc();
builder.Services.AddGrpcHealthChecks()
                .AddCheck("Sample", () => HealthCheckResult.Healthy());

var app = builder.Build();

// Configure the HTTP request pipeline.
app.MapGrpcService<GreeterService>();
app.MapGet("/", () => "Communication with gRPC endpoints must be made through a gRPC client. To learn how to create a client, visit: https://go.microsoft.com/fwlink/?linkid=2086909");

app.MapGrpcHealthChecksService();

app.Run();

 

이제 client 를 생성 하여 다음과 같은 코드를 만듭니다. 

두가지 package 를 추가 합니다. 

dotnet add package Grpc.HealthCheck
dotnet add package Grpc.Net.Client

Program.cs 를 변경하세요

using Grpc.Core;
using Grpc.Health.V1;
using Grpc.Net.Client;

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

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

check 가 아닌 watch 를 이용하는 방법도 있다. 

using Grpc.Core;
using Grpc.Health.V1;
using Grpc.Net.Client;

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

    var response = client.Watch(new HealthCheckRequest());
    var cancelToken = new CancellationToken();
    while (await response.ResponseStream.MoveNext(cancelToken))
    {
        Console.WriteLine("Into while loop");
        var current = response.ResponseStream.Current;
        Console.WriteLine($"{current.Status}");
    }
}
catch (RpcException ex)
{
    Console.WriteLine($"Error: {{Code: {ex.StatusCode}, Status: {ex.Status.Detail}}}");
}

 

여러가지 옵션이 있지만 그중에서도 상태 검사 실행 간격을 구성할 수 있다. 

서버쪽에서 다음과 같이 설정한다. 

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

 

관련영상

https://youtu.be/7IzGZ6xenD4

 

 

반응형