protobuffer是一种语言无关、平台无关的数据协议,优点在于压缩性好,可扩展,标准化,常用于数据传输、持久化存储等。
实现原理
protobuffer协议
1 压缩性好(相比于同样跨平台、跨语言的json)
- 去除字段定义,分隔符(引号,冒号,逗号)
- 压缩数字,因为日常经常使用到的比较小的数字,实际有效的字节数没有4个字节
- 采用TLV的数据存储方式:减少了分隔符的使用 & 数据存储得紧凑
varint和zigzag算法:对数字进行压缩
protobuffer协议去除字段定义,分隔符
这里有几篇文章对protobuffer总结的很好
https://learnku.com/articles/32974
https://cloud.tencent.com/developer/article/1520442
https://www.pudn.com/news/628f82d2bf399b7f351e4c8d.html
2 可拓展
protobuffer并不是一个自解析的协议(json自解析key),需要pb的meta数据解析,牺牲了可读性,但在大规模的数据处理是可以接受的。可拓展性在于protobuffer中追加定义,新旧版本是可以兼容的,但是定义是严格有序的。
3 标准化
protobuffer生态提供了完整的工具链,protobuffer提供官方的生成golang/java等实现插件,这样protobuffer字节码的各语言版本的序列化、反序列化是标准化的,也包括插件生成代码封装。以及标准化的常用工具,比如doc-gen、grpc-gen、grpc-gateway-gen等工具。
典型应用
gRPC
protobuffer封装
需要注意
1 pb结构封装的字段标序是不能更改的,否则解析错乱;
2 pb结构尽量把必选类型,比如int、bool放在filedNum<=16;可得到更好的varint压缩效果;
3 grpc-client使用时,req是指针类型,务必不要重复复制,尽量new request,否则编码时会错乱;