クイックスタート
このガイドでは、シンプルな動作する例を使用して、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 cmakemacOS
brew install cmakeWindows
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-configmacOS
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 popdWindows
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をローカルにインストールすることを強く推奨します。適切に設定されたCMAKE_INSTALL_PREFIXを使用してください。これは、グローバルにインストールした後にgRPCをアンインストールする簡単な方法がないためです。詳細情報
- gRPC C++のビルドに関する完全な手順は、ソースからのビルドにあります。
- gRPCをC++プロジェクトの依存関係として追加する方法の一般的な手順については、gRPC C++の使用開始を参照してください。
サンプルコードのビルド
サンプルコードは、前のセクションの手順でクローンしたgrpcリポジトリのソースの一部です。
サンプルディレクトリへの移動
cd examples/cpp/helloworldcmakeを使用してサンプルをビルドするLinux & macOS
mkdir -p cmake/build pushd cmake/build cmake -DCMAKE_PREFIX_PATH=$MY_INSTALL_DIR ../.. make -j 4Windows
mkdir "cmake\build" pushd "cmake\build" cmake -DCMAKE_INSTALL_PREFIX=%MY_INSTALL_DIR% ..\.. cmake --build . --config Release -j 4 popd
注記
ビルドに失敗しましたか?ほとんどの問題は、この時点では不完全なインストールが原因です。cmakeの正しいバージョンがインストールされていることを確認し、インストール手順を再度慎重に確認してください。
実行!
サンプルビルドディレクトリexamples/cpp/helloworld/cmake/buildからサンプルを実行する
サーバーを実行する
./greeter_server別のターミナルから、クライアントを実行してクライアントの出力を確認します。
./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から次のコマンドを実行します。
変更を加えた後、クライアントとサーバーをビルドする
- Linux & macOS
make -j 4- Windows
cmake --build . --config Release -j 4サーバーを実行する
./greeter_server別のターミナルで、クライアントを実行する
./greeter_client次のような出力が表示されます。
Greeter received: Hello world Greeter received: Hello again world
次は何をするか
- gRPCの仕組みをgRPCの紹介とコアコンセプトで学習してください。
- 「基本チュートリアル」を完了してください。
- APIリファレンス(APIリファレンス)を探索してください。