一个简单RPC框架是怎样炼成的(IV)——实现RPC消息的编解码
之前我们制定了一个非常easy的RPC消息 的格式,可是还遗留了两个问题,上一篇解决掉了一个。还留下一个
- 我们并没有实现对应的encode和decode方法,没有基于能够跨设备的字符串传输,而是直接的内存变量传递。
如今的RPC request不支持带參数的请求命令。如add(a, b), 怎样在RPC消息中描写叙述參数a,b 。
详细的RPC消息的封装协议非常多。常见的是基于xml,json封装的。但假设抽象一下,实际也就是一个编解码,管你编码成什么内容呢。就是不编码也能够。管他黑猫白猫。仅仅要能传过去,就是好猫。
利用python里的两个运算。
str 和eval。
'a' : 1, 'b' : 2}", 注意变成字符串喽。
'a' : 1, 'b' : 2}")-->msg, 做一个eval运算,又从字符串变成 字典变量了。
设计已定,剩下的就仅仅是code filling。
class Request(object):
def __str__(self):
return str({'id':self.id, 'command':self.command, 'parameter':self.parameter})
然后引入encode方法
@classmethod
def encode(cls, message):
if isinstance(message, Request):
return str(message)
elif isinstance(message, Response):
return str(message)
elif isinstance(message, Notification):
return str(message)
else:
raise Exception('unknown type when encode')
相同的,引入decode方法,略微复杂一些。基本的麻烦在于怎样区分解码出来的是Response还是Request
@classmethod
def decode(cls, data):
info = eval(data)
if 'command' in info:
request = Request()
request.id = info.get('id')
request.command = info.get('command')
request.parameter = info.get('parameter', {})
return request
elif 'result' in info:
response = Response()
response.id = info.get('id')
response.result = info.get('result')
return response
elif 'message' in info:
note = Notification()
note.message = info.get('message')
return note
else:
raise Exception('unknown data when decode')
另外,client和server的代码也要稍作调整,那个非常easy,调用一下上面的 方法就能够了。这里不贴了。
- Request和Resonse的定义能够一直不变。
- encode 和decode方法,如孙大圣。是能够千变万化的。假设採用xml或者json或者其它的描写叙述,仅仅要自己定义encode和decode方法就可以
- 从更高的层次看,RPC消息,事实上就是对函数调用的一个描写叙述,所以充其量就是view。既然是view。实际自由度是非常大的。
一个简单RPC框架是怎样炼成的(IV)——实现RPC消息的编解码的更多相关文章
- 一个简单RPC框架是怎样炼成的(II)——制定RPC消息
开局篇我们说了,RPC框架的四个核心内容 RPC数据的传输. RPC消息 协议 RPC服务注冊 RPC消息处理 以下,我们先看一个普通的过程调用 class Client(object): def _ ...
- 一个简单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 框架 7:网络通信之自定义协议(粘包拆包、编解码)
当 RPC 框架使用 Netty 通信时,实际上是将数据转化成 ByteBuf 的方式进行传输. 那如何转化呢?可不可以把 请求参数 或者 响应结果 直接无脑序列化成 byte 数组发出去? 答:直接 ...
- 远程服务调用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这里就不介绍了,有很多博客都写的很详细了. 下面简单记录下 ...
随机推荐
- Mysql的学习随笔day2
关于输入中文的问题,各种更改完utf8后仍然乱码. 最后找到一种可行的方法:在insert之前,输入 set names 'gbk' 约束保证数据的完整性和一致性.约束分为表级约束和列级约束,前者可以 ...
- [Cocos2dx] CCCamera照相机 详解
前言 在3D游戏当中,我们经常会使用到照相机这个东西,无论你使用的是哪一款引擎,都会用到,同时,照相机这个东西涉及到的东西比较多,基础知识需要扎实一些才可以. 如何使用 很久之前做项目的时候用到过一次 ...
- ROS知识(9)----安装Turtlebot2和远程控制Turtlebot2
安装turtlebot2,场景为:turtlebot2上搭载着一台电脑主机A,该电脑作为主机Master,有自带的电源和3D传感器,roscore在该台机器上启动.pc电脑远程连接A,和A通讯,pc不 ...
- 手把手教你搭建nuget服务器
新建web项目 工具:VS2013 版本:.Net Framework 4.6,低版本也行,不过要找到对应版本的Nuget.Server 装了NuGet客户端(百度如何安装) WebForm或MVC都 ...
- PostgreSQL教程收集(中文文档/命令行工具/常用命令)
http://www.postgres.cn/docs/9.6/index.html(中文文档) https://www.postgresql.org/docs/10/static/auth-meth ...
- Tasker to auto record incoming or outgoing call
Tasker to auto record incoming or outgoing call most of time, i was thinking of tasker can do the jo ...
- DU 4609 3-idiots FFT
题意还是比较好懂. 给出若干个木棍的长度,问这些木棍构成三角形的可能性. 那么公式很容易知道 就是这些木棍组成三角形的所有情况个数 除以 从n个木棍中取3个木棍的情况数量C(n, 3) 即可 但是很显 ...
- [android]ShareSDK——内容分享和短信验证
前言 新版本号ShareSDK的分享和短信验证,按官网的文档,都须要加入一个<Activity></Activity>标签,而分享和短息验证的这个标签内容都一样.会冲突. 解决 ...
- 使用stream(流)实现多表数据传输
使用stream(流)实现多表数据传输 几乎所有的TCP和HTTP通信控件都支持stream(流)的传输. 使用stream(流)是可以实现多表数据传输的. 但这需要自定义协议了: 合并后的strea ...
- Appium+python自动化5-Appium Inspector
前言 appium Inspector从入门到放弃!反正你都打开了,那就看下为什么要放弃吧! Appium Inspector是appium自带的一个元素定位工具,上一篇介绍了如何使用uiaut ...