[gRPC] gRPC 서버 측 인터셉터

참고


서버 측 인터셉터

  • 클라이언트가 gRPC 서비스의 원격 메서드를 호출할 떄 서버에서 인터셉터를 사용해 원격 메서드 실행 전에 공통 로직을 실행할 수 있습니다.
  • 이는 원격 메서드를 호출하기 전에 인증과 같은 특정 기능을 적용해야 할 떄 도움이 됩니다.
  • 아래 그림과 같이 개발 중인 gRPC 서버에 하나 이상의 인터셉터를 연결할 수 있습니다.
  • 예를 들어 새로운 서버 측 인터셉터를 OrderManagement gRPC 서비스에 연결하고자 인터셉터를 구현하고 gRPC 서버를 만들 때 인터셉터를 등록합니다.
  • 서버에서 단순 인터셉터를 사용하면 단순 RPC 호출을 인터셉트 할 수 있으며, 스트리밍 인터셉터는 스트리밍 RPC를 인터셉트 할 수 있습니다.


단일 인터셉터

  • 서버에서 gRPC 서비스의 단일 RPC를 가로채려면 gRPC 서버에 단일 인터셉터를 구현해야 합니다.
  • 저는 C# 코드를 이용한 gRPC 인터셉터 코드를 작성해 보도록 하겠습니다.
  • 먼저 .NET gRPC InterCeptor 에서 Server 측은 총 4개의 재정의 메서드를 제공합니다.
    • UnaryServerHandler : 단항 RPC를 가로챕니다.
    • ClientStreamingServerHandler : 클라이언트 스트리밍 RPC를 가로챕니다.
    • ServerStreamingServerHandler : 서버 스트리밍 RPC를 가로챕니다.
    • DuplexStreamingServerHandler " 양방향 스트리밍 RPC를 가로챕니다.

ASP.NET gRPC 서비스 프로젝트 생성

  • gRPC 서버를 생성하기 위해서, ASP.NET gRPC 서비스 프로젝트 하나를 생성합니다.


인터셉트 로깅 클래스 생성

  • 다음으로, Client 가 Server 로 요청을 보낼 때 먼저 인터셉트하여 로깅하는 로깅 인터셉트 클래스를 생성합니다.
  • ServerLoggingInterceptor.cs 하나 생성하고 아래와 같이 코드를 작성합니다.
using Grpc.Core;
using Grpc.Core.Interceptors;

namespace gRPCInterceptor.Services
{
    public class ServerLoggingInterceptor : Interceptor
    {
        private readonly ILogger _logger;

        public ServerLoggingInterceptor(ILogger<ServerLoggingInterceptor> logger)
        {
            _logger = logger;
        }

        public override async Task<TResponse> UnaryServerHandler<TRequest, TResponse>(TRequest request, ServerCallContext context, UnaryServerMethod<TRequest, TResponse> continuation)
        {
            _logger.LogInformation($"Starting receiving call. Type: {MethodType.Unary}. " +
            $"Method: {context.Method}.");
            try
            {
                return await continuation(request, context);
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, $"Error thrown by {context.Method}.");
                throw;
            }
        }
    }
}

서비스 추가

  • 다음으로, 서버 인터셉터 구성을 추가해주어야 합니다.
  • 앞서 ServerLoggingInterceptor 를 추가하였습니다. 해당 인터셉터를 서비스에 추가해 보도록 하겠습니다.
  • Program.cs 에 아래 코드를 추가해 주시면 됩니다.
  • AddGrpc 메서드에 Interceptors 옵션을 추가해서 인터셉터 서비스를 추가해 주면 됩니다.
// Add services to the container.
builder.Services.AddGrpc(options =>
{
    options.Interceptors.Add<ServerLoggingInterceptor>();
});
  • 여기까지 작성하였다면, 서버 측 단일 인터셉터 작성은 완료 된 것입니다.
728x90

이 글을 공유하기

댓글

Designed by JB FACTORY