大型分布式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) 在整个事务中的所有操作,要么全部完成,要么全部不做,没有中间状态.对于事务在执行中发生错误,所有的操作都会被回滚,整个事务 ...
最新文章
- 看起来很美 VS. 是你来检阅我的忧伤了吗?
- UICollectionView 具体解说学习
- android系统耗电量大待机,安卓手机耗电快有什么解决办法吗 安卓手机待机耗电量大怎么办...
- 表示深深的感谢飞鸽传书源码
- java发送post请求json格式_go语言web开发框架学习系列二:Get、Post、Put等请求及数据返回格式...
- 深度优先搜索(DFS)
- springboot1.5 和 2.0 引入 redis 并封装工具类
- 从零开始自制实现C++ High-Performance WebServer 全流程记录
- Win10要是个人,也算是鬼门关走过一遭了
- 计算机hp1007打印程序,HP P1007
- C++ rb_tree红黑树
- 2019年最新版百度网盘不限速下载工具,无需登录实现高速下载!
- Spring中@AliasFor注解的作用及原理
- interrupt()方法理解和实例
- ip地址错误解决方法
- 天猫店申请:申请的品牌名与注册号对应的商标名不匹配
- 微博的世界,世界的微博
- Flink SQL 以catalog方式写入HIVE
- cousera of pku:魔兽世界:行军
- 安徽职高计算机可以考的大学名单,职高可以考的大学名单一览
热门文章
- java nextline_Java写一个学生管理系统
- wg运行内存装MySQL8_windows-安装mysql8的坑
- 3_Long Short Term Memory (LSTM)
- android 安装卸载应用提醒_Android程序使用代码的安装和卸载!!!
- 【4747】java语言程序设计(一)2011年10月考试复习资料_全国2011年10月自考Java语言程序设计(一)试题3...
- win10可用空间变成未分配_系统C盘磁盘空间不够用的解决办法
- 循环获取另一个php变量,通过引用将多个变量传递给foreach循环(php)
- oracle写转帐的存储过程,Oracle存储过程及块编程基础经典案例
- Go程序:变量声明、赋值与输出
- 【BZOJ1415】【codevs1784】聪聪与可可,概率DP