第5章 gRPC:基本を越えて
この作品はAIを使って翻訳されている。ご意見、ご感想をお待ちしている:translation-feedback@oreilly.com
実際のgRPCアプリケーションを構築する際には、送受信RPCのインターセプト、ネットワーク遅延のレジリエンス処理、エラー処理、サービスとコンシューマ間のメタデータの共有などの要件を満たすために、さまざまな機能を追加する必要があるかもしれない。
注
一貫性を保つため、この章のサンプルはすべてGoを使って説明している。Javaに詳しい方は、ソースコードリポジトリにあるJavaのサンプルを参照し、同じ使用例を参考にしてほしい。
この章では、サーバ側とクライアント側で RPC をインターセプトするための gRPC インターセプタの使用、RPC が完了するまでの待ち時間を指定するためのデッドラインの使用、サーバ側とクライアント側でのエラー処理のベストプラクティス、同じサーバ上で複数のサービスを実行するためのマルチプレクシングの使用、アプリケーション間でカスタムメタデータを共有すること、他のサービスを呼び出すときにロードバランサと名前解決のテクニックを使用すること、ネットワーク帯域幅を効果的に使用するための RPC 呼び出しの圧縮など、gRPC の主要な高度な機能を学習します。
gRPCインターセプターの話を始めよう。
インターセプター
gRPCアプリケーションを構築する際、クライアント、サーバアプリケーションのいずれにおいても、リモート関数の実行前または実行後に、いくつかの共通ロジックを実行したい場合がある。gRPC では、インターセプタと呼ばれる拡張メカニズムを使用して、ロギング、認証、メトリックなどの特定の要件を満たすために、RPC の実行をインターセプトすることができます。gRPC は、クライアント、サーバ gRPC アプリケーションにインターセプタを実装し、インストールするための簡単な API を提供します。インターセプタはgRPCの主要な拡張機構の一つであり、ロギング、認証認可、メトリック、トレース、その他顧客の要求などのユースケースで非常に有用である。
注
インターセプターはgRPCをサポートするすべての言語でサポートされているわけではないし、各言語のインターセプターの実装は異なるかもしれない。本書では、GoとJavaのみを取り上げる。
gRPCインターセプターは、インターセプトするRPC呼び出しのタイプによって2種類に分類できる。単項RPCの場合は単項インターセプターを、ストリーミングRPCの場合はストリーミングインターセプターを使用する。これらのインターセプタは、gRPCサーバ側でもgRPCクライアント側でも使うことができる。まず、サーバ側でのインターセプタの使い方から見ていこう。
サーバ側インターセプター
クライアントがgRPCサービスのリモートメソッドを呼び出す場合、サーバ側インターセプターを使用することで、リモートメソッドの実行前に共通のロジックを実行することができる。これは、リモート・メソッドを呼び出す前に認証などの特定の機能を適用する必要がある場合に役立つ。図 5-1 に示すように、開発する gRPC サーバに 1 つ以上のインターセプタをプラグインすることができる。例えば、新しいサーバ側インターセプタをOrderManagement gRPC サービスにプラグインするには、インターセプタを実装し、gRPC サーバ作成時に登録する。