最終更新:2026-10-12
C++ gRPC ミニプロジェクト¶
C++那些事のgrpc小Demo¶
GitHub で人気の RPC には grpc、brpc があり、テンセント社内で高く評価されている trpc などもあります。これらの RPC はさまざまな言語・プラットフォームに対応しています。今回は grpc の使い方を、シンプルなデモから入って解説します。プロジェクト全体は CMake でビルドする、非常に標準的な RPC プロジェクト管理となっており、すべてのコードは星球で更新済みです。入手方法は最後の QR コードをご覧ください。
1.Step by Step 環境¶
もしあなたのコンピュータが mac なら、申し訳ありませんが、現時点では最新バージョンの grpc は使えません。最新バージョンの grpc は abseil を使用しており、コンパイルで問題が発生します。公式ではまだ解決されていません。解決方法をご存知の方は、コメント欄で教えてください。私のほうでは今のところ解決方法を見つけられていません。
そのため、mac には低いバージョンの grpc をインストールするか、linux に直接インストールすることをお勧めします。linux では最新バージョンの grpc が使用でき、一度インストールすれば問題はまったくありません。
インストール方法:
次に submodule を初期化します
cmake でビルドしてインストール:
cd cmake
mkdir build
cd build
cmake -DgRPC_INSTALL=ON -DgRPC_BUILD_TESTS=OFF -DCMAKE_INSTALL_PREFIX=/usr/local/grpc ../..
make -j8
make -j8 install // root 权限
上のインストール先ディレクトリは適宜変更できます。install 時には root 権限が必要な点に注意してください。
インストールが完了したら、bin ディレクトリを PATH に設定します。例えば:
2.文字列反転Demo¶
環境が整ったので、いよいよ作業に取り掛かれます。
2.1 プロトコル¶
最初にやるべきことは rpc プロトコルの確定です:
syntax = "proto3";
package stringreverse;
service StringReverse {
rpc sendRequest (StringRequest) returns (StringReply) {}
}
message StringRequest {
string original = 1;
}
message StringReply {
string reversed = 1;
}
非常にシンプルなプロトコルで、文字列を 1 つリクエストし、文字列を 1 つ返します。
2.2 クライアント¶
rpc リクエストの文字列を構築し、sendRequest インターフェースを呼び出して送信するだけです。
std::string str = "hello world grpc!";
std::cout << "Original string: " << str << std::endl;
StringRequest request;
StringReply reply;
ClientContext context;
request.set_original(str);
Status status = stub->sendRequest(&context, request, &reply);
if (status.ok()) {
std::cout << "Reversed string: " << reply.reversed() << std::endl;
}
// do something
2.3 サーバ側¶
Service を継承して文字列反転のロジックを実装します。
class ReverseServiceImplementation final : public StringReverse::Service {
Status sendRequest(ServerContext* context, const StringRequest* request,
StringReply* reply) override {
// 反转逻辑
}
}
最後に service を登録するだけです:
builder.RegisterService(&service);
std::unique_ptr<Server> server(builder.BuildAndStart());
std::cout << "Server listening on port: " << server_address << std::endl;
3.実行¶
ビルドディレクトリを作成します:
mkdir build
cmake ..
# 输出
-- The C compiler identification is GNU 10.2.1
-- The CXX compiler identification is GNU 10.2.1
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /opt/rh/devtoolset-10/root/usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /opt/rh/devtoolset-10/root/usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Looking for pthread.h
-- Looking for pthread.h - found
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Failed
-- Looking for pthread_create in pthreads
-- Looking for pthread_create in pthreads - not found
-- Looking for pthread_create in pthread
-- Looking for pthread_create in pthread - found
-- Found Threads: TRUE
-- Found Protobuf: /usr/local/grpc/bin/protoc-23.4.0 (found version "23.4.0")
-- Using protobuf
-- Using gRPC 1.57.0
-- Configuring done
-- Generating done
-- Build files have been written to: /code/stringreverse/build
make でビルド:
[ 10%] Generating stringreverse.pb.cc, stringreverse.pb.h, stringreverse.grpc.pb.cc, stringreverse.grpc.pb.h
Scanning dependencies of target server
[ 20%] Building CXX object CMakeFiles/server.dir/server.cc.o
[ 30%] Building CXX object CMakeFiles/server.dir/stringreverse.pb.cc.o
[ 40%] Building CXX object CMakeFiles/server.dir/stringreverse.grpc.pb.cc.o
[ 50%] Linking CXX executable server
[ 50%] Built target server
Scanning dependencies of target client
[ 60%] Building CXX object CMakeFiles/client.dir/client.cc.o
[ 70%] Building CXX object CMakeFiles/client.dir/stringreverse.pb.cc.o
[ 80%] Building CXX object CMakeFiles/client.dir/stringreverse.grpc.pb.cc.o
[ 90%] Linking CXX executable client
[100%] Built target client
server を実行します:
client を実行します:
[light@i-i339drlk build]$ ./client
Original string: hello world grpc!
Reversed string: !cprg dlrow olleh
関連トピック¶
- C++ FnOnce を手書きする | C++那些事
- C++ プロセス間通信実践 | C++那些事
- C++ 短縮URLサービス Demo | C++那些事
- C++17 と SQLite でディレクトリサイズを集計 | C++那些事
- Google Benchmark 性能テスト | C++那些事
- C++20 コルーチン HTTP サーバ | C++那些事
- Protobuf ZeroCopy シリアライズ | C++那些事
- pybind11 で Python を高速化 | C++那些事
- C++ スタック型電卓の設計 | C++那些事