上一篇,我们制定了一个很简单的RPC消息 的格式,但是还遗留了两个问题
其实,也没什么太大不同。既然是要带参数,那只能扩展原来的Request消息了,加个parameter成员,用于表示参数,具体的格式采用字典方式,{ ’arg1‘, arg1, ‘arg2‘, arg2 ,....}。 这样就可以解决多参数的表示问题。
class Request(object):
'''
@RPC请求,包含命令id和请求内容两部分。这个实现,与具体的RPC协议相关。
@这里是简化起见,采用python自身的字典作为其协议的数据结构
'''
def __init__(self):
'''
Constructor
'''
self.id = 0 #id的作用在于将Request和Response建立绑定关系.在异步调用时就有用
self.command = None #sayHello
self.parameter = {}
def __str__(self):
return ''.join(('id: ', str(self.id), ' command: ', str(self.command), ' parameter: ', str(self.parameter)))
Request : id = 3, command = 'add', parameter = {'a':1, 'b':2}def add(self, a, b):
req = Request()
req.id = 3
req.command = 'add'
req.parameter = {'a':a, 'b':b}
return self.request(req)那么服务端收到这个RPC请求后,怎么处理得到参数呢?一个传统而稍显笨拙的方式是:
def add(self, a, b):
return a + b
def procReqeust__add(self, req):
parameter = req.parameter
a = parameter.get('a')
b = parameter.get('b')
return self.add(a, b)
),每一个RPC调用,都要怎么处理一下,烦死了,没有任何技术含量的纯苦力活,但还考验细心,一不小心搞错a或者b的名字了,呵呵,等着被请喝茶吧。
这时候,大杀器上场,脚本语言就是找个好。总有你想不到的方便。直接上代码
def procReqeust__add(self, req):
parameter = req.parameter
return self.add(**parameter)
)
至此,使用这种新的方式,我们server的代码就是这个样子的,对没有参数的方法,上面**也是可以放心使用的
def procRequest(self,req):
rsp = Response()
rsp.id = req.id
if req.command == 'sayHello':
rsp.result = self.sayHello(**req.parameter)
elif req.command == 'add':
rsp.result = self.add(**req.parameter)
else:
raise Exception("unknown command")版权声明:本文为博主原创文章,未经博主允许不得转载。
一个简单RPC框架是如何炼成的(III)——实现带参数的RPC调用
原文:http://blog.csdn.net/crylearner/article/details/46899687