はじめに
最終目標
NestJSプログラムとC++プログラムにそれぞれgRPCモジュールを実装して相互通信させることを最終目標とし、目標達成に至るまでのプロセスを段階的に記します。
C++側は公式サンプルにあるCMakeによるコンパイルではなく、Makefileでコンパイルできるようにします。
今回の目標
Protocol BuffersでC++側のAPIの定義とコンパイルを行い、C++のgRPC通信プログラムで使用するインクルードヘッダファイルと静的ライブラリファイルを生成します。
コンパイルはCMakeで行います。
環境
NestJSプログラム、C++プログラム共に同一のAlmaLinux8.8上で動作するものとします。
C++環境でProtocol Buffersの定義
CMake環境作成
下記のフォルダ構成を作成します。
grpc_api
├ build
└ protos
protoファイル作成
grpc_api/protos/
の下に、下記の通りuser.proto
ファイルを作成します。
UsersService
というサービスを作成し、User
情報の取得と登録を行うAPIを用意します。
GetUser
ではUserById
を引数にUser
を取得します。
SetUser
ではUser
を引数にResult
を取得します。
syntax = "proto3";
package user;
service UsersService {
rpc GetUser (UserById) returns (User) {}
rpc SetUser (User) returns (Result) {}
}
message UserById {
int32 id = 1;
}
message User {
int32 id = 1;
string name = 2;
}
message Result {
string message = 1;
}
CMakeList.txtファイル作成
下記からcommon.cmake
をダウンロードしてgrpc_api/
に配置します。
下記の通りCMakeLists.txtファイルを作成し、grpc_api/
に配置します。
gRPCのhellowoldサンプルプログラムを元に作成しました。
cmake_minimum_required(VERSION 3.8)
project(User C CXX)
include(common.cmake)
set(dest_dir "../build")
# Proto file
get_filename_component(user_proto "protos/user.proto" ABSOLUTE)
get_filename_component(user_proto_path "${user_proto}" PATH)
# Generated sources
set(user_proto_srcs "${CMAKE_CURRENT_BINARY_DIR}/user.pb.cc")
set(user_proto_hdrs "${CMAKE_CURRENT_BINARY_DIR}/user.pb.h")
set(user_grpc_srcs "${CMAKE_CURRENT_BINARY_DIR}/user.grpc.pb.cc")
set(user_grpc_hdrs "${CMAKE_CURRENT_BINARY_DIR}/user.grpc.pb.h")
add_custom_command(
OUTPUT "${user_proto_srcs}" "${user_proto_hdrs}" "${user_grpc_srcs}" "${user_grpc_hdrs}"
COMMAND ${_PROTOBUF_PROTOC}
ARGS --grpc_out "${dest_dir}"
--cpp_out "${dest_dir}"
-I "${user_proto_path}"
--plugin=protoc-gen-grpc="${_GRPC_CPP_PLUGIN_EXECUTABLE}"
"${user_proto}"
DEPENDS "${user_proto}")
# Include generated *.pb.h files
include_directories("${CMAKE_CURRENT_BINARY_DIR}")
# user_grpc_proto
add_library(user_grpc_proto
${user_grpc_srcs}
${user_grpc_hdrs}
${user_proto_srcs}
${user_proto_hdrs})
target_link_libraries(user_grpc_proto
absl::check
${_REFLECTION}
${_GRPC_GRPCPP}
${_PROTOBUF_LIBPROTOBUF})
コンパイル実行
下記を実行します。
$ cd build
$ cmake ..
$ make -j 4
build
の下に下記のファイルができていれば成功です。
次回からこれらヘッダファイルと静的ライブラリを使用します。
user.pb.cc
user.pb.h
user.grpc.pb.cc
user.grpc.pb.h
libuser_grpc_proto.a
これでProtocol Buffersの定義とライブラリの作成は完了です。
次回はC++のサーバプログラムを実装します。
関連記事