一个简单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 动画⑤音视 ...
随机推荐
- jumpserver 安装python 报错
环境centos7.5 pip3 insatll ./python-gssapi-0.6.4.tar.gz 报错 Command "python setup.py egg_info&quo ...
- Configure Tomcat 7 to run Python CGI scripts in windows(Win7系统配置tomcat服务器,使用python进行cgi编程)
Pre-installation requirements1. Java2. Python steps1. Download latest version of Tomcat (Tomcat 7) f ...
- 【uva 1025】A Spy in the Metro
[题目链接]:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...
- Spring MVC学习总结(6)——一些Spring MVC的使用技巧
APP服务端的Token验证 通过拦截器对使用了 @Authorization 注解的方法进行请求拦截,从http header中取出token信息,验证其是否合法.非法直接返回401错误,合法将to ...
- 以Append方式打开文件,设置偏移量无效
#include<stdio.h> int main() { FILE * fd = fopen("btoo1.c", "ab+"); fpos_t ...
- HTML5学习笔记简明版(11):新增的API
HTMLDocument上的扩展 HTML5在DOM Level 2 HTML上扩展了一些HTMLDocument的接口.这些接口在全部实现了Document接口的元素对象上进行了实现. HTML5在 ...
- 灵活的运用Model类
1.定义接口 using System; using System.Collections.Generic; using System.Linq; using System.Web; namespac ...
- Linux系统病毒防治
Linux系统病毒防治 一.Linux病毒的历史 1996年出现的Staog是Linux系统下的第一个病毒,它出自澳大利亚一个叫VLAD的组织.Staog病毒是用汇编语言编写,专门感染二进制文件,并通 ...
- rem的解决方案
http://www.qdfuns.com/notes/32967/37b8f127797c6c2b66f2c1dc6d133e45.html rem 作为一个低调的长度单位,由于手机端网页的兴起,在 ...
- 威联通212P 在admin用户密码正确情况下仍然无法登录WEB页面解决办法
*登录 telnet 执行以下语句: [~] # cp /etc/default_config/passwd /mnt/HDA_ROOT/.config/passwd[~] # cp /etc/def ...