LoginSignup
3
5

More than 3 years have passed since last update.

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

Posted at

概要

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

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

gRPCとは

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

とあります。気になるので公式のウェブサイトをみてみましょう。

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 します。

pip install grpcio grpcio-tools

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

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

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

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

python greeter_server.py

もう片方で

python greeter_client.py

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

Greeter client received: Hello, you!

と出れば成功です!!

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

ここでは、もともとあった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で、

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)

以上ができたら、以前の

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

python greeter_server.py

もう片方で

python greeter_client.py

を実行します。

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

こう出るはずです!

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

今回はこの辺で。

おわり。

3
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
5