C Core에서 .NET용 gRPC로 gRPC 마이그레이션

기본 스택의 구현 때문에 일부 기능은 C Core 기반 gRPC 앱과 .NET용 gRPC 간에 동일한 방식으로 작동하지 않습니다. 이 문서에서는 두 스택 간의 마이그레이션을 위해 주요 차이점을 설명합니다.

Important

gRPC C Core는 유지 관리 모드이며 .NET용 gRPC 때문에 사용 중단될 예정입니다. 새 앱에는 gRPC C-core를 사용하지 않는 것이 좋습니다.

플랫폼 지원

gRPC C Core와 .NET용 gRPC는 서로 다른 플랫폼을 지원합니다.

  • gRPC C Core: 자체 TLS 및 HTTP/2 스택을 사용하는 C++ gRPC 구현입니다. Grpc.Core 패키지는 gRPC C Core를 중심으로 하는 .NET 래퍼로, gRPC 클라이언트 및 서버가 포함되어 있습니다. .NET Framework, .NET Core 및 .NET 5 이상을 지원합니다.
  • .NET용 gRPC: .NET Core 3.x 및 .NET 5 이상용으로 설계되었습니다. 최신 .NET 릴리스에 기본 제공되는 TLS 및 HTTP/2 스택을 사용합니다. Grpc.AspNetCore 패키지에는 ASP.NET Core에서 호스트되고 .NET Core 3.x 또는 .NET 5 이상이 필요한 gRPC 서버가 포함되어 있습니다. Grpc.Net.Client 패키지에는 gRPC 클라이언트가 포함되어 있습니다. Grpc.Net.Client의 클라이언트는 WinHttpHandler를 사용하여 .NET Framework를 제한적으로 지원합니다.

자세한 내용은 .NET의 gRPC에 지원되는 플랫폼을 참조하세요.

서버 및 채널 구성

NuGet 패키지, 구성 및 시작 코드는 gRPC C-Core에서 .NET용 gRPC로 마이그레이션할 때 수정해야 합니다.

.NET용 gRPC에는 클라이언트 및 서버에 대한 별도의 NuGet 패키지가 있습니다. 추가되는 패키지는 앱이 gRPC 서비스를 호스트하는지 또는 호출하는지에 따라 달라집니다.

마이그레이션이 완료되면 앱에서 Grpc.Core 패키지를 제거해야 합니다. Grpc.Core에는 큰 네이티브 이진 파일이 포함되어 있으므로 패키지를 제거하면 NuGet 복원 시간과 앱 크기가 줄어듭니다.

코드 생성 서비스 및 클라이언트

gRPC C-Core 및 .NET용 gRPC는 많은 API를 공유하며 .proto 파일에서 생성된 코드는 두 gRPC 구현과 호환됩니다. 대부분의 클라이언트 및 서비스는 변경 없이 C-Core에서 .NET용 gRPC로 마이그레이션할 수 있습니다.

gRPC 서비스 구현 수명

ASP.NET Core 스택에서 gRPC 서비스는 기본적으로 범위가 지정된 수명을 사용하여 생성됩니다. 반면, gRPC C Core는 기본적으로 singleton 수명을 사용하여 서비스에 바인딩됩니다.

범위가 지정된 수명을 사용하면 서비스 구현에서 범위가 지정된 수명을 사용하는 다른 서비스를 확인할 수 있습니다. 예를 들어 범위가 지정된 수명이 생성자 주입을 통해 DI 컨테이너에서 DbContext를 확인할 수도 있습니다. 범위가 지정된 수명 사용과 관련해서 다음 사항을 확인합니다.

  • 각 요청에 대해 서비스 구현의 새 인스턴스가 생성됩니다.
  • 구현 형식의 인스턴스 멤버를 통해 요청 간에 상태를 공유할 수 없습니다.
  • DI 컨테이너의 단일 서비스에 공유 상태를 저장해야 합니다. 저장된 공유 상태는 gRPC 서비스 구현의 생성자에서 확인됩니다.

서비스 수명에 대한 자세한 내용은 ASP.NET Core에서 종속성 주입을 참조하세요.

singleton 서비스 추가

gRPC C Core 구현에서 ASP.NET Core로 전환하기 쉽도록 서비스 구현의 서비스 수명을 범위가 지정된 수명에서 singleton 수명으로 변경할 수 있습니다. 여기에는 서비스 구현 인스턴스를 DI 컨테이너에 추가하는 작업이 포함됩니다.

public void ConfigureServices(IServiceCollection services)
{
    services.AddGrpc();
    services.AddSingleton(new GreeterService());
}

그러나 singleton 수명을 사용하는 서비스 구현은 이제 생성자 주입을 통해 범위가 지정된 서비스를 확인할 수 없습니다.

gRPC 서비스 옵션 구성

C Core 기반 앱에서 grpc.max_receive_message_length, grpc.max_send_message_length 등의 설정은 서버 인스턴스를 생성할 때 ChannelOption을 사용하여 구성합니다.

ASP.NET Core에서 gRPC는 GrpcServiceOptions 형식을 통해 구성을 제공합니다. 예를 들어 gRPC 서비스에서 들어오는 메시지의 최대 크기는 AddGrpc를 통해 구성할 수 있습니다. 다음 예제에서는 기본 MaxReceiveMessageSize인 4MB를 16MB로 변경합니다.

public void ConfigureServices(IServiceCollection services)
{
    services.AddGrpc(options =>
    {
        options.MaxReceiveMessageSize = 16 * 1024 * 1024; // 16 MB
    });
}

구성에 대한 자세한 내용은 .NET용 gRPC 구성을 참조하세요.

로깅

C Core 기반 앱은 GrpcEnvironment를 사용하여 디버깅 용도의 로거를 구성합니다. ASP.NET Core 스택은 로깅 API를 통해 이 기능을 제공합니다. 예를 들어 생성자 주입을 통해 gRPC 서비스에 로거를 추가할 수 있습니다.

public class GreeterService : Greeter.GreeterBase
{
    public GreeterService(ILogger<GreeterService> logger)
    {
    }
}

gRPC 로깅 및 진단에 대한 자세한 내용은 .NET의 gRPC에서 로깅 및 진단을 참조하세요.

HTTPS

C Core 기반 앱은 Server.Ports 속성을 통해 HTTPS를 구성합니다. ASP.NET Core에서 서버를 구성하는 경우에도 유사한 개념이 사용됩니다. 예를 들어 Kestrel은 이 기능을 위해 엔드포인트 구성을 사용합니다.

C Core 기반 앱은 Server.Ports 속성을 통해 HTTPS를 구성합니다. ASP.NET Core에서 서버를 구성하는 경우에도 유사한 개념이 사용됩니다. 예를 들어 Kestrel은 이 기능을 위해 엔드포인트 구성을 사용합니다.

gRPC 인터셉터

ASP.NET Core 미들웨어는 C Core 기반 gRPC 앱의 인터셉터와 유사한 기능을 제공합니다. 둘 다 ASP.NET Core gRPC 앱에서 지원되므로 인터셉터를 다시 작성할 필요가 없습니다.

이러한 기능을 서로 비교한 자세한 내용은 gRPC 인터셉터와 미들웨어를 참조하세요.

non-ASP.NET Core 프로젝트에서 gRPC 호스트

C 코어 기반 서버를 모든 프로젝트 형식에 추가할 수 있습니다. .NET 서버용 gRPC에는 ASP.NET Core가 필요합니다. ASP.NET Core는 프로젝트 파일이 SDK로 지정 Microsoft.NET.SDK.Web 하기 때문에 일반적으로 사용할 수 있습니다.

gRPC 서버는 프로젝트에 추가하여 <FrameworkReference Include="Microsoft.AspNetCore.App" /> non-ASP.NET Core 프로젝트에 호스트할 수 있습니다. 프레임워크 참조를 사용하면 ASP.NET Core API를 사용할 수 있으며 ASP.NET Core 서버를 시작하는 데 사용할 수 있습니다.

자세한 내용은 non-ASP.NET Core 프로젝트의 호스트 gRPC를 참조 하세요.

추가 리소스