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
C# grpc 에러 : "HttpRequestException: Unable to get subchannel from HttpRequestMessage." (0) | 2024.04.26 |
---|---|
C# gRPC Interceptor 에서 WriteOptions 옵션 변경하기 (0) | 2024.04.25 |
C# gRPC Streaming 에러 HTTP/2 INTERNAL_ERROR (0) | 2024.04.25 |
C# gRPC Streaming (0) | 2024.04.25 |
C# gRPC 를 이용해 Server와 Client 통신 처리하기 (0) | 2024.04.25 |