gRPC - What is gRPC?の和訳

この記事は2019/02/19時点の[What is gRPC?](https://grpc.io/docs/guides/)を和訳したものです。Go - Quick Startの和訳は[こちら](https://qiita.com/tikidunpon/items/8070643838396ca31c77)
 

--- 

この文書では、gRPCとプロトコルバッファについて紹介します。 gRPCは、プロトコルバッファをそのインタフェース定義言語（IDL）とその基礎となるメッセージ交換フォーマットの両方として使用できます。 gRPCやプロトコルバッファに不慣れな方は、このドキュメントをお読みください。最初にgRPCの動作を確認したい場合は、[クイックスタート](https://grpc.io/docs/quickstart/)をご覧ください。  

## 概要 

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

![gRPC](https://grpc.io/img/landing-2.svg)

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

## プロトコルバッファの使用  

デフォルトでは、gRPCは、構造化データをシリアル化するためのGoogleの成熟したオープンソースメカニズムであるプロトコルバッファを使用します（ただし、JSONなどの他のデータ形式でも使用できます）。これがどのように動作するかの簡単な紹介です。プロトコルバッファについてすでにご存じの場合は、次のセクションに進んでください。

プロトコルバッファを扱う時の最初のステップは、プロトファイルでシリアル化したいデータの構造を定義することです。これは、拡張子が`.proto`の通常のテキストファイルです。プロトコルバッファデータはメッセージとして構造化されています。各メッセージは、フィールドと呼ばれる一連の名前と値のペアを含む情報の小さな論理レコードです。これが簡単な例です。

```proto

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

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

この例で詳しく説明するように、プロトコルバッファメッセージとしてRPCメソッド引数と戻り値の型を指定して、通常のプロトファイルでgRPCサービスを定義します。

```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プラグインを使用すると、生成されたgRPCクライアントおよびサーバーコード、およびメッセージタイプの生成、直列化、および取得のための通常のプロトコルバッファコードが得られます。この例については、後で詳しく説明します。

プロトコルバッファの詳細については、プロトコルバッファのドキュメントを参照してください。また、選択した言語のクイックスタートでgRPCプラグインを使用して`protoc`を取得およびインストールする方法を見つけることができます。

## プロトコルバッファのバージョン  

プロトコルバッファは暫く前からオープンソースユーザーが利用可能でしたが、私たちの例はproto3と呼ばれるプロトコルバッファの新しいフレーバーを使います。これはわずかに単純化された構文、いくつかの役に立つ新機能を持ち、そしてもっと多くの言語をサポートします。これは現在、[protocol buffers GitHub repo](https://github.com/google/protobuf/releases)からJava、C ++、Python、Objective-C、C＃、lite-runtime（Android Java）、Ruby、およびJavaScript、ならびに、[golang/protobuf GitHub repo](https://github.com/golang/protobuf)のGo言語ジェネレータで利用可能で、開発中の言語も増えています。あなたは[proto3言語ガイド](https://developers.google.com/protocol-buffers/docs/proto3)と各言語のために利用可能な[リファレンスドキュメント](https://developers.google.com/protocol-buffers/docs/reference/overview)でより多くを見つけることができます。リファレンスドキュメントには、`.proto`ファイル形式の[正式な仕様](https://developers.google.com/protocol-buffers/docs/reference/proto3-spec)も含まれています。

通常、proto2（現在のデフォルトのプロトコルバッファバージョン）を使用できますが、proto3サーバーと通信するproto2クライアント（あるいはその逆）との互換性の問題を回避するだけでなく、gRPCでサポートされているすべての言語を使用できるのでproto3をgRPCと共に使用することをお勧めします。