0. 背景
实现远程方法调用(RPC)的主要功能目标是让构建分布式计算(应用)更容易,在提供强大的远程调用能力时不损失本地调用的语义简洁性。 为实现该目标,RPC 框架需提供一种透明调用机制让使用者不必显式的区分本地调用和远程调用。 下面我们将具体细化stub
结构的实现。
RPC 结构拆解如下图所示:
图1. RPC结构拆解
RPC 服务方通过 RpcServer
去导出(export)远程接口方法,而客户方通过 RpcClient 去引入(import)远程接口方法。 客户方像调用本地方法一样去调用远程接口方法,RPC 框架提供接口的代理实现,实际的调用将委托给代理 RpcProxy
。 代理封装调用信息并将调用转交给 RpcInvoker
去实际执行。 在客户端的 RpcInvoker
通过连接器 RpcConnector
去维持与服务端的通道 RpcChannel
, 并使用 RpcProtocol
执行协议编码(encode)并将编码后的请求消息通过通道发送给服务方。
RPC 服务端接收器 RpcAcceptor
接收客户端的调用请求,同样使用 RpcProtocol
执行协议解码(decode)。 解码后的调用信息传递给 RpcProcessor
去控制处理调用过程,最后再委托调用给 RpcInvoker
去实际执行并返回调用结果。
基于消息传输层如sockets
,ZeroMQ
的基础之上,本文使用Python的multiprocessing.connections
实现远程方法调用(RPC)。
1. 代码
远程方法调用的代码框架十分简单,具体可分为三部分:rpchandler
, rpcserver
, rpcclient
。其中rpchandler
为远程调用的服务类,在rpcserver
中新建一个rpchandler
类的实例,注册(导出)供远程调用的方法,并且运行server,而rpcclient
中新建一个proxy实例代理客户端。
a) rpchandler.py
在rpchandler.py
中,将函数请求、参数和返回值使用pickle
编码后,在不同的解释器直接传送pickle
字节字符串,可以很容易的实现RPC。下面是一个简单的PRC处理器,可以被整合到一个处理器(handler)中去:
# -*- coding: utf-8 -*-
# rpchandler.py
import pickle
class RPCHandler(object):
def __init__(self):