Go言語でgRPCに入門してみた4 grpcurlで動作確認

2020/10/07に公開

gRPCの動作確認

RESTのAPIサーバなどの動作確認にはcurlコマンドを使うことが多いと思いますが(あとはjq)、それのgRPCサーバ版がないかなぁ、と思ったらありました。
早速、使ってみます。

https://github.com/fullstorydev/grpcurl

brew install grpcurl

ちなみにEvansというツールもあるようで、今回は使いませんでしたが、もっと本格的にgRPCサーバを構成する時にはこちらも良さそうではありました。
https://engineering.mercari.com/blog/entry/grpc_and_evans/

gRPCサーバをリフレクションを使えるように改造する

動作確認の前にgRPCサーバがリフレクションを使えるようにします。
元のgRPCサーバはこちらの記事で作成したサーバ側に手を加えることにします。

https://zenn.dev/miyazi777/articles/dbed823239aa17a9c82b

リフレクションというのは、gRPCサーバが公開しているサービス・メソッドを知ることができるもののようです。
と言ってもやるとは単純で、以下のようにreflection.Register関数で起動するサーバを登録するだけです。

server.go

import ("google.golang.org/grpc/reflection" <- こんなパッケージをimportする
    …
)
…
    server := grpc.NewServer()
    hello.RegisterHelloServer(server, &Hello{})
    reflection.Register(server)   <- 追加
    server.Serve(listenPort)

これでgrpcurlでgRPCサーバを叩く準備が出来ました。

サービス一覧表示

まずはサービスの一覧を表示してみます。

grpcurl -plaintext -import-path . -proto hello.proto localhost:19003 list


Hello
grpc.reflection.v1alpha.ServerReflection

リフレクション対応していれば、protoファイルを指定しなくても下記のコマンドで大丈夫です。

grpcurl -plaintext localhost:19003 list

メソッド一覧表示

grpcurl -plaintext localhost:19003 list Hello

Hello.hello

メソッドの詳細取得

grpcurl -plaintext localhost:19003 describe Hello.hello

Hello.hello is a method:
rpc hello ( .HelloMessage ) returns ( .HelloResponse );

メソッドの呼び出し

grpcurl -plaintext -d '{ "name": "world" }' localhost:19003 Hello.hello

{
  "msg": "hello world\n"
}

メタデータを付ける

認証でbearer tokenを付ける必要がある場合は以下のような感じでメタデータを指定する。

grpcurl -plaintext -d '{ "name": "world" }' -rpc-header 'authorization: Bearer testtoken' localhost:19003 Hello.hello

参考

https://kiririmode.hatenablog.jp/entry/20181008/1538984412#試すために
https://github.com/fullstorydev/grpcurl

Discussion