영어로 읽기

다음을 통해 공유


.NET을 사용하는 Code First gRPC 서비스 및 클라이언트

참고

이 문서의 최신 버전은 아닙니다. 현재 릴리스는 이 문서의 .NET 9 버전을 참조 하세요.

경고

이 버전의 ASP.NET Core는 더 이상 지원되지 않습니다. 자세한 내용은 .NET 및 .NET Core 지원 정책을 참조 하세요. 현재 릴리스는 이 문서의 .NET 9 버전을 참조 하세요.

중요

이 정보는 상업적으로 출시되기 전에 실질적으로 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적, 또는 묵시적인 보증을 하지 않습니다.

현재 릴리스는 이 문서의 .NET 9 버전을 참조 하세요.

작성자: James Newton-KingMarc Gravell

Code First gRPC는 .NET 형식을 사용하여 서비스 및 메시지 계약을 정의합니다.

Code First는 전체 시스템에서 .NET을 사용하는 경우에 적합합니다.

  • .NET 서비스 및 데이터 계약 형식은 .NET 서버와 클라이언트 간에 공유할 수 있습니다.
  • .proto 파일 및 코드 생성에서 계약을 정의하지 않아도 됩니다.

여러 언어가 있는 폴리글랏(polyglot) 시스템에서는 Code First를 사용하지 않는 것이 좋습니다. .NET 서비스 및 데이터 계약 형식은 .NET 플랫폼이 아닌 플랫폼에 사용할 수 없습니다. 다른 플랫폼은 Code First를 사용하여 작성된 gRPC 서비스를 호출하려면 서비스와 일치하는 .proto 계약을 만들어야 합니다.

protobuf-net.Grpc

중요

protobuf-net.Grpc에 대한 도움말이 필요하면 protobuf-net.Grpc 웹 사이트를 방문하거나 protobuf-net.Grpc GitHub 리포지토리에서 문제를 제출하세요.

protobuf-net.Grpc는 커뮤니티 프로젝트이며 Microsoft에서 지원하지 않습니다. protobuf-net.Grpc는 Grpc.AspNetCoreGrpc.Net.Client에 Code First 지원을 추가합니다. 또한 특성으로 주석이 지정된 .NET 형식을 사용하여 앱의 gRPC 서비스 및 메시지를 정의합니다.

Code First gRPC 서비스를 만드는 첫 번째 단계는 코드 계약을 정의하는 것입니다.

  • 서버와 클라이언트가 공유할 새 프로젝트를 만듭니다.
  • protobuf-net.Grpc 패키지 참조를 추가합니다.
  • 서비스 및 데이터 계약 형식을 만듭니다.
using ProtoBuf.Grpc;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Threading.Tasks;

namespace Shared.Contracts;

[DataContract]
public class HelloReply
{
    [DataMember(Order = 1)]
    public string Message { get; set; }
}

[DataContract]
public class HelloRequest
{
    [DataMember(Order = 1)]
    public string Name { get; set; }
}

[ServiceContract]
public interface IGreeterService
{
    [OperationContract]
    Task<HelloReply> SayHelloAsync(HelloRequest request,
        CallContext context = default);
}

앞의 코드가 하는 역할은 다음과 같습니다.

  • HelloRequestHelloReply 메시지를 정의합니다.
  • 단항 SayHelloAsync gRPC 메서드로 IGreeterService 계약 인터페이스를 정의합니다.

서비스 계약은 서버에서 구현되고 클라이언트에서 호출됩니다.

서비스 인터페이스에서 정의된 메서드는 다음 중 어디에 속하는가를 기준으로 특정 서명과 일치해야 합니다.

  • 단항
  • 서버 스트리밍
  • 클라이언트 스트리밍
  • 양방향 스트리밍

서비스 계약을 정의하는 방법에 대한 자세한 내용은 protobuf-net.Grpc 시작 설명서를 참조하세요.

Code First gRPC 서비스 만들기

ASP.NET Core 앱에 gRPC Code First 서비스를 추가하려면 다음을 수행합니다.

  • protobuf-net.Grpc.AspNetCore 패키지 참조를 추가합니다.

  • 공유 코드 계약 프로젝트에 참조를 추가합니다.

    <Project Sdk="Microsoft.NET.Sdk.Web">
    
      <PropertyGroup>
        <TargetFramework>net6.0</TargetFramework>
        <Nullable>enable</Nullable>
        <ImplicitUsings>enable</ImplicitUsings>
      </PropertyGroup>
    
      <ItemGroup>
        <PackageReference Include="protobuf-net.Grpc.AspNetCore" Version="1.0.152" />
      </ItemGroup>
    
      <ItemGroup>
          <ProjectReference Include="..\Shared\Shared.Contracts.csproj" />
      </ItemGroup>
    
    </Project>
    
  • GreeterService.cs 파일을 만들고 IGreeterService 서비스 인터페이스를 구현합니다.

    using Shared.Contracts;
    using ProtoBuf.Grpc;
    
    public class GreeterService : IGreeterService
    {
        public Task<HelloReply> SayHelloAsync(HelloRequest request, CallContext context = default)
        {
            return Task.FromResult(
                    new HelloReply
                    {
                        Message = $"Hello {request.Name}"
                    });
        }
    }
    
  • Program.cs 파일을 업데이트합니다.

    using ProtoBuf.Grpc.Server;
    
    var builder = WebApplication.CreateBuilder(args);
    
    // Additional configuration is required to successfully run gRPC on macOS.
    // For instructions on how to configure Kestrel and gRPC clients on macOS, visit https://go.microsoft.com/fwlink/?linkid=2099682
    
    // Add services to the container.
    builder.Services.AddCodeFirstGrpc();
    
    var app = builder.Build();
    
    // Configure the HTTP request pipeline.
    app.MapGrpcService<GreeterService>();
    app.MapGet("/", () => "Communication with gRPC endpoints must be made through a gRPC client. To learn how to create a client, visit: https://go.microsoft.com/fwlink/?linkid=2086909");
    
    app.Run();
    

    위에 강조 표시된 코드는 다음을 업데이트합니다.

    • AddCodeFirstGrpc는 Code First를 사용하도록 설정하는 서비스를 등록합니다.
    • MapGrpcService<GreeterService>는 Code First 서비스 엔드포인트를 추가합니다.

Code First로 구현된 gRPC 서비스와 .proto 파일로 구현된 gRPC 서비스는 동일한 앱에 공존할 수 있습니다. 모든 gRPC 서비스는 gRPC 서비스 구성을 사용합니다.

Code First gRPC 클라이언트 만들기

Code First gRPC 클라이언트는 서비스 계약을 사용하여 gRPC 서비스를 호출합니다.

  • gRPC 클라이언트 .csproj 파일에서:

    • protobuf-net.Grpc 패키지 참조를 추가합니다.
    • Grpc.Net.Client 패키지 참조를 추가합니다.
    • 공유 코드 계약 프로젝트에 참조를 추가합니다.
    <Project Sdk="Microsoft.NET.Sdk">
    
      <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>net6.0</TargetFramework>
        <ImplicitUsings>enable</ImplicitUsings>
        <Nullable>enable</Nullable>
      </PropertyGroup>
    
      <ItemGroup>
        <PackageReference Include="Grpc.Net.Client" Version="2.52.0" />
        <PackageReference Include="protobuf-net.Grpc" Version="1.0.152" />
      </ItemGroup>
        
      <ItemGroup>
        <ProjectReference Include="..\Shared\Shared.Contracts.csproj" />
      </ItemGroup>
    
    </Project>
    
  • 클라이언트 program.cs 업데이트

    // See https://aka.ms/new-console-template for more information
    using Grpc.Net.Client;
    using ProtoBuf.Grpc.Client;
    using Shared.Contracts;
    
    namespace GrpcGreeterClient;
    
    internal class Program
    {
        private static async Task Main(string[] args)
        {
            using var channel = GrpcChannel.ForAddress("https://localhost:7184");
            var client = channel.CreateGrpcService<IGreeterService>();
    
            var reply = await client.SayHelloAsync(
                new HelloRequest { Name = "GreeterClient" });
    
            Console.WriteLine($"Greeting: {reply.Message}");
            Console.WriteLine("Press any key to exit...");
            Console.ReadKey();
        }
    }
    
    
    

위의 gRPC 클라이언트 Program.cs 코드에서:

  • gRPC 채널을 만듭니다.
  • CreateGrpcService<IGreeterService> 확장 메서드를 사용하여 채널에서 Code First 클라이언트를 만듭니다.
  • SayHelloAsync를 사용하여 gRPC 서비스를 호출합니다.

Code First gRPC 클라이언트가 채널에서 만들어집니다. 일반 클라이언트와 마찬가지로 Code First 클라이언트는 채널 구성을 사용합니다.

샘플 코드 보기 및 다운로드(다운로드 방법)

추가 리소스

Code First gRPC는 .NET 형식을 사용하여 서비스 및 메시지 계약을 정의합니다.

Code First는 전체 시스템에서 .NET을 사용하는 경우에 적합합니다.

  • .NET 서비스 및 데이터 계약 형식은 .NET 서버와 클라이언트 간에 공유할 수 있습니다.
  • .proto 파일 및 코드 생성에서 계약을 정의하지 않아도 됩니다.

여러 언어가 있는 폴리글랏(polyglot) 시스템에서는 Code First를 사용하지 않는 것이 좋습니다. .NET 서비스 및 데이터 계약 형식은 .NET 플랫폼이 아닌 플랫폼에 사용할 수 없습니다. 다른 플랫폼은 Code First를 사용하여 작성된 gRPC 서비스를 호출하려면 서비스와 일치하는 .proto 계약을 만들어야 합니다.

protobuf-net.Grpc

중요

protobuf-net.Grpc에 대한 도움말이 필요하면 protobuf-net.Grpc 웹 사이트를 방문하거나 protobuf-net.Grpc GitHub 리포지토리에서 문제를 제출하세요.

protobuf-net.Grpc는 커뮤니티 프로젝트이며 Microsoft에서 지원하지 않습니다. protobuf-net.Grpc는 Grpc.AspNetCoreGrpc.Net.Client에 Code First 지원을 추가합니다. 또한 특성으로 주석이 지정된 .NET 형식을 사용하여 앱의 gRPC 서비스 및 메시지를 정의합니다.

Code First gRPC 서비스를 만드는 첫 번째 단계는 코드 계약을 정의하는 것입니다.

  • 서버와 클라이언트가 공유할 새 프로젝트를 만듭니다.
  • protobuf-net.Grpc 패키지 참조를 추가합니다.
  • 서비스 및 데이터 계약 형식을 만듭니다.
[DataContract]
public class HelloReply
{
    [DataMember(Order = 1)]
    public string Message { get; set; }
}

[DataContract]
public class HelloRequest
{
    [DataMember(Order = 1)]
    public string Name { get; set; }
}

[ServiceContract]
public interface IGreeterService
{
    [OperationContract]
    Task<HelloReply> SayHelloAsync(HelloRequest request,
        CallContext context = default);
}

앞의 코드가 하는 역할은 다음과 같습니다.

  • HelloRequestHelloReply 메시지를 정의합니다.
  • 단항 SayHelloAsync gRPC 메서드로 IGreeterService 계약 인터페이스를 정의합니다.

서비스 계약은 서버에서 구현되고 클라이언트에서 호출됩니다. 서비스 인터페이스에 정의된 메서드는 단항인지, 서버 스트리밍인지, 클라이언트 스트리밍인지, 양방향 스트리밍인지에 따라 특정 서명과 일치해야 합니다.

서비스 계약을 정의하는 방법에 대한 자세한 내용은 protobuf-net.Grpc 시작 설명서를 참조하세요.

Code First gRPC 서비스 만들기

ASP.NET Core 앱에 gRPC Code First 서비스를 추가하려면 다음을 수행합니다.

GreeterService.cs 파일을 만들고 IGreeterService 서비스 인터페이스를 구현합니다.

public class GreeterService : IGreeterService
{
    public Task<HelloReply> SayHelloAsync(HelloRequest request, CallContext context = default)
    {
        return Task.FromResult(
               new HelloReply
               {
                   Message = $"Hello {request.Name}"
               });
    }
}

Startup.cs 파일을 업데이트합니다.

public void ConfigureServices(IServiceCollection services)
{
    services.AddCodeFirstGrpc();
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseRouting();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapGrpcService<GreeterService>();
    });
}

위의 코드에서

  • AddCodeFirstGrpc는 Code First를 사용하도록 설정하는 서비스를 등록합니다.
  • MapGrpcService<GreeterService>는 Code First 서비스 엔드포인트를 추가합니다.

Code First로 구현된 gRPC 서비스와 .proto 파일로 구현된 gRPC 서비스는 동일한 앱에 공존할 수 있습니다. 모든 gRPC 서비스는 gRPC 서비스 구성을 사용합니다.

Code First gRPC 클라이언트 만들기

Code First gRPC 클라이언트는 서비스 계약을 사용하여 gRPC 서비스를 호출합니다. Code First 클라이언트를 사용하여 gRPC 서비스를 호출하려면 다음을 수행합니다.

  • protobuf-net.Grpc 패키지 참조를 추가합니다.
  • 공유 코드 계약 프로젝트에 참조를 추가합니다.
  • Grpc.Net.Client 패키지 참조를 추가합니다.
using var channel = GrpcChannel.ForAddress("https://localhost:5001");
var client = channel.CreateGrpcService<IGreeterService>();

var reply = await client.SayHelloAsync(
    new HelloRequest { Name = "GreeterClient" });

Console.WriteLine($"Greeting: {reply.Message}");

앞의 코드가 하는 역할은 다음과 같습니다.

  • gRPC 채널을 만듭니다.
  • CreateGrpcService<IGreeterService> 확장 메서드를 사용하여 채널에서 Code First 클라이언트를 만듭니다.
  • SayHelloAsync를 사용하여 gRPC 서비스를 호출합니다.

Code First gRPC 클라이언트가 채널에서 만들어집니다. 일반 클라이언트와 마찬가지로 Code First 클라이언트는 채널 구성을 사용합니다.

샘플 코드 보기 및 다운로드(다운로드 방법)

추가 리소스