Skip to content
Latchkey

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をコンパイルして組み込む必要はまったくありません。

gRPC smoke test using reflection
# 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/Get

Latchkeyについて

service containerやgrpcurlのようなツールは、GitHubホストのrunnerと同じようにLatchkeyのrunnerでも動作するため、リフレクションベースのgRPC smoke testは特別な設定なしで機能します。

重要なポイント

  • gRPCリフレクションは、サーバーが実行時に自身のサービスを記述できるようにし、クライアントがローカルの.protoを必要としないようにする。
  • grpcurlのような汎用ツールによる対話的な呼び出しやCIのsmoke testを支える。
  • リフレクションはAPIの表面を公開するため、通常はdevとCIで有効化され、本番では無効化される。

関連ガイド