1. はじめに
gRPCはGoogleが開発したオープンソースのRPC (Remote Procedure Call) フレームワークで、2015年に公開されました。HTTP/2を通信プロトコルとして使用し、データのシリアル化にはProtocol Buffers(ProtoBufとも呼ばれる)を使用することが特徴です。
2. gRPCの特徴
-
Protocol Buffersとは
Protocol BuffersはGoogleが開発したバイナリ形式のデータ表現フォーマットです。JSONやXMLよりも効率的にデータをシリアライズ・デシリアライズすることが可能です。また、プログラミング言語に依存しない独自のスキーマ定義言語を持っており、このスキーマを基に各言語用のコードが生成されます。 -
HTTP/2による高速通信
HTTP/2を使用することで、従来のHTTP/1.1よりも高速な通信を実現しています。HTTP/2の特徴として、ヘッダー圧縮や多重ストリーム、サーバープッシュなどがあり、これにより効率的な通信が可能となっています。 -
ストリーミング
gRPCは4種類のストリーミングをサポートしています:
単一リクエスト/単一レスポンス
単一リクエスト/ストリームレスポンス
ストリームリクエスト/単一レスポンス
ストリームリクエスト/ストリームレスポンス
これにより、リアルタイムの通信や大量のデータを効率よく扱うことが可能です。 -
複数言語のサポート
gRPCは様々なプログラミング言語をサポートしており、C++, Java, Python, Go, Node.jsなどの多くの言語で利用することができます。これにより、異なる技術スタックを持つシステム間でも容易に通信を行うことができます。 -
デッドライン/タイムアウトのサポート
gRPCのクライアントは、リクエストにデッドライン(タイムアウト)を指定することができます。これにより、レスポンスが返ってこない場合にクライアントが適切な処理を行うことができます。 -
認証と認可
gRPCは、SSL/TLSによるトランスポート層のセキュリティや、Googleトークンベースの認証をサポートしています。
3. サンプル実装
Pythonでの簡単なgRPCのサーバーとクライアントの実装を示します。
3.1 ProtoBufの定義
まず、サービスとメッセージを定義する.protoファイルを作成します。
syntax = "proto3";
service Greeter {
rpc SayHello (HelloRequest) returns (HelloResponse);
}
message HelloRequest {
string name = 1;
}
message HelloResponse {
string message = 1;
}
3.2 サーバーの実装
from concurrent import futures
import grpc
import hello_pb2
import hello_pb2_grpc
class Greeter(hello_pb2_grpc.GreeterServicer):
def SayHello(self, request, context):
return hello_pb2.HelloResponse(message='Hello, %s!' % request.name)
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
hello_pb2_grpc.add_GreeterServicer_to_server(Greeter(), server)
server.add_insecure_port('[::]:50051')
server.start()
server.wait_for_termination()
3.3 クライアントの実装
import grpc
import hello_pb2
import hello_pb2_grpc
channel = grpc.insecure_channel('localhost:50051')
stub = hello_pb2_grpc.GreeterStub(channel)
response = stub.SayHello(hello_pb2.HelloRequest(name='Qiita'))
print("Greeter client received: " + response.message)
これで、サーバーを起動し、クライアントを実行すると、"Hello, gRPC User!"というメッセージが表示されます。