RPC:Pythonでのリモートプロシージャコール

リモートプロシージャコール(RPC、Remote Procedure Call)は、ネットワーク越しに関数やメソッドを呼び出すための技術です。RPCを使用すると、分散システムやマイクロサービスアーキテクチャの実装が容易になります。PythonでRPCを実現するための方法としては、xmlrpcjsonrpcgRPCなどが利用できます。ここでは、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では、xmlrpcjsonrpcを使用して簡単にRPCを実装できます。RPCを使用することで、分散システムやマイクロサービスアーキテクチャの構築が容易になり、システム全体の柔軟性とスケーラビリティが向上します。基本的なRPCの実装から、JSON-RPCを使った高度な例まで、RPCの理解と適用は、ネットワークプログラミングにおいて非常に有用です。

        タイトルとURLをコピーしました