0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

NestJSとC++間でgRPC(② C++のProtocol Buffers定義)

Last updated at Posted at 2024-07-03

はじめに

最終目標

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を取得します。

grpc_api/protos/user.proto
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サンプルプログラムを元に作成しました。

grpc_api/CMakeLists.txt
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++のサーバプログラムを実装します。

関連記事

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?