.NET용 gRPC 구성

서비스 옵션 구성

gRPC 서비스는 .에서 Startup.cs구성 AddGrpc 됩니다. 구성 옵션은 Grpc.AspNetCore.Server 패키지에 있습니다.

다음 표에서는 gRPC 서비스를 구성하기 위한 옵션을 설명합니다.

옵션 기본값 설명
MaxSendMessageSize null 서버에서 보낼 수 있는 최대 메시지 크기(바이트)입니다. 구성된 최대 메시지 크기를 초과하는 메시지를 전송하려고 하면 예외가 발생합니다. null로 설정하면 메시지 크기의 제한이 없습니다.
MaxReceiveMessageSize 4MB 서버에서 받을 수 있는 최대 메시지 크기(바이트)입니다. 서버에서 이 한도를 초과하는 메시지를 수신하면 예외가 throw됩니다. 이 값을 늘리면 서버가 더 큰 메시지를 받을 수 있지만 메모리 사용에 부정적인 영향을 줄 수 있습니다. null로 설정하면 메시지 크기의 제한이 없습니다.
EnableDetailedErrors false true인 경우 서비스 메서드에서 예외가 throw되면 자세한 예외 메시지가 클라이언트에 반환됩니다. 기본값은 false입니다. EnableDetailedErrorstrue로 설정하면 중요한 정보가 노출될 수 있습니다.
CompressionProviders gzip 메시지를 압축하고 압축을 푸는 데 사용되는 압축 공급자의 컬렉션입니다. 사용자 지정 압축 공급자를 만들어 컬렉션에 추가할 수 있습니다. 구성된 기본 공급자는 gzip 압축을 지원합니다.
ResponseCompressionAlgorithm null 서버에서 보낸 메시지를 압축하는 데 사용되는 압축 알고리즘입니다. 이 알고리즘은 CompressionProviders의 압축 공급자와 일치해야 합니다. 이 알고리즘이 응답을 압축하려면 클라이언트는 grpc-accept-encoding 헤더에 전송하여 알고리즘을 지원한다는 사실을 표시해야 합니다.
ResponseCompressionLevel null 서버에서 보낸 메시지를 압축하는 데 사용되는 압축 수준입니다.
Interceptors 없음 각 gRPC 호출을 사용하여 실행되는 인터셉터의 컬렉션입니다. 인터셉터는 등록된 순서대로 실행됩니다. 전역적으로 구성된 인터셉터는 단일 서비스에 대해 구성된 인터셉터보다 먼저 실행됩니다.

인터셉터에는 기본적으로 요청당 수명이 있습니다. 인터셉터 생성자가 호출되고 매개 변수가 DI(종속성 주입)에서 확인됩니다. 인터셉터 형식을 DI에 등록하여 생성 방법 및 수명을 재정의할 수도 있습니다.

인터셉터는 ASP.NET Core 미들웨어와 비교할 때 비슷한 기능을 제공합니다. 자세한 내용은 gRPC 인터셉터 대 미들웨어를 참조하세요.
IgnoreUnknownServices false true인 경우 알 수 없는 서비스 및 메서드에 대한 호출이 UNIMPLEMENTED 상태를 반환하지 않고 요청이 ASP.NET Core에서 등록된 다음 미들웨어에 전달됩니다.

Startup.ConfigureServices에서 AddGrpc 호출에 옵션 대리자를 제공하여 모든 서비스에 대해 옵션을 구성할 수 있습니다.

public void ConfigureServices(IServiceCollection services)
{
    services.AddGrpc(options =>
    {
        options.EnableDetailedErrors = true;
        options.MaxReceiveMessageSize = 2 * 1024 * 1024; // 2 MB
        options.MaxSendMessageSize = 5 * 1024 * 1024; // 5 MB
    });
}

단일 서비스에 대한 옵션은 AddGrpc에 제공된 전역 옵션을 재정의하며 AddServiceOptions<TService>를 사용하여 구성할 수 있습니다.

public void ConfigureServices(IServiceCollection services)
{
    services.AddGrpc().AddServiceOptions<MyService>(options =>
    {
        options.MaxReceiveMessageSize = 2 * 1024 * 1024; // 2 MB
        options.MaxSendMessageSize = 5 * 1024 * 1024; // 5 MB
    });
}

서비스 인터셉터에는 기본적으로 요청당 수명이 있습니다. 인터셉터 형식을 DI에 등록하면 인터셉터 생성 방법 및 수명이 재정의됩니다.

public void ConfigureServices(IServiceCollection services)
{
    services.AddGrpc(options =>
    {
        options.Interceptors.Add<LoggingInterceptor>();
    });
    services.AddSingleton<LoggingInterceptor>();
}

ASP.NET Core 서버 옵션

Grpc.AspNetCore.Server는 ASP.NET Core 웹 서버에서 호스팅됩니다. ASP.NET Core 서버에는 Kestrel, IIS, HTTP.sys를 포함하여 다양한 옵션이 있습니다. 각 서버는 HTTP 요청을 제공하는 방법에 대한 추가 옵션을 제공합니다.

ASP.NET Core 앱에서 사용하는 서버는 앱 시작 코드에서 구성됩니다. 기본 서버는 Kestrel입니다.

다양한 서버 및 해당 구성 옵션에 대한 자세한 내용은 다음을 참조하세요.

클라이언트 옵션 구성

gRPC 클라이언트 구성은 GrpcChannelOptions에 설정되어 있습니다. 구성 옵션은 Grpc.Net.Client 패키지에 있습니다.

다음 표에서는 gRPC 채널을 구성하기 위한 옵션을 설명합니다.

옵션 기본값 설명
HttpHandler 새 인스턴스 gRPC를 호출하는 데 사용되는 HttpMessageHandler입니다. 사용자 지정 HttpClientHandler를 구성하거나 gRPC 호출을 위해 HTTP 파이프라인에 추가 처리기를 추가하도록 클라이언트를 설정할 수 있습니다. 지정된 HttpMessageHandler가 없으면 채널에 새 HttpClientHandler 인스턴스가 만들어집니다(자동으로 삭제됨).
HttpClient null gRPC를 호출하는 데 사용되는 HttpClient입니다. 이 설정은 HttpHandler의 대안입니다.
DisposeHttpClient false true로 설정되고 HttpMessageHandler 또는 HttpClient가 지정된 경우 GrpcChannel이 삭제될 때 HttpHandler 또는 HttpClient가 삭제됩니다.
LoggerFactory null 클라이언트에서 gRPC 호출에 대한 정보를 기록하는 데 사용되는 LoggerFactory입니다. LoggerFactory 인스턴스는 종속성 주입을 통해 확인되거나 LoggerFactory.Create를 사용하여 만들 수 있습니다. 로깅 구성 예제는 .NET의 gRPC에서 로깅 및 진단을 참조하세요.
MaxSendMessageSize null 클라이언트에서 보낼 수 있는 최대 메시지 크기(바이트)입니다. 구성된 최대 메시지 크기를 초과하는 메시지를 전송하려고 하면 예외가 발생합니다. null로 설정하면 메시지 크기의 제한이 없습니다.
MaxReceiveMessageSize 4MB 클라이언트에서 받을 수 있는 최대 메시지 크기(바이트)입니다. 클라이언트에서 이 한도를 초과하는 메시지를 수신하면 예외가 throw됩니다. 이 값을 늘리면 클라이언트가 더 큰 메시지를 받을 수 있지만 메모리 사용에 부정적인 영향을 줄 수 있습니다. null로 설정하면 메시지 크기의 제한이 없습니다.
Credentials null ChannelCredentials 인스턴스입니다. 자격 증명은 gRPC 호출에 인증 메타데이터를 추가하는 데 사용됩니다.
CompressionProviders gzip 메시지를 압축하고 압축을 푸는 데 사용되는 압축 공급자의 컬렉션입니다. 사용자 지정 압축 공급자를 만들어 컬렉션에 추가할 수 있습니다. 구성된 기본 공급자는 gzip 압축을 지원합니다.
ThrowOperationCanceledOnCancellation false true로 설정된 경우 호출이 취소되었거나 기한이 지났으면 클라이언트가 OperationCanceledException을 throw합니다.
UnsafeUseInsecureChannelCallCredentials false true로 설정된 경우 CallCredentials가 안전하지 않은 채널에서 수행한 gRPC 호출에 적용됩니다. 안전하지 않은 연결을 통해 인증 헤더를 전송할 경우 보안에 영향이 있으므로 프로덕션 환경에서는 삼가야 합니다.
MaxRetryAttempts 5 최대 다시 시도 횟수입니다. 이 값은 서비스 구성에 지정된 재시도 및 헤징 시도 값을 제한합니다. 이 값만 설정해도 재시도는 활성화되지 않습니다. 서비스 구성에서 다시 시도를 사용하도록 설정하는데, 이는 ServiceConfig를 사용하여 수행할 수 있습니다. null 값은 최대 다시 시도 횟수 제한을 제거합니다. 재시도에 대한 자세한 내용은 gRPC 재시도를 통해 일시적인 오류 처리를 참조하세요.
MaxRetryBufferSize 16MB 호출을 다시 시도하거나 hedging할 때 전송된 메시지를 저장하는 데 사용할 수 있는 최대 버퍼 크기(바이트)입니다. 버퍼 제한을 초과하면 더 이상 다시 시도가 수행되지 않고 hedging 호출이 하나만 제외하고 모두 취소됩니다. 이 제한은 채널을 사용하여 수행된 모든 호출에 적용됩니다. null 값은 최대 다시 시도 버퍼 크기 제한을 제거합니다.
MaxRetryBufferPerCallSize 1MB 호출을 다시 시도하거나 hedging할 때 전송된 메시지를 저장하는 데 사용할 수 있는 최대 버퍼 크기(바이트)입니다. 버퍼 제한을 초과하면 더 이상 다시 시도가 수행되지 않고 hedging 호출이 하나만 제외하고 모두 취소됩니다. 이 제한은 하나의 호출에 적용됩니다. null 값은 호출당 최대 다시 시도 버퍼 크기 제한을 제거합니다.
ServiceConfig null gRPC 채널에 대한 서비스 구성입니다. 서비스 구성은 gRPC 다시 시도를 구성하는 데 사용할 수 있습니다.

코드는 다음과 같습니다.

  • 채널의 최대 송신 및 수신 메시지 크기를 설정합니다.
  • 클라이언트를 만듭니다.
static async Task Main(string[] args)
{
    var channel = GrpcChannel.ForAddress("https://localhost:5001", new GrpcChannelOptions
    {
        MaxReceiveMessageSize = 5 * 1024 * 1024, // 5 MB
        MaxSendMessageSize = 2 * 1024 * 1024 // 2 MB
    });
    var client = new Greeter.GreeterClient(channel);

    var reply = await client.SayHelloAsync(
                      new HelloRequest { Name = "GreeterClient" });
    Console.WriteLine("Greeting: " + reply.Message);
}

클라이언트 인터셉터는 GrpcChannelOptions를 사용하여 구성되지 않습니다. 대신, 클라이언트 인터셉터는 채널에 Intercept 확장 메서드를 사용하여 구성됩니다. 이 확장 메서드는 Grpc.Core.Interceptors 네임스페이스에 있습니다.

static async Task Main(string[] args)
{
    var channel = GrpcChannel.ForAddress("https://localhost:5001");
    var callInvoker = channel.Intercept(new LoggingInterceptor());
    var client = new Greeter.GreeterClient(callInvoker);

    var reply = await client.SayHelloAsync(
                      new HelloRequest { Name = "GreeterClient" });
    Console.WriteLine("Greeting: " + reply.Message);
}

System.Net 처리기 옵션

Grpc.Net.ClientHttpMessageHandler에서 파생된 HTTP 전송을 사용하여 HTTP 요청을 만듭니다. 각 처리기는 HTTP 요청이 이루어지는 방법에 대한 추가 옵션을 제공합니다.

처리기는 채널에서 구성되며 GrpcChannelOptions.HttpHandler를 설정하여 재정의할 수 있습니다. .NET Core 3 및 .NET 5 이상은 기본적으로 SocketsHttpHandler를 사용합니다. .NET Framework gRPC 클라이언트 앱은 WinHttpHandler를 구성해야 합니다.

다양한 처리기 및 해당 구성 옵션에 대한 자세한 내용은 다음을 참조하세요.

추가 리소스