5分でできるgRPC チュートリアル

## 概要
gRPC について調べたことをまとめました。
また、公式のチュートリアルをpythonで動かしてみました。

適宜触り次第更新していきます。


## gRPCとは
gRPCとは、オープンソースの高機能な Remote Procedure Call フレームワークです。gRPCにより、クライアント/サーバーのアプリケーション間の通信が透明になり、かつ簡単に構築できます。

とあります。気になるので[公式のウェブサイト](https://grpc.io/docs/guides/)をみてみましょう。


## gRPCを使うことで何がうれしいのか
gRPCを使うと、リモート上のサーバの関数をローカルのもののように呼ぶことができ、これにより分散されたサービスやアプリケーションを作るのが楽になります。
gPRCをサポートした言語で書けるので、gPRCサーバを Javaで書き、clientをpythonで書く、みたいなことも容易にできます。ここでの違う言語間のコミュニケーションの複雑さが、　gPRCによってハンドリングされます。


## Protocol Buffer について
gPRCではProtocol Bufferというものがデフォルトでは使われ（jsonなどのフォーマットを使うことも可能です）ます。Protocol Bufferは .protoファイルで定義されますが、その形式はXMLファイルなどに比べてとても軽い（3~10倍軽い）、また、高速（20~100倍速い）です。この.protoファイルにサービスで使うメソッドや、データのやりとりに使う構造体を定義すると、そのシリアライゼーションやディシリアライゼーションは、protoコンパイラを通すことで簡単に行うことができます。それにより、各言語で転送される構造体を扱うアクセッサ（クラス）が定義され、構造体のプロパティなどを設定できるセッターやゲッターなども勝手に作られます。
したがって、.protoファイルを定義することで、各言語間であってもサービスを簡単に構築できる、また、シリアライゼーションなどの差異も吸収してくれるということです。
すごい！！

というわけで、PythonとC++でチュートリアルやってみます。


## gRPCチュートリアル

### Python
必要なものをpip install します。

```bash
pip install grpcio grpcio-tools
```

このとき、最新のバージョンが入ってないかも知れないので、`grpcio` のバージョンの確認をきちんとしときましょう！

必要なレポジトリをクローンします。

```bash
git clone -b v1.28.1 https://github.com/grpc/grpc && cd grpc/examples/python/helloworld
```

２つターミナル開いて、片方で

```bash
python greeter_server.py
```


もう片方で

```bash
python greeter_client.py
```

をやってみます。
クライアント側で、

```bash
Greeter client received: Hello, you!
```
と出れば成功です！！


さらに、gRPCのサービスにもう１つメソッドを追加してみます。

ここでは、もともとあった```SayHello```に加え、```SayHelloAgain```を追加します。


```examples/protos/helloworld.proto
// The greeting service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply) {}
  // Sends another greeting
  rpc SayHelloAgain (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;
}
```

サービスを更新します。

`examples/python/helloworld`で、

```bash
python -m grpc_tools.protoc -I../../protos --python_out=. --grpc_python_out=. ../../protos/helloworld.proto
```

を実行し、
`greeter_server.py` 及び`greeter_client.py` を更新します。

```greeter_server.py
class Greeter(helloworld_pb2_grpc.GreeterServicer):

  def SayHello(self, request, context):
    return helloworld_pb2.HelloReply(message='Hello, %s!' % request.name)

  def SayHelloAgain(self, request, context):
    return helloworld_pb2.HelloReply(message='Hello again, %s!' % request.name)

```

```greeter_client.py
def run():
  channel = grpc.insecure_channel('localhost:50051')
  stub = helloworld_pb2_grpc.GreeterStub(channel)
  response = stub.SayHello(helloworld_pb2.HelloRequest(name='you'))
  print("Greeter client received: " + response.message)
  response = stub.SayHelloAgain(helloworld_pb2.HelloRequest(name='you'))
  print("Greeter client received: " + response.message)

```

以上ができたら、以前の

２つターミナル開いて、片方で

```bash
python greeter_server.py
```


もう片方で

```bash
python greeter_client.py
```

を実行します。


```bash
Greeter client received: Hello, you!
Greeter client received: Hello again, you!
```

こう出るはずです！



今回は、gRPCについて調べ、
公式のチュートリアルを走らせ、.protoファイルなどについて少し理解を深められたかと思います。
引き続きいろんなことを試し次第更新、もしくは別記事に書きたいと思います！！


今回はこの辺で。

おわり。