gRPCの人気がどんどん高まると共に、利用者数もどんどん多くなっています。そこで、一番人気のあるプログラミング言語であるPythonでgRPC通信を実現する方法をマスタする必要があります。本文では、Python gRPCという効率的なフレームワークでgRPC通信を行う手順を皆さんに紹介していこうと思います。
gRPCとは
gRPCは、Googleが開発したオープンソースの高性能なリモートプロシージャコール(RPC)フレームワークです。簡単に言うと、gRPCの「g」はGoogleのことを指していて、Googleが開発したRPCのことになります。

gRPCは、Protocol Buffers(protobuf)というシリアライゼーション形式を使用して、クライアントとサーバー間の効率的な通信を可能にします。クライアントとサーバーの間でストリームや双方向通信をサポートすることができます。また、多言語に対応しており、さまざまなプログラミング言語で使用することができます。

gRPCがなぜか利用される?
gRPCはマイクロサービスアーキテクチャや分散システム開発において注目されています。高速かつ効率的なサービス間通信が必要な場面で活用できるために、次のメリットがあると考えられています:
- 高速性: gRPCはHTTP/2を利用しているため、従来のRPCよりもはるかに高速に通信できます。
- 効率性: Protocol Buffersというバイナリ形式を利用することで、データサイズと処理時間が小さくなります。
- 多言語対応: gRPCはPython、Java、Go、C++など複数の言語を公式にサポートしています。
- コード生成: .protoファイルからクライアント/サーバのコードを自動生成できるため、生産性が向上します。
- インターフェイス定義: Protocol Buffersによってインターフェイスが明確に定義できます。
- スケーラビリティ: 大規模なサービスでもスケーリングしやすいアーキテクチャです。
- API開発しやすさ: RESTよりも開発しやすく、保守性も高いとされています。
Python gRPCとは?
Python gRPC とは、Pythonアプリケーション間で高速な通信を可能にするフレームワークです。Pythonでのマイクロサービス開発や、機械学習システムとの連携などで活用されています。
Python gRPCはどのように動作する?
Python gRPCフレームワークは、分散システムやマイクロサービスなどを構築するための高パフォーマンスなオープンソースフレームワークとして、サービス間でProtocol Buffersというデータ形式を使って構造化されたデータの送受信を実現します。 その動作の基本的な流れは次のようになります:
.proto
ファイル内でサービスを定義する- Protocol Buffersコンパイラを使って、サーバとクライアントのコードを生成する
- PythonのgRPC APIを利用して、定義したサービスの簡単なクライアントとサーバを記述する
gRPCの公式ドキュメントでは、サービスの定義方法、コードの生成方法、簡単なクライアント/サーバの実装方法がチュートリアル形式で紹介されています。このチュートリアルでは、事前にgRPCとProtocol Buffersの基本的な理解があることが前提となっています。
Python gRPCの使い方:PythonでgRPC通信を実現
Python gRPCを使い始めるには、まずgrpcio
とgrpcio-tools
パッケージをインストールする必要があります。これらのパッケージはターミナルで以下のコマンドを実行することでインストールできます。
pip install grpcio grpcio-tools
サービスを定義
パッケージのインストールが完了したら、.proto
ファイル内でサービスを定義します。このファイル内でサービスのメソッドや、APIが使用するデータ型を定義します。以下は.proto
ファイルの例です。
syntax = "proto3";
package myservice;
service MyService {
rpc MyMethod(MyRequest) returns (MyResponse) {}
}
message MyRequest {
string my_field = 1;
}
message MyResponse {
string my_field = 1;
}
サーバとクライアントのコード生成
次にgrpcio-tools
パッケージを使って、サーバとクライアントのコードを生成します。ターミナルで以下のコマンドを実行します。
python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. myservice.proto
このコマンドによってmyservice_pb2.py
とmyservice_pb2_grpc.py
の2つのファイルが生成されます。前者はデータ型を定義し、後者はサーバとクライアントのコードを含みます。
サーバーの構築
サーバを構築するには、リクエストを処理しレスポンスを返すPythonファイルを作成します。以下は簡単な実装例です。
import grpc
import myservice_pb2
import myservice_pb2_grpc
class MyServiceServicer(myservice_pb2_grpc.MyServiceServicer):
def MyMethod(self, request, context):
response = myservice_pb2.MyResponse()
response.my_field = "Hello, " + request.my_field
return response
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
myservice_pb2_grpc.add_MyServiceServicer_to_server(MyServiceServicer(), server)
server.add_insecure_port('[::]:50051')
server.start()
server.wait_for_termination()
クライアントの構築
最後に、サーバにリクエストを送信しレスポンスを受信するクライアントを作成します。以下は実装例です。
import grpc
import myservice_pb2
import myservice_pb2_grpc
channel = grpc.insecure_channel('localhost:50051')
stub = myservice_pb2_grpc.MyServiceStub(channel)
request = myservice_pb2.MyRequest()
request.my_field = "World"
response = stub.MyMethod(request)
print(response.my_field)
おすすめ:gPRCをテストできる無料ツール - Apidog
Apidogは、APIの設計、開発、デバッグ、テスト、モックなどの機能をも一体化した包括的なプラットフォームです。ApidogはgRPC APIに完璧に対応できる無料ツールとして、gRPCサービスをテストするために、次にようなことが実現できます。また、Apidogは日本語に対応しているので、非常に便利です。
gRPCプロジェクトの作成
Apidogのホームページで「新しいプロジェクト」ボタンをクリックして、gRPCプロジェクトを新規作成することができます。

Protoのインポート
gRPCは、API中心のテクノロジーなので、開発に移る前に、.protoファイルを通じて、サービス、方法およびメッセージを定義する必要があります。そこで、Apidogを使用して、gRPCの単体テストを行う前に、APIの定義として.protoファイルをインポートする必要があります。
初のインポート
現在、.protoファイルをインポートするには、2つの方式が利用できます。
- ローカルファイル
- .protoファイルのURL

- .protoファイルは1つのprotoとしてインポートされ、その中のserviceはサービスになり、rpcは方法になります。
- 当該.protoファイルは他の.protoファイルに依存している場合、手動で依存関係を追加する必要もあります。
- .protoファイルは他の.protoファイル内のserviceに依存している場合、その
package
は、選択の.proto
ファイルのpackage
と同じな場合、同じなProto
にインポートされます。
再インポート
インポートした.protoファイルが変更された場合、Apidogでそれを再インポートすることができます。Protoを右クリックして、「再インポート」をクリックします。

実行の方法
.protoファイルを使用して、 gRPCの方法を定義する場合、以下のように4つの方法が利用できます。
- Unary:一元実行
- Server Streaming:サーバーのストリーミング
- Client Streming:クライアントストリーミング
- Bidirectional Streaming:双方向ストリーミング
一元実行
一元の実行は、HTTPリクエストに似ています。アドレスバーにURLを入力して、「Message」タブでJSONフォーマットでメッセージを入力した後、「実行」ボタンをクリックします。

ストリーミング方式
ストリーミング方式は、Websocketの接続に似ています。「Message」タブでJSONフォーマットでメッセージを入力して送信できます。サーバーストリーミング、クライアントストリーミング、双方向ストリーミングは、全てストリーミング方式に属しています。
Apidogは、タイムラインを備えており、時間順に実行の状態、送受信のメッセージを表示します。メッセージをクリックすると、メッセージの詳細を見ることができるので非常に便利です。

高度なオプション
動的値の自動生成
Apidog は、.protoファイルの内容を識別できるので、「自動生成」をクリックして、送信メッセージを自動的に生成できます。また、動的値ボタンをクリックして、動的値を利用することもできます。

変数の使用
gRPCのメッセージとMetadataで、Apidogの変数を利用できます。

TLSをオンにする
gRPC APIは、TLSを通じて安全に接続することができます。
Apidogを使用すると、URLの前のプロトコルをクリックして、TLSの状態を快適に切り替えます。
また、URLに「grpcs://」を使用すると、ApidogはTLSをオンにします。それに対して、「grpc://」の場合は、TLSは無効になります。

サーバーのURLと環境の管理
URLアドレスの右側にある「+」アイコンをクリックして、現在利用中のサーバーURLを環境に追加することができます。

そして、右上で環境やサーバーのURLを選択し、URLの設定を「デフォルトを継承」にすることで、すべての方法も同じなURLで単体テストを行うようになります。

ProtoファイルとAPIのパラメータを確認
Protoファイルの内容を確認
Apidogの左側にメニューツリーのProtoをクリックすると、Protoファイルのオリジナル内容を確認できます。

リクエストとレスポンスのパラメータを確認
gRPCはシーケンス化フォーマットとしてProtoBufを使用しています。これは、メッセージの送受信の際に、各メッセージがProtoBufフォーマットで転送されることを意味しています。ProtoBufは、他のテキストに基づくフォーマット(JSON,XML)とは異なり、バイナリ形式なので、人間がそれを読み書きしたりすることが難しくなります。
そこで、ApidogでgRPC APIを呼び出す際には、すべてのメッセージをJSONフォーマットで作成したり、表示したりしています。
APIの情報ページで、JSONフォーマットで表示されているレスポンスとパラメータの情報を確認できます。

ProtoBufは、 JSONデータとの間、次のようなマッピング関係が存在しています。
PROTOBUF 3 | JSON | JSONのサンプル |
---|---|---|
message | object | {"fooBar": v, "g": null, …} |
enum | string | "FOO_BAR" |
map<K,V> | object | {"k": v, …} |
repeated V | array | [v, …] |
bool | true, false | true, false |
string | array | "Hello World!" |
bytes | base64 string | "YWJjMTIzIT8kKiYoKSctPUB+" |
int32, fixed32, uint32 | number | 1, -10, 0 |
int64, fixed64, uint64 | string | "1", "-10" |
float, double | number | 1.1, -10.0, 0, "NaN", "Infinity" |
まとめ
結論として、{{python grpc}}
は高速かつ効率的なAPIを構築するのに役立つ強力なフレームワークです。RPCモデルとProtocol Buffersデータ形式を使用することで、大量のデータを扱うAPIを簡単に構築できます。grpcio
とgrpcio-tools
パッケージのおかげで、サーバーとクライアントのコードを簡単に生成し、APIをすぐに構築できます。
Apidogのようなツールを使用することで、gRPCサービスを安全で効率的にテストすることができるので、gRPCサービスの可用性と信頼性を確保するために不可欠なツールになるのでしょう。