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):
# rpc functions map
self._functions = {}

本文介绍了使用Python的multiprocessing.connections模块实现远程方法调用(RPC)的详细过程,包括rpchandler、rpcserver和rpcclient的代码示例。通过建立连接器维持服务端和客户端的通道,利用协议编码和解码进行调用请求和结果传输。文章还讨论了RPC的安全性和异常处理策略。
最低0.47元/天 解锁文章
1975

被折叠的 条评论
为什么被折叠?



