原创

protobuffer总结

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,否则编码时会错乱;

原创声明,本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

登录 后参与评论
0 条评论

相关文章

  • mac 上安装Protobuffer

    Protocol Buffers (ProtocolBuffer/ protobuf )是Google公司开发的一种数据描述语言,类似于XML能够将结构化数据序...

    solate
  • [Go] protobuffer 的环境配置

    一般使用gprc是需要使用protobuf作为数据传输的格式标准,可以对要传输的对象结构体进行序列化

    大灰狼2
  • Netty整合Protobuffer 顶

    现在我们都知道,rpc的三要素:IO模型,线程模型,然后就是数据交互模型,即我们说的序列化和反序列化,现在我们来看一下压缩比率最大的二进制序列化方式——Prot...

    算法之名
  • Protobuffer 官方文档学习

    该文件的第一行指定您使用的是proto3语法:如果不这样做,协议缓冲区编译器将假定您正在使用proto2。 这必须是文件的第一个非空,非注释行。

    solate
  • protobuffer 编解码原理

    protobuf 在 RPC、数据存储、配置化等方面都有很广泛的应用,究其原因在于其时间和空间上的高效、易扩展等特性,本文从原理上来揭示其高效的原因。

    serena
  • protobuffer的前世今生(二)——编码

    在一个应用中,你创建一个Test1message 并且设置 a为150.你可以序列化这个消息到输出流,你可以得到3个字节 08 96 01 到此为止,如此之...

    MickyInvQ
  • protobuffer的前世今生(一)——简介

    Protocol buffers 在序列化数据方面,它是灵活的,高效的。相比于 XML 来说,Protocol buffers 更加小巧,更加快速,更加简单。一...

    MickyInvQ
  • 在 Docker 中生成 ProtoBuffer、gRPC 文件

    使用 znly/protoc 这个镜像来在docker中生成 protobuffer 和 grpc 文件。

    饶文津
  • 聊聊gRPC的接口描述语言ProtoBuffer(二)

    阿伟
  • Node.js结合ProtoBuffer,从零实现一个redis! [一万字]

    Peter谭金杰
  • protobuffer的前世今生(三)——序列化和反序列化性能比较

    网上有个人,做了详细的测试。 因为proto更擅长于整数的编码和处理,所以结论如下: 如果你的生产环境中的JSON没有那么多的double字段,都是字符串占...

    MickyInvQ
  • protobuffer的前世今生(五)——在Java中的两种使用方式之注解模式

    使用主要是@tag 等 具体参考https://protostuff.github.io/docs/protostuff-runtime/

    MickyInvQ
  • Go语言微服务框架 - 1.搭建gRPC+HTTP的双重网关服务

    微服务框架系列重点介绍框架的搭建过程,期间对一些细节技术点的讲解,会在另一个系列Go语言技巧系列中展开。

    junedayday
  • 自己实现一个RPC框架 顶

    RPC框架称为远程调用框架,其实现的核心原理就是消费者端使用动态代理来代理一个接口的方法(基于JDK的动态代理,当然如果使用CGLib可以直接使用无接口类的方法...

    算法之名
  • gRPC- Go和Java的一次HelloWorld

    都说grpc是跨语言的一个rpc框架,当团队内部有多种流行编程语言时,那么grpc可以为他们提供通信,今天我们就通过一个Hello World来看看Java和G...

    阿伟
  • 序列化与反序列化之Protostuff(一)

    在大型开发中,序列化与反序列化是一个常见的技术点和问题。在之前我们对序列化与反序列化有过相关描述,但并不系统,更偏重于原理介绍。这里,我们讲详细介绍序列化与反序...

    程序员架构进阶
  • 前端20个灵魂拷问 彻底搞明白你就是中级前端工程师 【下篇】

    每个人评判的标准不一样,我们唯有拿出碾压这个层级的能力的时候,才能堵住质疑者的嘴。当然,我们不做技术杠精,技术本身没有好坏。不喜欢就不理会

    Peter谭金杰
  • Go语言技巧 - 14.【浅析微服务框架】go-zero概览

    go-zero是当前处于CNCF孵化中的一个Goz语言框架项目,在Github上的star数目前达到14.3K。

    junedayday
  • 总结

    1.安装完成后备份快照 2.不插网线使用虚拟机,查看vmware的IP网段,设置linux系统相同的网段。 3.rpm -qa 软件名字 //查询软件是...

    wangxl

扫码关注腾讯云开发者

领取腾讯云代金券