大型分布式C++框架《三:序列化与反序列化》
一、前言
个人感觉序列化简单来说就是按一定规则组包。反序列化就是按组包时的规则来接包。正常来说。序列化不会很难。不会很复杂。因为过于复杂的序列化协议会导致较长的解析时间,这可能会使得序列化和反序列化阶段成为整个系统的瓶颈。就像压缩文件、解压文件,会占用大量cpu时间。
二、分配序列化空间的大小
说序列化之前先说下平台给序列化分配的buf的空间大小
三、序列化步骤
1、我们先看下请求。
oCntlInfo.setOperatorUin(10458);oCntlInfo.setOperatorKey("abcde");oCntlInfo.setRouteKey(1234);std::string source = "aaaaa";std::string inReserve;std::string errmsg;std::string outStr;std::string machineKey;for(int i =0;i<500*1024;i++){machineKey.append("a");}AoActionInfo oActionInfo;oActionInfo.SetDisShopId(1111);oActionInfo.SetDistributorId(2222);uint32_t dwResult = Stub4App.AddActionSupplier(oCntlInfo,machineKey,source,1,1,oActionInfo,inReserve,errmsg,outStr);if(dwResult == 0){std::cout << "Invoke OK!" << std::endl;std::cout << "Invoke OK!" << std::endl;}
客户端直接调用函数接口。到服务端请求结果
函数的入参都是我们需要序列化的内容。注意这里是rpc调用的一个关键点。
2、序列化开始
a) 先看下我们的thritf
如果下图。发现我们的函数入参也是打上了tag标志的。作用跟我们在结构体中打tag标志是一样的。为了标识一个字段的含义。
序列化的时候把这些tag序列化进去。 然后反序列化的时候靠这些tag来解析
b ) 先把图贴出来。按着图来讲更清晰些
CByteStream(
char
* pStreamBuf = NULL, uint32_t nBufLen = 0,
bool
bStore=
true
,
bool
bRealWrite =
true
);
1)int32_t* pLen = (int32_t*)bs.getRawBufCur(); 2)bs << 0; 3)int32_t iLen=bs.getWrittenLength(); 4)Serialize_w(bs); 5)*pLen = bs.getWrittenLength() - iLen;
f)最后对整个_Cao_action_AddActionSupplier_Req写了两个字节的包尾
其实我们可以看到我们的这种序列化,很整齐。很规则。比较紧凑。但是并不节省空间。这个里面有很多数据可以压缩的。但是压缩带来一个问题就是解压的时候很消耗cpu的。跟我的业务场景不服和。也没必要。
四、序列化解析
其实知道了数据是怎么写入的 解析起来就很容易了。其实这种序列化就是两边约定规则。知道规则以后就可以解析了
解析的具体步骤就不详细说了。这里说下解析的时候几个特殊的地方
五、话外
我们的这一套就是远程调用rpc服务。通过我们的序列化。
其实就能了解所谓的RPC服务是什么样的。
说白了,远程调用就是将对象名、函数名、参数等传递给远程服务器,服务器将处理结果返回给客户端。
为了能解析出这些信息。在入参的时候做上标识(这里是打tag).
谷歌的protobuf也用过。跟thrift其实差不多但是序列化和反序列的话的具体实现是有些不同的。
谷歌的protobuf更节省空间
以前具体看过序列化的源码。觉得序列化反序列化以及rpc很神秘。现在看了源码才发现确实写的确实好,
但是没那么神秘里。其实就是按一定规则组包。所以还是要多看源码啊。
我们用的thrift就是 facebook的thrift。但是改了些东西。大体是一样的。
大型分布式C++框架《三:序列化与反序列化》相关推荐
- 大型分布式C++框架《四:netio之请求包中转站 上》
本来一篇文章就该搞定的.结果要分上下篇了.主要是最近颈椎很不舒服.同时还在做秒杀的需求也挺忙的. 现在不能久坐.看代码的时间变少了.然后还买了两本治疗颈椎的书.在学着,不过感觉没啥用.突然心里好害怕. ...
- 分布式服务框架-原理与实践:14---流量控制-学习笔记(理论篇)
2019独角兽企业重金招聘Python工程师标准>>> 上次学了灰度发布,这次我们学习流控. ============================================ ...
- 分布式任务调度框架XXL-JOB --配置部署
配置部署"调度中心" 调度中心项目:xxl-job-admin 作用:统一管理任务调度平台上调度任务,负责触发调度执行,并且提供任务管理平台. 步骤一:调度中心配置: 调度中心配置 ...
- 搭建大型分布式服务(十四)SpringBoot整合dubbo starter
一.本文要点 接上文,我们已经把SpringBoot整合mybatis+Hikari+es+redis+kafka了,本文将介绍SpringBoot如何整合dubbo.系列文章完整目录 dubbo注解 ...
- dubbo-快速入门-分布式RPC框架Apache Dubbo
文章目录 分布式RPC框架Apache Dubbo 1. 软件架构的演进过程 1.1 单体架构 1.2 垂直架构 1.3 SOA架构 1.4 微服务架构 2. Apache Dubbo概述 2.1 D ...
- 深度解析大型分布式电商网站演变过程以及构架部署解决方案
前言: 本文是学习大型分布式网站架构的技术总结.对架构一个高性能,高可用,可伸缩,可扩展的分布式网站进行了概要性描述,并给出一个架构参考.一部分为读书笔记,一部分是个人经验总结.对大型分布式网站架构有 ...
- 分布式服务框架XXL-RPC
<分布式服务框架XXL-RPC> 一.简介 1.1 概述 XXL-RPC 是一个分布式服务框架,提供稳定高性能的RPC远程服务调用功能.拥有"高性能.分布式.注册中心. ...
- 腾讯资深架构师干货总结:一文读懂大型分布式系统设计的方方面面
1.引言 我们常常会听说,某个互联网应用的服务器端系统多么牛逼,比如QQ.微信.淘宝.那么,一个大型互联网应用的服务器端系统,到底牛逼在什么地方?为什么海量的用户访问,会让一个服务器端系统变得更复杂? ...
- 分布式事务框架seata介绍
分布式事务框架seata介绍 一 . 事务特性(ACID) 1.原子性(A) 在整个事务中的所有操作,要么全部完成,要么全部不做,没有中间状态.对于事务在执行中发生错误,所有的操作都会被回滚,整个事务 ...
最新文章
- 十二. python面向对象主动调用其他类
- RANSAC迭代估计
- SpringBoot整合(Elasticserch)
- (50)Xilinx Multiplier IP核配置(十一)(第10天)
- python elementtree 命名空间_用Python中的命名空间通过‘ElementTree’解析XML
- gui设置可编辑文本框的回调函数_用Tkinter制作Python程序的图形用户界面(GUI),打包后比Qt5减少60M(77.5%)(实例63)...
- 文件分配表(File Allocation Table)入门
- hibernate Restrictions 用法
- Atitit 数据库与存储引擎设计与实现 attilax总结 1.1. 数据库的实现有很多种, 遵循一些理论规范,如 Fix Rules、Write-Ahead Log、Force-log-at-
- MVVM后,下一代开发模式在哪?
- 项目部署发布CruiseControl工具介绍
- 上次来杭州,已经六年了。。
- 来了来了,2020 首场 Meetup ,可!
- 解决Word2019使用卡顿问题
- 马明哲:平安最大对手是阿里和腾讯等现代科技企业
- Zhong__Docker安装和简单使用
- php中in的作用是什么,in是什么软件
- LCD1602与51单片机
- 天载股票开户沪深两市分化明显
- STM32学习笔记——(5)按键检测
热门文章
- 【数据分析就业实战】——缺失值的常见处理方法
- java体系的四大基类_Java中的io流学习(了解四大基类和基本步骤)
- java 单文件上传_java – JIRA中的单个文件上传
- C语言循环设计结构,c语言---循环结构设计.ppt
- mt4双线macd_【名师讲堂第三季】第六期:基于MACD指标的买卖策略精讲
- linux脚本实现多重管道,制作Linux shell时流重定向和管道
- Spring Boot基础学习笔记22:自定义用户控制、登录与退出
- 每个人都该知道的数字
- Gson案例:Java对象与JSON字符串相互转换
- Python学习笔记:创建分数类