C#으로 gRPC 서비스 빌드

1. 개요

gRPC는 Google에서 개발한 언어 및 플랫폼 중립적인 리모트 프로시져 콜 (RPC) 프레임워크 및 도구 모음입니다. 특히 강력한 바이너리 직렬화 툴셋 및 언어인 프로토콜 버퍼를 사용하여 서비스를 정의할 수 있습니다. 그런 다음 다양한 언어로 된 서비스 정의에서 직관적인 클라이언트 및 서버 스텁을 생성할 수 있습니다.

이 Codelab에서는 gRPC 프레임워크를 사용하여 API를 노출하는 C# 서비스를 빌드하는 방법을 알아봅니다. 서비스와 동일한 서비스 설명을 사용하는 C# 으로 작성된 콘솔 클라이언트를 사용하여 이 서비스와 상호작용합니다.

학습할 내용

  • 프로토콜 버퍼 언어
  • C#을 사용하여 gRPC 서비스를 구현하는 방법을 알아봅니다.
  • C#을 사용하여 gRPC 클라이언트를 구현하는 방법을 알아봅니다.
  • gRPC 서비스를 업데이트하는 방법

필요한 항목

본 가이드를 어떻게 사용하실 계획인가요?

읽기만 할 계획입니다. 읽은 다음 연습 활동을 완료할 계획입니다.

귀하의 Google Cloud Platform 사용 경험을 평가해 주세요.

<ph type="x-smartling-placeholder"></ph> 초보자 중급 숙련도

2. gRPC C# 샘플 다운로드 및 빌드

샘플다운로드

ZIP 파일로 gRPC C# 샘플 저장소를 다운로드하고 압축을 풉니다.

또는 Git 저장소를 클론해도 됩니다.

git clone https://github.com/meteatamel/grpc-samples-dotnet.git

어떤 방법을 사용하든 다음 콘텐츠가 포함된 grpc-samples-dotnet 폴더가 있어야 합니다.

d056832ff4ce0c8f.png

솔루션 구축

샘플 애플리케이션 폴더에는 Visual Studio 솔루션인 GrpcSamples.sln가 포함되어 있습니다. 더블클릭하여 Visual Studio에서 솔루션을 엽니다. 여러 프로젝트가 포함된 솔루션이 표시됩니다.

61da9ddc86c08019.png

다음 섹션에서 프로젝트에 관해 더 자세히 설명하겠지만 먼저 프로젝트를 빌드해 보겠습니다. Build > Build Solution 또는 Ctrl + Shift + B로 이동하여 솔루션을 빌드합니다. 그러면 NuGet에서 모든 종속 항목이 다운로드되고 애플리케이션이 컴파일됩니다.

최종적으로 Visual Studio 콘솔 출력에 Build succeeded 메시지가 표시됩니다.

3. 인사말 샘플 살펴보기

Greeter는 클라이언트가 이름이 포함된 요청을 보내면 서버는 메시지로 응답하는 간단한 gRPC 샘플입니다. 클라이언트와 서버의 기반이 되는 공통 서비스 정의 (proto 파일)가 포함된 Greeter 프로젝트가 있습니다.

인사 프로젝트

클라이언트와 서버 간에 공유되는 공통 프로젝트입니다. 클라이언트와 서버가 사용하는 gRPC 서비스 정의인 greeter.proto가 있습니다. 서비스 정의는 GreetingService이라는 gRPC 서비스를 정의하며, 이 서비스에는 HelloRequest를 입력으로, HelloResponse를 출력으로 사용하는 greeting 메서드가 있습니다.

service GreetingService {
    rpc greeting(HelloRequest) returns (HelloResponse);
}

이는 클라이언트가 단일 요청을 보내고 서버에서 단일 응답을 받는 단항 (스트리밍 없는) 메서드입니다. greeter.proto.의 나머지 콘텐츠를 살펴보세요. 이 프로젝트에는 proto 파일에서 클라이언트 및 서버 스텁을 생성하는 데 사용할 수 있는 generate_protos.bat라는 스크립트도 있습니다. 프로젝트에는 이미 생성된 클라이언트 및 서버 스텁이 포함되어 있으므로 직접 생성할 필요가 없습니다. 그러나 서비스 정의 파일에서 무엇인가를 변경하면 이 스크립트를 실행하여 스텁을 다시 생성해야 합니다.

인사 서버

gRPC 서버용 프로젝트입니다. Program.cs는 포트와 서버 구현이 설정되는 기본 진입점입니다. 중요한 클래스는 GreeterServiceImpl.cs입니다. 실제 기능이 구현되는 greeting 메서드가 있습니다.

public override Task<HelloResponse> greeting(HelloRequest request,
       ServerCallContext context)
{
    return Task.FromResult(new HelloResponse { 
          Greeting = "Hello " + request.Name });
}

인사 클라이언트

gRPC 서비스의 클라이언트 측입니다. 또한 진입점이 Program.cs입니다. 서버와 통신할 채널을 만든 다음 생성된 스텁의 채널로 클라이언트를 만듭니다. 그런 다음 요청을 생성하고 클라이언트 스텁을 사용하여 서버로 전송합니다.

4. 인사말 샘플 실행

먼저 인사말 서버를 시작합니다. 명령 프롬프트를 열고 인사말 서버의 bin > Debug 폴더로 이동하여 실행 파일을 실행합니다. 서버가 수신 대기하는 것을 확인할 수 있습니다.

> C:\grpc-samples-dotnet\GreeterServer\bin\Debug>GreeterServer.exe
GreeterServer listening on port 50051
Press any key to stop the server...

다음으로 Greeter 클라이언트를 실행합니다. 별도의 명령 프롬프트에서 인사말 서버의 bin > Debug 폴더로 이동하여 실행 파일을 실행합니다. 클라이언트가 요청을 보내고 서버에서 응답을 수신하는 것을 확인할 수 있습니다.

> C:\grpc-samples-dotnet\GreeterClient\bin\Debug>GreeterClient.exe
GreeterClient sending request
GreeterClient received response: Hello Mete - on C#
Press any key to exit...

5. 인사말 샘플 업데이트

서비스 업데이트가 어떻게 진행되는지 살펴보겠습니다. gRPC 서비스에 newbye라는 새 메서드를 추가합니다. 이 메서드는 클라이언트에 hello 대신 인사를 반환합니다.

첫 번째 단계는 서비스 정의 파일(greeter.proto.)을 업데이트하는 것입니다.

service GreetingService {
    rpc greeting(HelloRequest) returns (HelloResponse);
    
    rpc goodbye(HelloRequest) returns (HelloResponse);
}

그런 다음 클라이언트 및 서버 스텁을 다시 생성해야 합니다. 명령 프롬프트에서 generate_protos.bat를 실행합니다. 스텁이 생성되면 업데이트된 코드를 가져오기 위해 Visual Studio 프로젝트를 새로고침해야 할 수 있습니다.

마지막으로 새 메서드를 활용할 수 있도록 클라이언트와 서버 코드를 업데이트합니다. 서비스에서 GreeterServiceImpl.cs를 업데이트하고 새 goodbye 메서드를 추가합니다.

public override Task<HelloResponse> goodbye(HelloRequest request,
       ServerCallContext context)
{
    return Task.FromResult(new HelloResponse { 
          Greeting = "Goodbye " + request.Name });
}

클라이언트에서 Program.cs.goodbye 메서드를 호출합니다.

response = client.goodbye(request);
Console.WriteLine("GreeterClient received response: " 
                       + response.Greeting);

프로젝트를 다시 빌드하고 서버와 클라이언트를 다시 실행합니다. 이제 클라이언트에서 작별 메시지를 받게 됩니다.

> C:\grpc-samples-dotnet\GreeterClient\bin\Debug>GreeterClient.exe
GreeterClient sending request
GreeterClient received response: Hello Mete - on C#
GreeterClient received response: Goodbye Mete - on C#
Press any key to exit...

6. 채팅 샘플 살펴보기

이 솔루션에는 ChatServerChatWindowsClient 프로젝트도 있습니다. 이름에서 알 수 있듯이 간단한 채팅 애플리케이션을 위한 클라이언트와 서버의 쌍입니다. Chat 프로젝트에는 chat.proto이라는 서비스 정의 파일이 있습니다. chat 메서드로 ChatService를 정의합니다.

service ChatService {
 rpc chat(stream ChatMessage) returns (stream ChatMessageFromServer);
}

여기서 중요한 점은 수신 및 발신 채팅 메시지가 모두 stream 키워드로 표시된다는 것입니다. 이는 기본적으로 연결을 양방향 스트림으로 전환하여 클라이언트와 서버가 언제든지 서로 메시지를 보낼 수 있도록 합니다. 채팅 애플리케이션에 가장 적합한 솔루션입니다.

샘플을 더 살펴보고 빌드하고 실행하여 연습해 보는 방법을 확인할 수 있습니다.

7. 축하합니다.

학습한 내용

  • 프로토콜 버퍼 언어
  • C#을 사용하여 gRPC 서비스를 구현하는 방법을 알아봅니다.
  • C#을 사용하여 gRPC 클라이언트를 구현하는 방법을 알아봅니다.
  • gRPC 서비스를 업데이트하는 방법

다음 단계