背景
$ grpcurl -plaintext localhost:10000 list
Failed to list services: server does not support the reflection API
grpcurlを使おうとしたら「サーバーがreflection APIをサポートしてないよ」って言われた
Reflection APIとは?
Server Reflectionという機能は端的に説明すると、protocコマンドでサーバを生成する際に利用していた.protoファイルと同等のものを返してくれるAPIです。これにより手元に.protoファイルがなくてもエンコードを行うことができます。
Server Reflectionが実装されていないgRPCサーバーでも簡単に叩けるCLIを作る
Reflection APIを有効にする
数行追加するだけでできた
import (
// ============= 省略 ============= //
+ "google.golang.org/grpc/reflection"
// ============= 省略 ============= //
)
// ============= 省略 ============= //
func main() {
// ============= 省略 ============= //
// gRPCサーバーのインスタンスを作成.
grpcServer := grpc.NewServer(opts...)
// サービスの実装をgRPCサーバに登録.
chat.RegisterChatServer(grpcServer, newServer())
+ // reflection serviceをgRPCサーバーに登録.
+ reflection.Register(grpcServer)
// サーバーのServe()をポートの詳細とともに呼び出す.
// プロセスがキルされるかStop()が呼ばれるまでブロッキング待機.
grpcServer.Serve(lis)
}
できた
$ grpcurl -plaintext localhost:10000 list
chat.Chat
grpc.reflection.v1alpha.ServerReflection