Python RPC | 连载 01 - RPC

2022-09-28 16:27:52 浏览数 (1)

一、RPC

RPC(远程过程调用) 既 Remote Procedure Call Protocol 的缩写,RPC 可以实现客户端像调用本地函数一样调用远程服务器的方法(服务)。

RPC 可以基于 TCP/UDP,也可以基于 HTTP 进行网络传输,那么 RPC 与 HTTP 接口有什么区别呢?

RPC 与 HTTP 接口在客户端使用方式不同

HTTP 接口只关注服务方,不关注客户端,只要客户端调用,返回数据即可,RPC 接口则要求客户端遵循服务端定义的服务的规则。

RPC 与 HTTP 接口面向的对象不同

RPC 的调用是面向方法的,而 HTTP 接口是面向资源的。

RPC 与 HTTP 接口的序列化协议不同

HTTP 接口通常使用的序列化协议是 JSON 或者 XML,而 RPC 接口使用的序列化协议则为 JSON-RPC 或者 XML-RPC。

RPC 的优势

HTTP 是无状态的,也就说建立连接获取到返回数据之后就会关闭连接,RPC 是可以保持长连接的。并且 RPC 基于 TCP 传输效率更高。

RPC 还可以基于 TCP 开发自定义的协议,自定义的协议可以优化数据的传输效率。

二、XML-RPC

XML-RPC 全称为 XML Remote Procedure Call,既 XML 远程过程调用,它是一套允许运行在不同的操作系统、不同环境的程序实现基于网络调用的规范和实现。

XML-RPC 使用 HTTP 作为传输协议,XML 作为传送信息的编码格式。XML-RPC 的定义尽可能的保持了简单,能够发送、处理和返回复杂的数据结构。

  • 客户端存根:存放服务端的地址消息,然后再将客户端的请求参数打包成网络消息,通过网络发送给服务端。
  • 服务端存根:接收客户端发过来的消息,将消息解包成具体的参数,再调用指定的本地方法。

xmlrpc

Python 中包含一个 xmlrpc 标准库,可以创建基于 XML 传输格式的 RPC 客户端和服务端。

首先创建一个 xmlrpc_server.py 文件,表示服务端。

代码语言:javascript复制
from xmlrpc.server import SimpleXMLRPCServer


class Calculator:

    def add(self, x, y):
        return x   y

    def multiply(self, x, y):
        return x * y

    def subtract(self, x, y):
        return abs(x - y)

    def divide(self, x, y):
        return x / y


cal = Calculator()

xml_rpc_server = SimpleXMLRPCServer(("localhost", 8000))

xml_rpc_server.register_instance(instance=cal)
print("Listening on 8000")
xml_rpc_server.serve_forever()

接着创建一个 xmlrpc_client.py 文件,代表客户端,在代码中对服务端提供的函数(服务)进行调用。

代码语言:javascript复制
# Date: 2022/9/11

from xmlrpc import client

server = client.ServerProxy("http://localhost:8000")
print(server.multiply(5, 7))

启动 xmlrpc_server.py,然后运行 xmlrpc_client.py 就可以输出结果 35

根据客户端的调用可以确定,RPC 服务不同于 HTTP 服务,RPC 服务时没有 URL 地址之类的,RPC 服务的调用必须使用指定的代理,而 HTTP 服务可以是不同的客户端进行调用。

RPC 服务强调的是调用效果,就像调用本地函数一样调用远程服务。RPC 服务在调用时必须保持函数名和参数格式一致才能调用成功。

0 人点赞