C#으로 gRPC 서비스 빌드

1. 개요

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

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

학습할 내용

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

필요한 항목

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

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

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

초급 중급 고급

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

샘플 다운로드s

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

또는 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 샘플 살펴보기

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

Greeter Project

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

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

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

Greeter Server

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

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

Greeter 클라이언트

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

4. Greeter 샘플 실행

먼저 Greeter 서버를 시작합니다. 명령 프롬프트를 열고 Greeter Server의 bin > Debug 폴더로 이동하여 실행 파일을 실행합니다. 서버가 수신 대기 중인 것으로 표시됩니다.

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

그런 다음 Greeter 클라이언트를 실행합니다. 별도의 명령 프롬프트에서 Greeter Server의 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. Greeter 샘플 업데이트

서비스를 업데이트하는 방법을 살펴보겠습니다. 클라이언트에 hello 대신 goodbye를 반환하는 goodbye라는 새 메서드를 gRPC 서비스에 추가합니다.

첫 번째 단계는 서비스 정의 파일 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 서비스를 업데이트하는 방법

다음 단계