一个简单RPC框架是怎样炼成的(II)——制定RPC消息
开局篇我们说了,RPC框架的四个核心内容
- 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框架。
俗话说得好,没有规矩不成方圆。
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中,返回给client。
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 。
一个简单RPC框架是怎样炼成的(II)——制定RPC消息的更多相关文章
- 一个简单RPC框架是怎样炼成的(IV)——实现RPC消息的编解码
之前我们制定了一个非常easy的RPC消息 的格式,可是还遗留了两个问题,上一篇解决掉了一个.还留下一个 我们并没有实现对应的encode和decode方法,没有基于能够跨设备的字符串传输,而是直接的 ...
- 一个简单RPC框架是怎样炼成的(V)——引入传输层
开局篇我们说了,RPC框架的四个核心内容 RPC数据的传输. RPC消息 协议 RPC服务注冊 RPC消息处理 接下来处理传输数据.实际应用场景一般都是基于socket.socket代码比較多, ...
- 一个简单RPC框架是怎样炼成的(I)——开局篇
开场白,这是一个关于RPC的相关概念的普及篇系列,主要是通过一步步的调整,提炼出一个相对完整的RPC框架. RPC(Remote Procedure Call Protocol)--远程过程调用协议, ...
- 一个简单RPC框架是怎样炼成的(VI)——引入服务注冊机制
开局篇我们说了.RPC框架的四个核心内容 RPC数据的传输. RPC消息 协议 RPC服务注冊 RPC消息处理 接下来处理RPC服务的注冊机制.所谓注冊机制,就是Server须要声明支持哪些rpc方法 ...
- 远程服务调用RPC框架介绍,微服务架构介绍和RPC框架对比,dubbo、SpringClound对比
远程服务调用RPC框架介绍,微服务架构介绍和RPC框架对比,dubbo.SpringClound对比 远程服务调用RPC框架介绍,RPC简单的来说就是像调用本地服务一样调用远程服务. 分布式RPC需要 ...
- 搭建一个简单struts2框架的登陆
第一步:下载struts2对应的jar包,可以到struts官网下载:http://struts.apache.org/download.cgi#struts252 出于学习的目的,可以把整个完整的压 ...
- SCSI miniport 驾驶一个简单的框架
前段时间,只需用一台新电脑,由于资金有限没有匹配了心仪已久的SSD.我没感觉到飞翔的感觉,总不甘心,仔细想想.我死了相当大的存储,我们可以假设部分内存作为硬盘驱动器把它弄出来.不会比固态硬盘的速度快, ...
- vue+vux-ui+axios+mock搭建一个简单vue框架
1.首先感谢同事 2.之前一直在做angularjs的项目,目前vue火热,所以自己搭建了一个的vue框架,在此作为记录 vue+vux-ui这里就不介绍了,有很多博客都写的很详细了. 下面简单记录下 ...
- web 全栈 学习 2 一个好的页面是如何炼成的
第一章:Web页面内容的构成2.Web内容的分工一个Web页面可能的构成(视觉上看):①文字.链接.标题②交互入口(表单元素)③图片(哪些类型)④动画 Flash动画 HTML5 CSS3 动画⑤音视 ...
随机推荐
- bzoj1618 购买干草
Description 约翰的干草库存已经告罄,他打算为奶牛们采购日(1≤日≤50000)磅干草.他知道N(1≤N≤100)个干草公司,现在用1到N给它们编号.第i个公司卖的干草包重量为Pi(1≤Pi ...
- [洛谷P3932]浮游大陆的68号岛
题目大意:有一行物品,每两个物品之间有一个距离.每个物品有一个价值.现在问你若干问题,每个问题问你把l~r所有物品全部搬到物品x处需要多少价值. 把物品a搬到物品b处的价值为物品a的价值乘a到b的距离 ...
- [Codeforces 816A]Karen and Morning
题目大意:给你一个时间(hh:mm),求最少经过多少分钟才能使这个时间变成回文. 解题思路:模拟,先判断0的情况,然后每过1分钟判断一次即可. C++ Code: #include<cstdio ...
- linu基础入门(一)
原创作品,允许转载,转载时请务必声明作者信息和本声明. https://www.cnblogs.com/zhu520/p/10730550.html 本人小白,有错指出.谢谢! 一:根据上一步安装与新 ...
- 【uva 1025】A Spy in the Metro
[题目链接]:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...
- [DLX精确覆盖+打表] hdu 2518 Dominoes
题意: 就是给12种图形,旋转,翻折.有多少种方法构成n*m=60的矩形 思路: 裸的精确覆盖.就是建图麻烦 个人太挫,直接手写每一个图形的各种形态 须要注意的是最后的答案须要除以4 代码: #inc ...
- 30.angularJS第一个实例
转自:https://www.cnblogs.com/best/tag/Angular/ AngularJS 通过 ng-directives 扩展了 HTML. ng-app 指令定义一个 Angu ...
- Entity Framework之Model First开发方式
一.Model First开发方式 在项目一开始,就没用数据库时,可以借助EF设计模型,然后根据模型同步完成数据库中表的创建,这就是Model First开发方式.总结一点就是,现有模型再有表. 二. ...
- update-alternatives 命令
update-alternatives 命令 1.功能作用 update-alternatives是dpkg的实用工具,用来维护系统命令的符号链接,以决定系统默认使用什么命令. 在Debian系统中, ...
- while my time-- , will the meaning++?
// while my time--,will the meaning++? // However,what's the meaning of life ? while(tomorrow>0){ ...