一、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 文件,表示服务端。
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 文件,代表客户端,在代码中对服务端提供的函数(服务)进行调用。
# 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 服务在调用时必须保持函数名和参数格式一致才能调用成功。