gRPC入門

gRPCとProtocol Buffersの紹介。

gRPC入門

gRPCとProtocol Buffersの紹介。

このページでは、gRPCとProtocol Buffersについて紹介します。gRPCは、インタフェース定義言語(IDL)と、基盤となるメッセージ交換形式の両方として、Protocol Buffersを使用できます。gRPCやProtocol Buffersを初めて使用する場合は、こちらをお読みください。まずgRPCの動作を見てみたい場合は、言語を選択して、そのクイックスタートをお試しください。

概要

gRPCでは、クライアントアプリケーションは、異なるマシン上のサーバーアプリケーションのメソッドを、ローカルオブジェクトであるかのように直接呼び出すことができるため、分散アプリケーションやサービスの作成が容易になります。多くのRPCシステムと同様に、gRPCはサービスを定義し、リモートで呼び出すことができるメソッドを、そのパラメータと戻り値の型とともに指定するという考えに基づいています。サーバー側では、サーバーはこのインターフェイスを実装し、クライアントの呼び出しを処理するためにgRPCサーバーを実行します。クライアント側では、クライアントは(一部の言語では単にクライアントと呼ばれる)スタブを持ち、サーバーと同じメソッドを提供します。

Concept Diagram

gRPCクライアントとサーバーは、Google内のサーバーから自分のデスクトップまで、さまざまな環境で実行してお互いに通信することができ、gRPCがサポートするどの言語でも記述できます。そのため、たとえば、JavaでgRPCサーバーを簡単に作成し、Go、Python、またはRubyでクライアントを作成できます。さらに、最新のGoogle APIにはインターフェイスのgRPCバージョンが搭載されているため、アプリケーションにGoogleの機能を簡単に組み込むことができます。

Protocol Buffersの使用

デフォルトでは、gRPCは、構造化されたデータをシリアル化するためのGoogleの成熟したオープンソースメカニズムであるProtocol Buffers(JSONなどの他のデータ形式でも使用できます)を使用します。これがどのように機能するかを簡単に紹介します。すでにProtocol Buffersに慣れている場合は、次のセクションに進んでください。

Protocol Buffersを使用する場合の最初のステップは、シリアル化するデータの構造をprotoファイルで定義することです。これは、.proto拡張子を持つ通常のテキストファイルです。Protocol Bufferデータはメッセージとして構造化されており、各メッセージは、フィールドと呼ばれる一連の名前と値のペアを含む、情報の小さな論理レコードです。簡単な例を次に示します。

message Person {
  string name = 1;
  int32 id = 2;
  bool has_ponycopter = 3;
}

次に、データ構造を指定したら、Protocol Bufferコンパイラprotocを使用して、proto定義から選択した言語でデータアクセスクラスを生成します。これらは、name()set_name()のような各フィールドへの単純なアクセサーと、構造全体を生のバイトにシリアル化/解析するメソッドを提供します。たとえば、選択した言語がC++の場合、上記の例でコンパイラを実行すると、Personというクラスが生成されます。その後、アプリケーションでこのクラスを使用して、PersonProtocol Bufferメッセージを生成、シリアル化、および取得できます。

RPCメソッドのパラメータと戻り値の型をProtocol Bufferメッセージとして指定して、通常のprotoファイルでgRPCサービスを定義します。

// The greeter service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}

// The response message containing the greetings
message HelloReply {
  string message = 1;
}

gRPCは、特別なgRPCプラグインを備えたprotocを使用して、protoファイルからコードを生成します。生成されたgRPCクライアントとサーバーのコードと、メッセージタイプを生成、シリアル化、および取得するための通常のProtocol Bufferコードが得られます。選択した言語でgRPCプラグインを使用してprotocをインストールする方法など、Protocol Buffersの詳細については、Protocol Buffersドキュメントを参照してください。

Protocol Bufferのバージョン

Protocol Buffersは、オープンソースユーザーがしばらく利用できるようになっていますが、このサイトのほとんどの例では、少し簡略化された構文、いくつかの便利な新機能、およびより多くの言語をサポートするProtocol Buffersバージョン3(proto3)を使用しています。Proto3は現在、Java、C++、Dart、Python、Objective-C、C#、lite-runtime(Android Java)、Ruby、およびJavaScriptで、Protocol Buffers GitHubリポジトリから、およびgolang/protobuf公式パッケージからGo言語ジェネレーターで利用でき、より多くの言語が開発中です。詳細については、proto3言語ガイドと、各言語で利用可能なリファレンスドキュメントを参照してください。リファレンスドキュメントには、.protoファイル形式の正式な仕様も含まれています。

一般的に、proto2(現在のデフォルトのProtocol Buffersバージョン)を使用できますが、gRPCではproto3を使用することをお勧めします。これにより、gRPCでサポートされているすべての言語を使用できるだけでなく、proto2クライアントとproto3サーバーが相互に通信する際の互換性の問題も回避できます。