gRPC入門
gRPCとProtocol Buffersの入門。
gRPC入門
このページでは、gRPCとProtocol Buffersを紹介します。gRPCは、Interface Definition Language (IDL) と基盤となるメッセージ交換フォーマットの両方としてProtocol Buffersを使用できます。gRPCまたはProtocol Buffersが初めての場合は、こちらをお読みください!すぐに実際にgRPCを試したい場合は、言語を選択してクイックスタートを試してください。
概要
gRPCでは、クライアントアプリケーションは、あたかもローカルオブジェクトであるかのように、別のマシン上のサーバーアプリケーションのメソッドを直接呼び出すことができるため、分散アプリケーションやサービスを簡単に作成できます。多くのRPCシステムと同様に、gRPCは、サービスを定義し、パラメータと戻り値の型とともにリモートで呼び出し可能なメソッドを指定するという考え方に基づいています。サーバー側では、サーバーはこのインターフェースを実装し、クライアント呼び出しを処理するためのgRPCサーバーを実行します。クライアント側では、クライアントはサーバーと同じメソッドを提供するスタブ(一部の言語では単にクライアントと呼ばれます)を持ちます。
gRPCクライアントとサーバーは、Google内のサーバーから自分のデスクトップまで、さまざまな環境で実行および通信でき、gRPCでサポートされているどの言語でも記述できます。そのため、たとえば、JavaでgRPCサーバーを作成し、Go、Python、またはRubyでクライアントを作成することが容易になります。さらに、最新のGoogle APIにはインターフェースのgRPCバージョンがあり、Googleの機能をアプリケーションに簡単に組み込むことができます。
Protocol Buffersの操作
デフォルトでは、gRPCはProtocol Buffersを使用しています。これはGoogleが提供する構造化データのシリアライズのための成熟したオープンソースメカニズムです(ただし、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というクラスが生成されます。このクラスをアプリケーションで使用して、Person Protocol Bufferメッセージを格納、シリアライズ、および取得できます。
gRPCサービスは、Protocol Bufferメッセージとして指定されたRPCメソッドのパラメータと戻り値の型を持つ通常のprotoファイルで定義します。
// 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は、protocと特別なgRPCプラグインを使用してprotoファイルからコードを生成します。生成されるのは、生成されたgRPCクライアントとサーバーコード、およびメッセージタイプを格納、シリアライズ、取得するための通常のProtocol Bufferコードです。Protocol Buffersの詳細については、gRPCプラグインとともにprotocを好みの言語にインストールする方法を含めて、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リポジトリから、またGo言語ジェネレータはgolang/protobuf公式パッケージから利用できます。さらに多くの言語が開発中です。詳細については、各言語で利用可能なproto3言語ガイドとリファレンスドキュメントを参照してください。リファレンスドキュメントには、.protoファイル形式の正式な仕様も含まれています。
一般的に、proto2(現在のデフォルトのProtocol Buffersバージョン)を使用することもできますが、gRPCではproto3を使用することを推奨します。これにより、gRPCでサポートされているすべての言語を使用でき、proto2クライアントとproto3サーバー間の互換性の問題、またはその逆の問題を回避できます。