クイックスタート

このガイドでは、シンプルな動作する例を使用して、C++でのgRPCの開始方法を説明します。

クイックスタート

このガイドでは、シンプルな動作する例を使用して、C++でのgRPCの開始方法を説明します。

C++の世界では、プロジェクトの依存関係を管理するための普遍的に受け入れられている標準はありません。このクイックスタートのHello Worldの例をビルドして実行する前に、gRPCをビルドしてインストールする必要があります。

gRPCとProtocol Buffersのビルドとローカルインストール

このセクションの手順では、cmakeを使用してgRPCとProtocol Buffersをビルドしてローカルにインストールする方法を説明します。代わりにbazelを使用したい場合は、ソースからのビルドを参照してください。

セットアップ

ローカルにインストールされたパッケージを保持するディレクトリを選択します。このページでは、環境変数MY_INSTALL_DIRがこのディレクトリパスを保持していることを前提としています。例:

  • Linux / macOS
export MY_INSTALL_DIR=$HOME/.local

ディレクトリが存在することを確認してください

mkdir -p $MY_INSTALL_DIR

ローカルのbinフォルダをパス変数に追加します。例:

export PATH="$MY_INSTALL_DIR/bin:$PATH"
  • Windows
set MY_INSTALL_DIR=%USERPROFILE%\cmake

ディレクトリが存在することを確認してください

mkdir %MY_INSTALL_DIR%

ローカルのbinフォルダをパス変数に追加します。例:

set PATH=%PATH%;$MY_INSTALL_DIR\bin

cmakeのインストール

cmakeのバージョン3.16以降が必要です。まだインストールしていない場合は、これらの手順に従ってインストールしてください。

  • Linux

    sudo apt install -y cmake
    
  • macOS

    brew install cmake
    
  • Windows

    choco install cmake
    
  • 一般的なcmakeのインストール手順については、CMakeのインストールを参照してください。

cmakeのバージョンを確認する

cmake --version
cmake version 3.30.3

Linuxでは、システム全体のcmakeのバージョンが古すぎる場合があります。次のように、より新しいバージョンをローカルのインストールディレクトリにインストールできます。

wget -q -O cmake-linux.sh https://github.com/Kitware/CMake/releases/download/v3.30.3/cmake-3.30.3-linux-x86_64.sh
sh cmake-linux.sh -- --skip-license --prefix=$MY_INSTALL_DIR
rm cmake-linux.sh

その他の必要なツールのインストール

gRPCをビルドするために必要な基本的なツールのインストール

  • Linux

    sudo apt install -y build-essential autoconf libtool pkg-config
    
  • macOS

    brew install autoconf automake libtool pkg-config
    

grpcリポジトリのクローン

grpcリポジトリとそのサブモジュールをクローンする

git clone --recurse-submodules -b v1.74.0 --depth 1 --shallow-submodules https://github.com/grpc/grpc

gRPCとProtocol Buffersのビルドとインストール

必須ではありませんが、gRPCアプリケーションは通常、サービス定義とデータシリアライゼーションにProtocol Buffersを活用しており、サンプルコードはproto3を使用しています。

以下のコマンドは、gRPCとProtocol Buffersをビルドしてローカルにインストールします。

  • Linux & macOS

    cd grpc
    mkdir -p cmake/build
    pushd cmake/build
    cmake -DgRPC_INSTALL=ON \
          -DgRPC_BUILD_TESTS=OFF \
          -DCMAKE_CXX_STANDARD=17 \
          -DCMAKE_INSTALL_PREFIX=$MY_INSTALL_DIR \
          ../..
    make -j 4
    make install
    popd
    
  • Windows

    mkdir "cmake\build"
    pushd "cmake\build"
    cmake -DgRPC_INSTALL=ON -DgRPC_BUILD_TESTS=OFF -DCMAKE_CXX_STANDARD=17 -DCMAKE_INSTALL_PREFIX=%MY_INSTALL_DIR% ..\..
    cmake --build . --config Release --target install -j 4
    popd
    

詳細情報

  • gRPC C++のビルドに関する完全な手順は、ソースからのビルドにあります。
  • gRPCをC++プロジェクトの依存関係として追加する方法の一般的な手順については、gRPC C++の使用開始を参照してください。

サンプルコードのビルド

サンプルコードは、前のセクションの手順でクローンしたgrpcリポジトリのソースの一部です。

  1. サンプルディレクトリへの移動

    cd examples/cpp/helloworld
    
  2. cmakeを使用してサンプルをビルドする

    • Linux & macOS

      mkdir -p cmake/build
      pushd cmake/build
      cmake -DCMAKE_PREFIX_PATH=$MY_INSTALL_DIR ../..
      make -j 4
      
    • Windows

      mkdir "cmake\build"
      pushd "cmake\build"
      cmake -DCMAKE_INSTALL_PREFIX=%MY_INSTALL_DIR% ..\..
      cmake --build . --config Release -j 4
      popd
      

実行!

サンプルビルドディレクトリexamples/cpp/helloworld/cmake/buildからサンプルを実行する

  1. サーバーを実行する

    ./greeter_server
    
  2. 別のターミナルから、クライアントを実行してクライアントの出力を確認します。

    ./greeter_client
    Greeter received: Hello world
    

おめでとうございます!gRPCを使用したクライアント・サーバーアプリケーションを実行できました。

gRPCサービスを更新する

次に、クライアントが呼び出すことができるように、サーバーにメソッドを追加してアプリケーションを更新する方法を見てみましょう。gRPCサービスはプロトコルバッファを使用して定義されます。サービスを.protoファイルで定義する方法については、gRPCの概要および基本チュートリアルでさらに詳しく知ることができます。現時点では、サーバーとクライアントスタブの両方が、クライアントからHelloRequestパラメータを受け取り、サーバーからHelloReplyを返すSayHello() RPCメソッドを持っており、このメソッドは次のように定義されていることを知っていれば十分です。

// 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;
}

examples/protos/helloworld.protoを開き、同じリクエストとレスポンスタイプで新しいSayHelloAgain()メソッドを追加します。

// The greeting service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply) {}
  // Sends another greeting
  rpc SayHelloAgain (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コードの再生成

新しいサービスメソッドを使用できるようにするには、更新されたprotoファイルを再コンパイルする必要があります。

サンプルビルドディレクトリexamples/cpp/helloworld/cmake/buildから、以下を実行します。

  • Linux & macOS
make -j 4
  • Windows
cmake --build . --config Release -j 4

これにより、helloworld.pb.{h,cc}およびhelloworld.grpc.pb.{h,cc}が再生成されます。これには、生成されたクライアントおよびサーバークラス、およびリクエスト/レスポンスタイプを格納、シリアライズ、取得するためのクラスが含まれます。

アプリケーションの更新と実行

新しい生成されたサーバーおよびクライアントコードがありますが、アプリケーションの人間の手で書かれた部分に新しいメソッドを実装して呼び出す必要があります。

サーバーを更新する

サンプルルートディレクトリからgreeter_server.ccを開きます。新しいメソッドを次のように実装します。

class GreeterServiceImpl final : public Greeter::Service {
  Status SayHello(ServerContext* context, const HelloRequest* request,
                  HelloReply* reply) override {
     // ...
  }

  Status SayHelloAgain(ServerContext* context, const HelloRequest* request,
                       HelloReply* reply) override {
    std::string prefix("Hello again ");
    reply->set_message(prefix + request->name());
    return Status::OK;
  }
};

クライアントを更新する

スタブに新しいSayHelloAgain()メソッドが利用可能になりました。既存のSayHello()と同じパターンに従い、GreeterClientに新しいSayHelloAgain()メソッドを追加します。

class GreeterClient {
 public:
  // ...
  std::string SayHello(const std::string& user) {
     // ...
  }

  std::string SayHelloAgain(const std::string& user) {
    // Follows the same pattern as SayHello.
    HelloRequest request;
    request.set_name(user);
    HelloReply reply;
    ClientContext context;

    // Here we can use the stub's newly available method we just added.
    Status status = stub_->SayHelloAgain(&context, request, &reply);
    if (status.ok()) {
      return reply.message();
    } else {
      std::cout << status.error_code() << ": " << status.error_message()
                << std::endl;
      return "RPC failed";
    }
  }

最後に、main()でこの新しいメソッドを呼び出します。

int main(int argc, char** argv) {
  // ...
  std::string reply = greeter.SayHello(user);
  std::cout << "Greeter received: " << reply << std::endl;

  reply = greeter.SayHelloAgain(user);
  std::cout << "Greeter received: " << reply << std::endl;

  return 0;
}

実行!

以前と同様に、クライアントとサーバーを実行します。サンプルビルドディレクトリexamples/cpp/helloworld/cmake/buildから次のコマンドを実行します。

  1. 変更を加えた後、クライアントとサーバーをビルドする

    • Linux & macOS
    make -j 4
    
    • Windows
    cmake --build . --config Release -j 4
    
  2. サーバーを実行する

    ./greeter_server
    
  3. 別のターミナルで、クライアントを実行する

    ./greeter_client
    

    次のような出力が表示されます。

    Greeter received: Hello world
    Greeter received: Hello again world
    

次は何をするか

最終更新日: 2025年4月19日: Update quickstart.md (#1420) (fe6a359)