リモートプロシージャコール(RPC、Remote Procedure Call)は、ネットワーク越しに関数やメソッドを呼び出すための技術です。RPCを使用すると、分散システムやマイクロサービスアーキテクチャの実装が容易になります。PythonでRPCを実現するための方法としては、xmlrpc
、jsonrpc
、gRPC
などが利用できます。ここでは、Pythonのxmlrpc
ライブラリを使った基本的なRPCの例を紹介します。
RPCの基本概念
クライアント-サーバモデル
RPCは、クライアントがリモートサーバ上の関数を呼び出し、その結果を受け取るモデルです。
シリアライズ
引数や返り値をネットワーク越しに送信するために、データをシリアライズ(エンコード)します。
プロトコル
XML-RPC、JSON-RPC、gRPCなどのプロトコルを使用して、リクエストとレスポンスを構造化します。
例題1: XML-RPCを使った基本的なRPC
まず、XML-RPCを使った基本的なRPCの例を示します。
サーバの実装
以下のコードをrpc_server.py
として保存します。このサーバは、2つの数値の合計を計算する関数を提供します。
from xmlrpc.server import SimpleXMLRPCServer
def add(x, y):
return x + y
server = SimpleXMLRPCServer(("localhost", 8000))
print("Listening on port 8000...")
server.register_function(add, "add")
server.serve_forever()
クライアントの実装
以下のコードをrpc_client.py
として保存します。このクライアントは、リモートサーバのadd
関数を呼び出します。
import xmlrpc.client
proxy = xmlrpc.client.ServerProxy("http://localhost:8000/")
result = proxy.add(5, 3)
print(f"The result of add(5, 3) is: {result}")
サーバの起動
サーバを起動します。
python rpc_server.py
クライアントの実行
クライアントを実行します。
python rpc_client.py
この例では、サーバがポート8000でリッスンし、クライアントがadd
関数を呼び出してその結果を受け取ります。
例題2: JSON-RPCを使ったRPC
次に、JSON-RPCを使ったRPCの例を示します。ここでは、json-rpc
ライブラリを使用します。
ライブラリのインストール
pip install json-rpc
サーバの実装
以下のコードをjson_rpc_server.py
として保存します。このサーバは、2つの数値の積を計算する関数を提供します。
from jsonrpc import JSONRPCResponseManager, dispatcher
from http.server import BaseHTTPRequestHandler, HTTPServer
import json
@dispatcher.add_method
def multiply(x, y):
return x * y
class RequestHandler(BaseHTTPRequestHandler):
def do_POST(self):
response = JSONRPCResponseManager.handle(
self.rfile.read(int(self.headers['Content-Length'])),
dispatcher
)
self.send_response(200)
self.send_header('Content-type', 'application/json')
self.end_headers()
self.wfile.write(response.json.encode())
server = HTTPServer(('localhost', 8000), RequestHandler)
print("Listening on port 8000...")
server.serve_forever()
クライアントの実装
以下のコードをjson_rpc_client.py
として保存します。このクライアントは、リモートサーバのmultiply
関数を呼び出します。
import requests
import json
url = "http://localhost:8000/"
headers = {"content-type": "application/json"}
payload = {
"method": "multiply",
"params": [7, 6],
"jsonrpc": "2.0",
"id": 0,
}
response = requests.post(url, data=json.dumps(payload), headers=headers).json()
print(f"The result of multiply(7, 6) is: {response['result']}")
サーバの起動
サーバを起動します。
python json_rpc_server.py
クライアントの実行
クライアントを実行します。
python json_rpc_client.py
この例では、サーバがポート8000でリッスンし、クライアントがmultiply
関数を呼び出してその結果を受け取ります。
結論
RPC(リモートプロシージャコール)は、ネットワーク越しに関数やメソッドを呼び出すための強力な技術です。Pythonでは、xmlrpc
やjsonrpc
を使用して簡単にRPCを実装できます。RPCを使用することで、分散システムやマイクロサービスアーキテクチャの構築が容易になり、システム全体の柔軟性とスケーラビリティが向上します。基本的なRPCの実装から、JSON-RPCを使った高度な例まで、RPCの理解と適用は、ネットワークプログラミングにおいて非常に有用です。