KeiStory

728x90
반응형

C# gRPC Interceptor 사용하기

 

C#에서 gRPC 인터셉터(Interceptor)는 gRPC 호출의 전송 과정에서 특정 작업을 수행하도록 RPC 호출을 가로챌 수 있습니다.

인터셉터는 클라이언트와 서버 양쪽에서 사용할 수 있으며, 메시지를 보내거나 받기 전에 추가적인 로직을 실행할 수 있게 해 줍니다.

이를 통해 개발자는 네트워크 통신 과정을 좀 더 투명하게 관리하고, 보안, 로깅, 메트릭 수집, 에러 핸들링 등의 기능을 통합할 수 있습니다.

 

* gRPC 인터셉터의 주요 사용 사례

로깅과 모니터링: 요청과 응답을 로그로 기록하여 시스템의 동작 상황을 모니터링할 수 있습니다.
인증과 권한 부여: 요청을 처리하기 전에 사용자의 인증 정보를 검사하고, 적절한 권한이 있는지 확인합니다.
메시지 검증: 들어오는 요청의 메시지를 검증하여 요구 사항을 충족하는지 확인합니다.
에러 핸들링: 예외 상황을 감지하고 공통된 방식으로 처리합니다.
메트릭과 추적: 요청 처리 시간, 사용량 통계 등을 측정하여 성능을 모니터링합니다.

 

* Interceptor 재정의 메서드

BlockingUnaryCall: 단항 RPC의 차단 호출을 가로챕니다.
AsyncUnaryCall: 단항 RPC의 비동기 호출을 가로챕니다.
AsyncClientStreamingCall: 클라이언트 스트리밍 RPC의 비동기 호출을 가로챕니다.
AsyncServerStreamingCall: 서버 스트리밍 RPC의 비동기 호출을 가로챕니다.
AsyncDuplexStreamingCall: 양방향 스트리밍 RPC의 비동기 호출을 가로챕니다.

 

인터셉터의 구현 예

Server 쪽에 아래처럼 Interceptor 를 구현합니다.

using Grpc.Core;
using Grpc.Core.Interceptors;

namespace GrpcServer
{
    public class ApiInterceptor : Interceptor
    {
        public override Task ServerStreamingServerHandler<TRequest, TResponse>(TRequest request, IServerStreamWriter<TResponse> responseStream, ServerCallContext context, ServerStreamingServerMethod<TRequest, TResponse> continuation)
        {
            // 옵션 설정 및 요청을 처리하기 전 로직

            var response = base.ServerStreamingServerHandler(request, responseStream, context, continuation);

            // 요청이 성공적으로 처리된 후 로직

            return response;
        }
    }
}

아래 포스팅에서 Streaming 에 대해서 다뤘는데 Streaming 에 대한 Interceptor 입니다.

2024.04.25 - [코딩/C#] - C# gRPC Streaming

 

Server 측 Program.cs 에 아래처럼 Interceptor 를 추가합니다.

builder.Services.AddGrpc(options =>
{
    options.Interceptors.Add<ApiInterceptor>();
});

 ApiInterceptor 에 중단을 걸고 실행해 보면 통신할 때 늘 중단이 걸리는 걸 확인할 수 있습니다.

 

gRPC 인터셉터는 네트워크 통신을 좀 더 유연하게 관리하고, 중요한 네트워크 이벤트를 처리하는 데 유용합니다. 이러한 기능은 특히 분산 시스템과 마이크로서비스 아키텍처에서 사용하면 좋습니다.

아래는 단일 요청 처리시 예시입니다.

public class ExampleInterceptor : Interceptor
{
    public override async Task<TResponse> UnaryServerHandler<TRequest, TResponse>(
        TRequest request,
        ServerCallContext context,
        UnaryServerMethod<TRequest, TResponse> continuation)
    {
        Console.WriteLine("Received a request.");
        try
        {
            // 요청을 처리하기 전 로직
            var response = await continuation(request, context);
            // 요청이 성공적으로 처리된 후 로직
            return response;
        }
        catch (Exception ex)
        {
            Console.WriteLine($"An error occurred: {ex.Message}");
            throw; // 예외를 다시 발생시켜 상위로 전달
        }
    }
}

 

참고

https://learn.microsoft.com/ko-kr/aspnet/core/grpc/interceptors?view=aspnetcore-8.0

 

.NET의 gRPC 인터셉터

.NET에서 gRPC 인터셉터를 사용하는 방법을 알아봅니다.

learn.microsoft.com

 

728x90

공유하기

facebook twitter kakaoTalk kakaostory naver band