ユナリーインターセプター
実践的な一般的パターンの例を通じて、GoaサービスのユナリーgRPCインターセプターの実装方法を学びます。
Goaサービスは標準的なgRPCインターセプターを使用するため、標準パターンに従う任意のgRPC インターセプターを使用できます。このガイドでは、実際の使用例から、Goaサービスとうまく 連携する効果的なgRPCインターセプターの作成方法を説明します。
gRPCインターセプターは、メタデータの処理、接続管理、メッセージ変換などのプロトコルレベルの 関心事に焦点を当てるべきです。ビジネスロジックやサービスのペイロードとリザルトへの型安全な アクセスには、代わりにGoaインターセプターを使用してください。Goaインターセプターはサービスの ドメイン型に直接アクセスでき、ビジネスレベルの関心事により適しています。
gRPCは、異なるユースケースに対応する2種類のインターセプターをサポートしています:
ユナリーインターセプター:従来のAPIコールのような単一のリクエスト/レスポンスRPCを 処理します。これらは実装がより簡単で、最も一般的な種類です。
ストリームインターセプター:クライアント、サーバー、または両方が複数のメッセージを 送信できるストリーミングRPCを処理します。これらはストリームのライフサイクルのより複雑な 処理が必要です。
以下は、gRPCインターセプターが特に有用な一般的なシナリオです:
GoaサービスのgRPCインターセプターを実装する際は:
プロトコルの関心事に焦点を当てる:メタデータ処理などのプロトコルレベルの操作には gRPCインターセプターを使用します。ビジネスロジックにはGoaインターセプターを使用します。
コンテキストを適切に処理する:常にコンテキストのキャンセルを尊重し、コンテキスト値を 正しく伝播させます。
一貫性を保つ:予測可能な動作のために、サービス全体で同じインターセプターパターンを 適用します。
パフォーマンスを考慮する:インターセプターはすべてのリクエストで実行されるため、 効率的に保ちます。
エラー処理:適切なgRPCステータスコードを使用し、関連するエラー詳細を含めます。
テスト:エラーケースとコンテキストのキャンセルを含め、インターセプターを徹底的に テストします。
以下は、gRPCインターセプターをGoaサービスと統合する方法です:
func main() {
// インターセプター付きのgRPCサーバーを作成
srv := grpc.NewServer(
grpc.UnaryInterceptor(grpc_middleware.ChainUnaryServer(
// プロトコルレベルの関心事をgRPCインターセプターで処理
MetadataInterceptor(),
LoggingInterceptor(),
MonitoringInterceptor(),
)),
grpc.StreamInterceptor(grpc_middleware.ChainStreamServer(
StreamMetadataInterceptor(),
StreamLoggingInterceptor(),
StreamMonitoringInterceptor(),
)),
)
// Goa gRPCサーバーを登録
pb.RegisterServiceServer(srv, server)
}
この例は以下を示しています:
go-grpc-middleware
パッケージを使用した複数のインターセプターのチェーン