gRPCリフレクションとは?解説
gRPCリフレクションは、gRPCサーバーが実行時に自身のサービスを記述できるようにするプロトコルで、クライアントやツールが.protoファイルなしでメソッドを発見して呼び出せるようにします。
gRPCはバイナリのprotobufフォーマットを使うため、通常サーバーと通信するには.protoスキーマが必要です。gRPCリフレクションは実行時にその要件を取り除きます。サーバーは要求に応じて自身のサービス定義を渡せるのです。これにより、gRPCサービスの対話的なデバッグやCIのsmoke testが格段に容易になります。ちょうどcurlがRESTを気軽に叩けるようにするのと同じです。
gRPCリフレクションとは何か
gRPCリフレクションは、gRPCサーバーが有効化できる標準サービスで、提供するサービスやメソッドに関するメタデータを公開します。クライアントはこのリフレクションサービスに問い合わせて、利用可能なメソッドやメッセージの形を把握し、ローカルのスキーマなしで動的に呼び出しを構築します。
なぜ便利なのか
リフレクションがなければ、gRPCサーバーを呼び出すあらゆるツールに、対応する.protoファイルをコンパイルして組み込む必要があります。リフレクションを使えば、grpcurlのような汎用ツールがその場でメソッドを一覧表示して呼び出せます。これはまさに、探索的なテストや素早いヘルスチェックに求められるものです。
セキュリティ上のトレードオフ
リフレクションは、サーバーに到達できる誰に対してもサービスを広告します。開発では素晴らしいものの、APIの表面を露呈しないよう本番ではしばしば無効化されます。一般的なパターンは、devやCIの環境ではリフレクションをオンにし、本番ではオフにすることです。
CIにおけるgRPCリフレクション
pipelineでは、gRPCサービスをservice containerとして起動し、リフレクション対応のツールでメソッドを呼び出してsmoke testにできます - サーバーが起動して正しく応答していることを確認するのに - テストのjobにprotobufをコンパイルして組み込む必要はまったくありません。
# Smoke-test a gRPC service via reflection in CI
steps:
- run: grpcurl -plaintext localhost:50051 list
- run: grpcurl -plaintext -d '{"id":1}' localhost:50051 my.Service/GetLatchkeyについて
service containerやgrpcurlのようなツールは、GitHubホストのrunnerと同じようにLatchkeyのrunnerでも動作するため、リフレクションベースのgRPC smoke testは特別な設定なしで機能します。
重要なポイント
- gRPCリフレクションは、サーバーが実行時に自身のサービスを記述できるようにし、クライアントがローカルの.protoを必要としないようにする。
- grpcurlのような汎用ツールによる対話的な呼び出しやCIのsmoke testを支える。
- リフレクションはAPIの表面を公開するため、通常はdevとCIで有効化され、本番では無効化される。