Go ProtobufとgRPC-GatewayによるデュアルパーパスAPIの構築
James Reed
Infrastructure Engineer · Leapcell

はじめに
今日の相互接続されたソフトウェアランドスケープでは、マイクロサービスアーキテクチャと多様なクライアントアプリケーションが一般的です。これはしばしば課題を提示します。パフォーマンスが高く型安全なAPIを内部サービス間通信のために構築し、同時に外部Webベースのクライアントにとってアクセス可能で慣用的なものにするにはどうすればよいでしょうか?従来のRESTful APIは外部のコンシューマーにとっては十分かもしれませんが、サービス間通信で望まれる強力な型付けと効率性が欠けていることがよくあります。逆に、純粋なgRPCは内部シナリオで優れていますが、Webブラウザから直接利用することはできません。この記事では、Go、GoogleのProtocol Buffers(Protobuf)、およびgRPC-Gatewayを使用して、API定義の単一の真実のソースを作成し、内部gRPCコンシューマーと外部RESTfulクライアントの両方に効果的にサービスを提供する強力なソリューションを探ります。この組み合わせが開発をどのように簡素化し、冗長性を削減し、より保守可能でスケーラブルなAPIエコシステムを促進するかを探ります。
コアコンセプト
実装に飛び込む前に、関連する主要なテクノロジーを明確に理解しましょう。
-
Protocol Buffers (Protobuf):構造化データをシリアライズするための、言語に依存せず、プラットフォームに依存せず、拡張可能なメカニズムです。Protobufは、
.proto
ファイルを使用してデータスキーマを定義し、インターフェース定義言語(IDL)として機能します。このスキーマから、コンパイラはマーシャリングおよびアンマーシャリングデータのためのさまざまな言語(Goなど)のコードを生成します。そのバイナリシリアライズは非常に効率的であり、高性能通信に理想的です。 -
gRPC:高性能でオープンソースのユニバーサルRPCフレームワークです。Protobuf上に構築されたgRPCは、シリアライズ、ネットワーク通信、メソッド呼び出しを自動的に処理します。ストリーミング、認証、ロードバランシングなどの機能もサポートしており、サービス間通信の堅牢な選択肢となっています。Protobufから派生した強力な型付けは、コンパイル時チェックと信頼性の高いデータ契約を保証します。
-
gRPC-Gateway:Protobufコンパイラのプラグインであり、リバースプロキシサーバーを生成します。このプロキシは、HTTP/JSONリクエストをgRPCリクエストに変換し、実際のgRPCサービスに転送します。また、gRPCレスポンスをHTTP/JSONレスポンスに変換します。本質的に、gRPC-Gatewayは、gRPCサービスを従来のRESTful APIとして公開することを可能にし、特別なgRPCクライアントライブラリを必要とせずに、Webブラウザやその他のHTTPクライアントが利用できるようにします。
デュアルパーパスAPIの構築
このアプローチの背後にある核となるアイデアは、Protobufを使用してAPIを一度定義することです。この単一の定義は、gRPCサービスとそのgRPC-Gatewayによって生成されたRESTfulの反対の両方の契約として機能します。
1. ProtobufでAPIを定義する
「Todo」サービス用の簡単なAPIを定義することから始めましょう。proto/todo/todo.proto
という名前のファイルを作成します。