【gRpc】Protocol Buffersを使ってgolangソースを生成する

2020年11月20日

11月からフリーランスとして2個目の案件へ参画しました。こちらではgRpcを使用するとのことで勉強のために自分でもgRpcを始めてみることに。

今回はProtocol Buffersを用いてgolang用のソースコード生成をしてみたいと思います。生成されるのはいわゆるgRpc Serviceのinterfaceです。

また、今回から始めるgRpc周りの記事の内容はサンプルコードをgithubリポジトリに公開しようと思います。

※一連の手順はWindowsでやっていますが、Protocol Buffersのインストール以外は基本的にMacでも同じはずです。

環境情報

OS: Windows10 64bit
golang: v1.15.3
Protocol Buffers: v3.13.0

※コマンドの実行は基本的にgit bashで行っているのでlinuxコマンドになっています。

サンプルコードのリポジトリ

今回使用したサンプルは以下のリポジトリに配置しています。

https://github.com/i-shinya/grpc-client-server-sample

今回までのサンプルコードは以下のコミットで確認できます。

今回までのコード

WindowsでProtocol Buffersを使ってgolangソースを生成する

Protocol Buffersを使用してgolangソースを生成する手順を以下に記載します。

事前準備

※こちらの手順は必須ではなく、自分の好みで行っています。ただし、この記事で記載しているコマンドは一部こちらの手順を実施しないと実行できないものもあるので適宜こちらの手順を実施する、もしくは読み変えてご自分で設定してください。

ディレクトリを作成

今回のサンプル用にgrpc-client-server-sampleというディレクトリを作成しました。配置場所は環境変数「APPS」で指定したパスの配下にしており、APPSはいつも私が開発に使用しているディレクトリです。(.bashrcにAPPS=/c/devのような形で指定しています。)

その中に以下のようにディレクトリを作成しました。

.
`-- tools ・・・ protoc等のツールを配置するディレクトリ
    `-- grpc ・・・ grpc関連のツール・設置ファイルを配置するディレクトリ

Protocol Buffersをダウンロードする

以下githubリポジトリから「protoc-3.13.0-win64.zip」をダウンロードします。

https://github.com/protocolbuffers/protobuf/releases

zipを解凍し任意の場所に配置します。今回はtools/grpcに配置し、配置する際はprotoc-3.13.0-win64となっているディレクトリをprotocにリネームして配置しています。

($APPS/grpc-client-server-sample/tools/grpc/protocというようにフォルダを配置)

golang生成用のパッケージをインストールする

Protocol Buffersはいくつかの言語をデフォルトでサポートしているのですが、golangは別のパッケージも必要なようです。

ですので、golang生成用のパッケージ「protoc-gen-go」をge getします。

go get -u github.com/golang/protobuf/protoc-gen-go

Windowsだと以下にgolangパッケージの実行ファイルがインストールされるはずなので、こちらのフォルダをpathに追加してください。以下のディレクトリはgolangをインストールした際に設定されるグローバルのGOPATHなのでご自身で変更している場合はそちらをpathに設定してください。

%USERPROFILE%\go\bin

サンプルのprotoファイルを作成する

grpc-client-server-sample/tools/grpcにsample.protoを作成し以下のように記述します。

syntax = "proto3";
service Sample {
  rpc GetMySample (GetMySampleMessage) returns (MySampleResponse) {}
}
message GetMySampleMessage {
  string target_Sample = 1;
}
message MySampleResponse {
  string name = 1;
  string kind = 2;
}

golangのコードを生成する

以下のコマンドでCMDで実行しコードを生成します。私の場合はpathを設定したくなかったのでprotoc.exeを相対パスで指定しています。

cd $APPS/grpc-client-server-sample/tools/grpc

protoc/bin/protoc --go_out=plugins=grpc:./ protos/*.proto

実行時にWARNINGがでますが、これでsample.protoと同じディレクトリにgRpc Serviceのinterfaceであるsample.pb.goが生成されたはずです。

最終的なディレクトリ構成

最終的なディレクトリ構成は以下のようになります。

.
`-- tools
    `-- grpc
        |-- protoc
        `-- protos
            |-- sample.pb.go
            `-- sample.proto

 

今回はこれで終了です。WARNINGの解消方法は別の記事にて記載しようと思います。(まだ解消していないため)

また、今回生成したコードに対しての実装の仕方なども別の記事を書こうと思います。

 

<2020年11月18日追記>

WARNINGの解消に関して記事書きました!

【gRpc】Protocol Buffersを使ってgolangソースを生成する際のWARNINGを解消

参考

https://qiita.com/marnie_ms4/items/4582a1a0db363fe246f3