一个简单RPC框架是如何炼成的(II)——制定RPC消息
2015-07-16 21:22
591 查看
开局篇我们说了,RPC框架的四个核心内容
RPC数据的传输。
RPC消息 协议
RPC服务注册
RPC消息处理
下面,我们先看一个普通的过程调用
这是一个常见的过程调用的例子,client调用sayHello,实际委托给Server的sayHello方法来实现。但他不是RPC调用,因为起码不是远程的,另外,也没有我们提到的四个核心内容。于是我们的任务就是通过一点点的代码修改,为其引入RPC框架。
第一步,订协议。俗话说得好,没有规矩不成方圆。
还是继续能多简单就多简单。
RPC请求:Request, 包含一个请求id 和 一个请求命令,如‘sayHello'
同样的,对RPC Response,也定义如下
定义好协议之后,我就对Client稍作修改,将原来直接的接口调用 self.remote.sayHello更改为 send Request (command='sayHello')
然后,服务端也要相应修改,需要根据request请求中的command命令,调用具体的方法,并将执行结果封装到Response中,返回给客户端。
到这里,RPC框架中的RPC消息已经初具雏形,不过
我们并没有实现相应的encode和decode方法,没有基于可以跨设备的字符串传输,而是直接的内存变量传递。
现在的RPC request不支持带参数的请求命令。如add(a, b), 如何在RPC消息中描述参数a,b 。
这些问题我们在后面还会继续展开处理
RPC数据的传输。
RPC消息 协议
RPC服务注册
RPC消息处理
下面,我们先看一个普通的过程调用
class Client(object): def __init__(self): self.remote = None ## # 内部是委托给远程remote对象来获取结果。 def sayHello(self): if self.remote: return self.remote.sayHello() else : return None class Server(object): def __init__(self): pass def sayHello(self): return 'Hello World' if __name__ == '__main__': server = Server() client = Client() client.remote = server print(client.sayHello())
这是一个常见的过程调用的例子,client调用sayHello,实际委托给Server的sayHello方法来实现。但他不是RPC调用,因为起码不是远程的,另外,也没有我们提到的四个核心内容。于是我们的任务就是通过一点点的代码修改,为其引入RPC框架。
第一步,订协议。俗话说得好,没有规矩不成方圆。
还是继续能多简单就多简单。
RPC请求:Request, 包含一个请求id 和 一个请求命令,如‘sayHello'
class Request(object): ''' @RPC请求,包含命令id和请求内容两部分。这个实现,与具体的RPC协议相关。 @这里是简化起见,采用python自身的字典作为其协议的数据结构 ''' def __init__(self): ''' Constructor ''' self.id = 0 #id的作用在于将Request和Response建立绑定关系.在异步调用时就有用 self.command = None #sayHello def __str__(self): return ''.join(('id: ', str(self.id), ' command: ', str(self.command)))
同样的,对RPC Response,也定义如下
class Response(object): ''' @RPC回复。 包含答复id和执行结果两部分内容。其中答复id与对应的请求id一致。 @简单起见,协议的实现使用python自家的字典 ''' def __init__(self): ''' Constructor ''' self.id = 0 self.result = None def __str__(self): return ''.join(('id: ', str(self.id), ' result: ', str(self.result)))
定义好协议之后,我就对Client稍作修改,将原来直接的接口调用 self.remote.sayHello更改为 send Request (command='sayHello')
def sayHello(self): req = Request() // 构建一个RPC请求消息 req.id = 1 req.command = 'sayHello' return self.request(req) def request(self, req): rsp = self.remote.procRequest(req) // 将请求消息发送给远程服务端。但因为传输层这里还没实现,所以先暂时还是直接调用远端接口 return rsp.result
然后,服务端也要相应修改,需要根据request请求中的command命令,调用具体的方法,并将执行结果封装到Response中,返回给客户端。
def procRequest(self,req): rsp = Response() rsp.id = req.id if req.command == 'sayHello': rsp.result = self.sayHello() else: raise Exception("unknown command") return rsp
到这里,RPC框架中的RPC消息已经初具雏形,不过
我们并没有实现相应的encode和decode方法,没有基于可以跨设备的字符串传输,而是直接的内存变量传递。
现在的RPC request不支持带参数的请求命令。如add(a, b), 如何在RPC消息中描述参数a,b 。
这些问题我们在后面还会继续展开处理
相关文章推荐
- [Objective-C]-02-set get语法.类方法.self关键字与点语法
- HTTP协议详解
- ASP.NET网站前端页面的复制
- Java锁的种类
- Java--动态代理
- synergy使用配置<Server window7 Client Fedora21>
- Android中的UI更新
- 离线搭建 Android 集成开发环境
- display属性
- 一个简单RPC框架是如何炼成的(I)——开局篇
- Oracle库Delete删除千万以上普通堆表数据的方法
- Ducci Sequence解题报告
- Android初学习 - 明暗度,窗体透明等的设置技巧
- Monkey log异常分析说明
- CodeForces 546A Soldier and Bananas
- poj 3414 Pots(BFS)(简单题)
- 如何在struts2的action返回结果之后再来进行费时的数据库操作呢?
- Area - POJ 1265 Pick定理
- Gifview的使用
- C语言学习(第一天)