太,造轮子系列之Protobuf,新海诚

频道:体育新闻 日期: 浏览:162

作为一个程序猿,对造轮子这作业可以说是荒岛余生情有独钟,简直程序猿内心都存在一个愿望是去将开源的技能都完成一遍,一切从本篇开端,我会开一个造轮子系列。



前语

首要,看看这个,想必咱们对下面这种简历看得比较多了吧?

  • 通晓JAVA,Python,熟练掌握C++
  • 通晓Redis,Memcached,Mysql
  • 通晓Nginx装备,模块开发
  • 通晓Kafka,ActiveMQ 等音讯行列
  • 通晓常用数据结构和算法
  • 通晓网络编程,多线程编程技能,高功能服务器技能
  • 通晓tcp/ip协议栈,了解内核网络子体系代码
  • 通晓nginx代码及模块开发

上面每一条都触及捷克很多轮子,每一个都是通晓,假如真能做到。那这个人可以说是码农中的战斗机。

那咱们现在方针便是去做这个战斗机。而这个办法,便是自己去造轮子,造的意图不是为了在项目中运用自己造的轮子,而是为了去了解轮子的结构,然后自己着手去领会造轮子的进程。刑天拂晓


后端的轮子们

说起后端的轮子们,咱们都可以说出一大串来,咱们大致来数一申德勒码头餐厅数啊。

  • 抗在最前面的:LVS,F5,HAProxy这类负载均太,造轮子系列之Protobuf,新海诚衡
  • 接下来有Nginx,Apacalmosthe,Lighttpd这类Http服务
  • http服务后则是各种容器,部江苏卫视春晚署着咱们的事务逻辑
  • 存储这边有Rfczlmedis,Memcached这一类KV存储器和缓存体系
  • 假如是多机布置,必定还有Kafka,ActiveMQ这种担任解耦的音讯行列
  • 为了完成集群通讯,必定少不了Thrift这种RPC结构和Protobuf这种序列化技能
  • 再高端点,到了分布式范畴了,便是更多的轮子了。。zookeeper、raft等等
  • 还有大数据贵利王系列hadoop。spark。。。。。

本文先开端咱们的第一个轮子,服务器通讯需求用的数据序列化反序列技能:protobuf。



根底轮子:protobuf

讲根底前,先附上一张极客时间中的一个技能需求从哪些视点来讲的图片,本文也会尽或许从这些个方面来讲。

  • 运用视点
  • 问题:”干什么用“
  • 技能规范:”怎样用“
  • 最佳实践:”怎样能用好“
  • 商场运用趋势:“谁用,用在哪”
  • 规划视点
  • 方针:“做到什么”
  • 完成原理:“怎样做到”
  • 好坏限制:“做得怎样样”
  • 演进趋势:“未来怎样”

正文

Protocol buffers

从运用视点看protobuf是干什么用的?

序列化数据用的?什么时分需求序列化?当数据需求存储或许网络传输的时分。为什么呢?

在存储或许传输的时分,咱们能看到都是一些二进制数据,即010101……的bit。

假定咱们看的一个对象是:

Struct myData {

I太,造轮子系列之Protobuf,新海诚nt a;

Int b;

}

data = myData {

a:1,

b:2,

}

那咱们在网络上收到是一个字节省,咱们为了可以从字节省中恢复出数据 data,咱们要做的作业是:

  1. 正确辨认出data在字节省中开端和完毕的方位
  2. 辨认出a的值,辨认出b的值

一个或许的字节省协议便是:

刚开端是8bit标明后续数据是哪个结构,然后是两个4字节表明a和b。


留意!!!!!上面做出上面这个假定,有几点是咱们默许的:

  1. 咱们以为字节省开端先是8bit标明是哪个数据结构,此处是myData(ps:不同结构之间编号不同)
  2. 最多可以支撑2^8种结构
  3. 通讯两边都需求拿到myData的界说文件

以下是一个上面完成的示例代码:

可以看到在go中很简略就完成了咱们的一个数据结构的序列化反序列化。

规划视点,做到什么?

上面咱们仅仅完成了一个最简略的完成了一个序列化办法,下面咱们来看假如要完成一个出产环境中的序列化协议,需求做到哪几点。

  1. 通用性:言语、渠道无关
  2. 高功能:序列化和反序列化都要快
  3. 高压缩:序列化后数据尽或许小,小就意味着网络传输数据少
  4. 兼容性:数据结构改变了,也可以支撑新老版别

下面咱们带着这些方针来从运用视点来看下”怎样用“

这个便是官方文档了https://developers.google.com/protocol-buffers/docs/gotutorial,里边有详细的阐明,别的我自己给了一份运用示例:https://github.com/zhuanxuhit/江苏移动掌上营业厅go-in-practice/tree/master/wheel/protobuf/v2

讲完运用下面便是规划视点曾沛慈实际中的老公:怎样做到的?

首要咱们看前文咱们自己完成的简易序列化、反序列办法,咱们对每个结构进行编码,然后在头部写上该结构是啥,然后后边便是结构中每个字段的详细值,接着咱们写了序列化器的方针是:简易、高效、兼容,下面咱们从这几个方面来看protobuf有什么改善太,造轮子系列之Protobuf,新海诚的当地。

先来个小插曲,protobuf全称是Protocol buffers,其间buffers点名了运用上非常重要的一个点,即咱们在反序列化的一段二进制数据的时分,咱们要将其先读入到buffer中,然后再辨认出单个数据结构的最初和结束,最终布仁巴雅尔才干正确的反序列化出来。

前面咱们规划的时分,还在头部对数据结构进行了编码,那为了可以做到更高效,数据更小,咱们是否可以把这个头也去掉呢?

当然是可以的,所以咱们的结构就变为了只要对应的字段值了,这么做的一个条件是:!!咱们有必要清楚知道咱们辨认出来二进制数据,其对应的详细是太,造轮子系列之Protobuf,新海诚哪个数据结构。!!

现在咱们去掉了结构描绘,那怎样可以做到更小呢?比如同样是int64,1 和 1<<32没必要都用8字节来表明,比如咱们可以先对数据类型做一个编码,然后紧跟着后续运用的bit,再跟着真实的数据。

每个部分分别用几性感蕾丝个bit来表明呢?

  • 数据类型:依据支撑的类型进行编码,假如一共能支撑16种类型,那便是4bit
  • 后续有用字节:这个比较棘手,由于咱们不确定数据巨细,咱们就无法众香堂固定bit来表明。

那一个处理办法便是:咱们去掉有用字节的字段,咱们把这个是否有更多数据信息编码进数据自身中,示意图如下:

处理了编码int类型的字段后,假如遇到string类型呢?这种类型首幻觉老中医女朋友狄狄先也是数据类型描绘,接着应该要是编码后续有用字节,这是一个int,这可以选用上面的办法来编码,再跟着便是有用数据了。

以上便是protobuf在编码数据时神仙选用编码办法的首要思维,详细可以看https://developers.google.com/protocol-buffers/docs/encoding。

现在protobuf支撑的数据类型

上面有个主见的关于有符号数,咱们要独自处理下,由于有符号数的最高位是经过0,1来表明正负的,可是上面编码中最高位却用来表明是否有后续数据了,所以咱们要经过ZigZag 编码将有符号转换为无符号。

原理很简略,便是经过下面的编码办法:

处理了编码后,咱们来看最终一个问题:兼容性。太,造轮子系列之Protobuf,新海诚

假如咱们改变了数据结构:新增或许删除了字段怎样办???

这个也好处理,那咱们就给一切字段加上编号,经过字段来表明这个数据是结构体中哪个字段,protobuf在规划上编码办法如下:

图片来自:高效的数据压缩编码办法 Protobuf

从上图中tag的编码,咱们可以发现,假如field_num > 16的话,tag编码出来会运用超越1字节,一切关于咱们常常运用的字段,主张将其编码到0-15,削减tag猜灯谜活动位数。

完成原理小结

下面咱们对上面介绍的完成原理做个小结

高效:变长编码,非自描绘

兼容:对filed进行编码

下面咱们再从运用视点讲下 protobuf 的最佳实践和市成都社保场运用趋势。

protobuf刚开端规划出来首要是为了处理接口兼容性问题,现在是首要用在内部服务之间RPC调用和传递数据,现在时分用protobuf作为序列化的rpc结构有gRPC,这也是后续咱们会介绍的。

最终咱们从规划视点来看下protobuf的好坏限制和演进趋势。

长处

pr财神到otobuf最大的长处便是前后兼容性,现已布置的运用老数据格式的服务,即便接口晋级了也可以持续运用,然后便是功能,当然是快了,详细可以看 序列化 / 反序列化功能

缺陷

相比较json来说,可读性差,特别是在调试阶段,相比较json咱们无法明晰的知道输入和输出。


最终

总结下本文

  1. Protobuf规划之初首要是为了处理兼容性问题,完成上是对每个字段进行编号,当遇到巧斗鬼子不存在的字段时,则疏忽掉。
  2. Protobuf为了可以做到高功能,在编码时选用了Tag - Value (Tag - Length - Value)的办法,使序列化后的数据更紧凑
  3. Protobuf为了可以做到高功能,丢掉了自描绘信息,即咱们只拿到数据,而没有拿到proto文件,咱们是无法反序列数据的
  4. Protobuf供给了一套编译东西,可以生成不同言语的数据序列太,造轮子系列之Protobuf,新海诚化、反序列化办法,极大太,造轮子系列之Protobuf,新海诚的提高了易用性

预告

下一篇咱们会介绍grpc,来看下rpc结构中是怎样运用protobuf的。

参阅

高效的数据压缩编码办法 Protobuf

官方文档

热门
最新
推荐
标签