Apidog

オールインワンのAPI開発プラットフォーム

API設計

API仕様書生成

API設計

API Mock

APIテスト自動化

無料登録
Home / 操作ガイド / 2024最新ガイド:PythonでgRPC通信を実現する

2024最新ガイド:PythonでgRPC通信を実現する

gRPCの人気がどんどん高まると共に、利用者数もどんどん多くなっています。そこで、一番人気のあるプログラミング言語であるPythonでgRPC通信を実現する方法をマスタする必要があります。本文では、Python gRPCという効率的なフレームワークでgRPC通信を行う手順を皆さんに紹介していこうと思います。

gRPCの人気がどんどん高まると共に、利用者数もどんどん多くなっています。そこで、一番人気のあるプログラミング言語であるPythonでgRPC通信を実現する方法をマスタする必要があります。本文では、Python gRPCという効率的なフレームワークでgRPC通信を行う手順を皆さんに紹介していこうと思います。

gRPCとは

gRPCは、Googleが開発したオープンソースの高性能なリモートプロシージャコール(RPC)フレームワークです。簡単に言うと、gRPCの「g」はGoogleのことを指していて、Googleが開発したRPCのことになります。

gRPCとは?gRPCを徹底的に解説する
ネットでgRPCというものをよく見ることがありますね。それでは、このgRPCはどういうものなのでしょうか?本文では、gRPCについて徹底的に解説します。

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

gRPCのデータ送信プロセス

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というデータ形式を使って構造化されたデータの送受信を実現します。  その動作の基本的な流れは次のようになります:

  1. .protoファイル内でサービスを定義する
  2. Protocol Buffersコンパイラを使って、サーバとクライアントのコードを生成する
  3. PythonのgRPC APIを利用して、定義したサービスの簡単なクライアントとサーバを記述する

gRPCの公式ドキュメントでは、サービスの定義方法、コードの生成方法、簡単なクライアント/サーバの実装方法がチュートリアル形式で紹介されています。このチュートリアルでは、事前にgRPCとProtocol Buffersの基本的な理解があることが前提となっています。

Python gRPCの使い方:PythonでgRPC通信を実現

Python gRPCを使い始めるには、まずgrpciogrpcio-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.pymyservice_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は日本語に対応しているので、非常に便利です。

button

gRPCプロジェクトの作成

Apidogのホームページで「新しいプロジェクト」ボタンをクリックして、gRPCプロジェクトを新規作成することができます。

grpcgRPCプロジェクトの作成

Protoのインポート

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

初のインポート

現在、.protoファイルをインポートするには、2つの方式が利用できます。

  • ローカルファイル
  • .protoファイルのURL
grpcProtoのインポート
  • .protoファイルは1つのprotoとしてインポートされ、その中のserviceはサービスになり、rpcは方法になります。
  • 当該.protoファイルは他の.protoファイルに依存している場合、手動で依存関係を追加する必要もあります。
  • .protoファイルは他の.protoファイル内のserviceに依存している場合、そのpackage は、選択の .protoファイルの packageと同じな場合、同じな Protoにインポートされます。

再インポート

インポートした.protoファイルが変更された場合、Apidogでそれを再インポートすることができます。Protoを右クリックして、「再インポート」をクリックします。

grpcProtoの再インポート

実行の方法

.protoファイルを使用して、 gRPCの方法を定義する場合、以下のように4つの方法が利用できます。

  • Unary:一元実行
  • Server Streaming:サーバーのストリーミング
  • Client Streming:クライアントストリーミング
  • Bidirectional Streaming:双方向ストリーミング

一元実行

一元の実行は、HTTPリクエストに似ています。アドレスバーにURLを入力して、「Message」タブでJSONフォーマットでメッセージを入力した後、「実行」ボタンをクリックします。

grpc一元実行

ストリーミング方式

ストリーミング方式は、Websocketの接続に似ています。「Message」タブでJSONフォーマットでメッセージを入力して送信できます。サーバーストリーミング、クライアントストリーミング、双方向ストリーミングは、全てストリーミング方式に属しています。

Apidogは、タイムラインを備えており、時間順に実行の状態、送受信のメッセージを表示します。メッセージをクリックすると、メッセージの詳細を見ることができるので非常に便利です。

grpcストリーミング方式

高度なオプション

動的値の自動生成

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

grpc動的値の自動生成

変数の使用

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

grpc変数の使用

TLSをオンにする

gRPC APIは、TLSを通じて安全に接続することができます。

Apidogを使用すると、URLの前のプロトコルをクリックして、TLSの状態を快適に切り替えます。

また、URLに「grpcs://」を使用すると、ApidogはTLSをオンにします。それに対して、「grpc://」の場合は、TLSは無効になります。

grpc TLSをオンにする
button

サーバーのURLと環境の管理

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

grpc サーバーのURLと環境の管理

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

URLの設定を「デフォルトを継承」にする

ProtoファイルとAPIのパラメータを確認

Protoファイルの内容を確認

Apidogの左側にメニューツリーのProtoをクリックすると、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"
button

まとめ

結論として、{{python grpc}}は高速かつ効率的なAPIを構築するのに役立つ強力なフレームワークです。RPCモデルとProtocol Buffersデータ形式を使用することで、大量のデータを扱うAPIを簡単に構築できます。grpciogrpcio-toolsパッケージのおかげで、サーバーとクライアントのコードを簡単に生成し、APIをすぐに構築できます。

Apidogのようなツールを使用することで、gRPCサービスを安全で効率的にテストすることができるので、gRPCサービスの可用性と信頼性を確保するために不可欠なツールになるのでしょう。

Apidogのニュースレターを購読する

今すぐ購読すると、いつでもApidogから更新情報と最新観点を手に入れることができます。