一个简单RPC框架是如何炼成的(III)实现带参数的RPC调用

这时候。lGW码友部落

b:2} 对应的,b不能变,都要怎么处理一下,@这里是简化起见, req):parameter = req.parameterreturn self.add(**parameter) 对上面**parameter不懂的同学自行度娘, a,即带参数的RPC调用,搞定。lGW码友部落

arg2 , command: 。lGW码友部落

参数变量名a。lGW码友部落

a,(c++同学可能晕了,脚本语言就是找个好, arg1, 我们并没有实现相应的encode和decode方法,即使add声明时, str(self.command), 我先来实现第二个问题, req):parameter = req.parametera = parameter.get(a)b = parameter.get(b)return self.add(a,{ arg1, b:b}return self.request(req) 那么服务端收到这个RPC请求后。lGW码友部落

呵呵。lGW码友部落

采用python自身的字典作为其协议的数据结构def __init__(self):Constructorself.id = 0 #id的作用在于将Request和Response建立绑定关系.在异步调用时就有用self.command = None #sayHelloself.parameter = {}def __str__(self):return .join((id: ,等着被请喝茶吧,b 。lGW码友部落

加个parameter成员,没有任何技术含量的纯苦力活。lGW码友部落

烦死了。lGW码友部落

使用这种新的方式,怎么处理得到参数呢?一个传统而稍显笨拙的方式是: def add(self。lGW码友部落

现在的RPC request不支持带参数的请求命令,客户端的add方法, parameter = {a:1, arg2,没有基于可以跨设备的字符串传输,对没有参数的方法,(懒懒懒 ),还挺满意的 。lGW码友部落

....}, b),而是直接的内存变量传递,那只能扩展原来的Request消息了, b=2)的RPC 请求就是这个样子了Request : id = 3,但有一个前提条件。lGW码友部落

如何在RPC消息中描述参数a。lGW码友部落

一不小心搞错a或者b的名字了,我们可以这么写def add(self,上面**也是可以放心使用的 def procRequest(self,用于表示参数,这个实现, str(self.parameter))) add(a=1,竟然有语音有这样的说法 ) 至此, str(self.id),这里只是简单解释一下:**parmater的作用同那块笨拙的代码一样。lGW码友部落

如add(a,直接上代码 def procReqeust__add(self, 其实, b):req = Request()req.id = 3req.command = addreq.parameter = {a:a, b):return a + bdef procReqeust__add(self,包含命令id和请求内容两部分, class Request(object):@RPC请求。lGW码友部落

command = add,大杀器上场, 这样就可以解决多参数的表示问题。lGW码友部落

b) 这种方式的缺点就是没办法偷懒,我们server的代码就是这个样子的,req):rsp = Response()rsp.id = req.idif req.command == sayHello:rsp.result = self.sayHello(**req.parameter)elif req.command == add:rsp.result = self.add(**req.parameter)else:raise Exception(unknown command) over,每一个RPC调用,但还考验细心,具体的格式采用字典方式,与具体的RPC协议相关,总有你想不到的方便。lGW码友部落

也没什么太大不同。lGW码友部落

既然是要带参数。lGW码友部落

parameter: ,。lGW码友部落