프로그래밍 일반/gRPC

gRPC C++ 심플 사용예

지노윈 2024. 7. 25. 22:58
반응형

 

이제 클라이언트가 호출할 수 있는 서버의 추가 메서드로 애플리케이션을 업데이트하는 방법을 살펴보겠습니다.

gRPC 서비스는 프로토콜 버퍼를 사용하여 정의됩니다. gRPC 소개 글을 참고해 주세요.

 

gRPC 코드 받기

git으로 gRPC를 받아 봅시다. gRPC 관련 코드를 보고 싶다면 받아 두면 좋습니다.

git clone https://github.com/grpc/grpc

 

 

gPRC Proto 정의

다음 코드는 서버와 클라이언트(Stub)에 SayHello() RPC 메서드가 있습니다. 클라이언트는 HelloRequest를 매개 변수로 가지고 서버로 부터 HelloReply를 반환 받습니다.

examples\protos\helloworld.proto에 정의된 일부 입니다.

// The greeting service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}

// The response message containing the greetings
message HelloReply {
  string message = 1;
}

 

gRPC C++ 서버

examples\cpp\helloworld\greeter_server.cc의 서버 Service 구현 내용입니다.

class GreeterServiceImpl final : public Greeter::Service {
  Status SayHello(ServerContext* context, const HelloRequest* request,
                  HelloReply* reply) override {
    std::string prefix("Hello ");
    reply->set_message(prefix + request->name());
    return Status::OK;
  }
};

 

gRPC C++ 클라이언트

examples\cpp\helloworld\greeter_client.cc의 Stub 구현의 내용입니다.

class GreeterClient {
 public:
  GreeterClient(std::shared_ptr<Channel> channel)
      : stub_(Greeter::NewStub(channel)) {}

  // Assembles the client's payload, sends it and presents the response back
  // from the server.
  std::string SayHello(const std::string& user) {
    // Data we are sending to the server.
    HelloRequest request;
    request.set_name(user);

    // Container for the data we expect from the server.
    HelloReply reply;

    // Context for the client. It could be used to convey extra information to
    // the server and/or tweak certain RPC behaviors.
    ClientContext context;

    // The actual RPC.
    Status status = stub_->SayHello(&context, request, &reply);

    // Act upon its status.
    if (status.ok()) {
      return reply.message();
    } else {
      std::cout << status.error_code() << ": " << status.error_message()
                << std::endl;
      return "RPC failed";
    }
  }

 private:
  std::unique_ptr<Greeter::Stub> stub_;
};

 

클라이언트에서 Stub로 SayHello를 호출부면 HelloRequest를 매개 변수로 HelloReply를 응답으로 간편하게 받아 오는 것을 보실 수 있습니다.

Status status = stub_->SayHello(&context, request, &reply);
https://grpc.io/docs/languages/cpp/quickstart/