概要
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
を追加します。
// 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
を更新します。
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)
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ファイルなどについて少し理解を深められたかと思います。
引き続きいろんなことを試し次第更新、もしくは別記事に書きたいと思います!!
今回はこの辺で。
おわり。