gRPCの動作確認にはBloomRPCとevansが便利!という話
1. はじめに
gRPCの動作確認、みなさんはどうされてますか?
サービスのメソッド1つ1つの確認のためにクライアントをわざわざ実装するのは面倒ですよね。
今回はクライアントの実装よりもずっと楽かつ便利にgRPCの動作確認を出来るBloomRPCとのevansそれぞれの良さ・使い分けについて自分の考えを言語化してまとめてみました。
2. BloomRPC
BloomRPCはGUIで直感的に操作可能な作りになっています。
インストールも簡単でMacならHomebrewで簡単に入れることが出来ます。
$ brew install --cask bloomrpc
またLinuxでもAppImage形式[1]でファイルが配布されています。
リンク先のReleasesから拡張子が.AppImage
になっているファイルをダウンロードした上で実行権限を付与してやるだけで良いので、非常にお手軽に使い始められます。
-- ダウンロードしたディレクトリに移動
$ cd {BloomRPCのAppImageダウンロード先パス}
-- 実行権限を付与
$ chmod +x ./BloomRPC-{バージョン}.AppImage
-- 実行
$ ./BloomRPC-{バージョン}.AppImage
BloomRPCの良さ
IDLの型から良い感じにパラメーターを埋めておいてくれる
BloomRPCはproto等のIDLのファイルのmessageの型などからパラメーターを良い感じに埋めておいてくれる機能があります。
これのおかげで特に重要でない項目に関してはBloomRPCの埋めてくれた値をそのまま流用して動作確認を行えるので非常に楽です。
WebフレームワークでのテストなどでRailsのFactory GirlやDjangoのfactory_boyがテストデータを良い感じに用意してくれる良さに近いです。
streamingでの通信方式の確認やポート番号変更、metadataの設定等の操作性がシンプル
双方向通信(Bidirectional streaming RPC)[2]を例にとってやると、
上記のようにrequest、responseそれぞれのstreamのデータをタブ形式で切り替えて見れるのが非常に手軽です。
またタブ切り替えで別のポート番号のgRPCの確認なども容易で切り替えが出来ます。
さらにmetadata[3]の設定も下のタブから簡単に行うことが出来ます。
3. evans
evansはCLIのgRPCクライアントツールの1つです。REPL(対話)モードとCLIモードの2つを切り替えることが出来ます。
evansは基本的にBloomRPCに出来ることは何でも出来る(+BloomRPCには出来ないgRPCリフレクションにも対応出来る)ので、CLIツールの方がスキな方にはevansがオススメです。
MacならHomebrewで簡単に導入できます。
$ brew tap ktr0731/evans
$ brew install evans
LinuxだとRelasesからファイルをダウンロードして解凍してやるとすぐ使えます。
-- ダウンロード後
$ tar -zxvf evans_linux_amd64.tar.gz
$ mv evans ~/.local/bin/
evansの良さ
REPLモードでの補完機能が優秀
evansは対話モードで実行した際、かなり気の利いた感じで補完を提案してくれるのでかなり楽にツール操作を行うことが出来ます。
gRPCリフレクション(Server Reflection)への対応
BloomRPC[4]及びgRPC公式のCLIツールのgprc_cliが未対応のgRPCリフレクションもevansなら対応済です。
gRPCリフレクションを利用する際は-r
オプション(--reflection
)を付けます。
CLIモードでの例を下記に示します。
-- サービスの列挙
$ evans -r cli list --port 1234
ClubManager
UserManager
grpc.reflection.v1alpha.ServerReflection
-- メソッドの列挙
$ evans -r cli list --port 1234 UserManager
UserManager.AddUser
UserManager.CountAlreadyUsers
UserManager.GetUser
UserManager.GetUsersByIds
UserManager.GetUsersByType
-- 特定のメソッドの定義確認
$ evans -r cli desc --port 1234 UserManager.AddUser
UserManager.AddUser:
rpc AddUser ( .User ) returns ( .UserResponse );
REPLモードでも同様のことが行えます。
4. 参考
- Core concepts, architecture and lifecycle | gRPC
- gRPC Reflection — gRPC Python 1.46.2 documentation
- gRPC と gRPC クライアントツール Evans | メルカリエンジニアリング
- LinuxでAppImage形式のアプリを使う方法と注意点のまとめ | virtualiment
- Add support for GRPC Server Reflection Protocol · Issue #1 · bloomrpc/bloomrpc
-
AppImageについてはこちらのLinuxでAppImage形式のアプリを使う方法と注意点のまとめ | virtualiment
の記事の解説が分かりやすく、参考になります。 ↩︎ -
gRPCではデータのやり取りをunary(単一)でやるかstreamingでやるかの2種類あり、それをclientとserverそれぞれがどちらを選択するかによって4つの通信方式のどれに分類されるかが決まります。今回例にしているBidirectional streaming RPCという通信方式の場合、client(request)もserver(response)も両方streamingの通信を行います。 ↩︎
-
特定の RPC 呼び出しに関する情報(認証の詳細など)。キーと値のペアのリスト形式で提供される。 ↩︎
-
2022年11月16日現在も対応継続中のよう。Add support for GRPC Server Reflection Protocol · Issue #1 · bloomrpc/bloomrpc ↩︎
Discussion