[gRPC] gRPC 서버 측 인터셉터
- C#
- 2023. 3. 2. 00:43
참고
서버 측 인터셉터
- 클라이언트가 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
'C#' 카테고리의 다른 글
[C#] EF Core - Configurations (0) | 2023.03.09 |
---|---|
[C#] EF Core 마이그레이션을 위한 패키지 관리자 콘솔 명령 (0) | 2023.03.03 |
[C#] 커맨드 패턴 (0) | 2023.03.01 |
DevExpress Chart 기능 POC - Annotation 표시 방법 1 (0) | 2023.02.28 |
[C#] 도메인 주도 설계 - 데이터의 무결성 유지하기 (0) | 2023.02.27 |
이 글을 공유하기