文章目录
前言
本文档主要讲解protobuf中基础的编码规则。先整体描述protobuf数据格式的优势,然后讲解protobuf的编码规则,通过了解编码规则,让大家深入浅出的理解protobuf的优势。在讲解规则时,会用到大量的例子帮助大家理解,大家也可以跟着一起计算,如果有计算不符的地方,欢迎评论区留言探讨。感谢大家的关注,后续会持续更新go语言,中间件等相关编程内容。
一、grpc为什么要选择protobuf?
gRPC选择使用Protocol Buffers(protobuf)作为数据格式,因为它具有以下几个优点:
- 高效的序列化:protobuf使用二进制格式来序列化数据。相比JSON或XML这种基于文本的格式,protobuf格式的数据更小且更快,这有助于减少网络传输的数据量和处理时间,非常适合高性能的通信场景。
- 跨语言支持:protobuf支持多种编程语言,包括Go、Python、Java、C++等。借助protobuf定义的数据结构可以在不同语言的服务间传递数据,而不需要关注各自语言的实现细节。这种跨语言的兼容性使得gRPC能在分布式微服务中被广泛使用。
- 强类型和兼容性:protobuf使用强类型来定义数据结构,这样开发者在编写代码时就可以提前发现数据类型的问题。它还提供了良好的向后兼容和向前兼容的支持,即使在服务端或客户端更新了数据结构,也能保证老版本的客户端或服务端仍然能正常通信。
- IDL(接口定义语言):protobuf提供了一种接口定义语言(IDL)来定义服务和消息结构。使用.proto文件,我们可以直观地定义接口和数据模型,减少手工编码的工作量。在定义完成后,可以通过protobuf工具自动生成客户端和服务端的代码,这大大提升了开发效率。
二、Varint编码
protobuf使用Varint编码来压缩整型数据(例如 int32, int64, uint32, uint64)的存储,使得它在存储和传输整数时能够更高效、更节省空间。参考链接:https://protobuf.dev/programming-guides/encoding/#varints
2.1 字节序
- 大端序:高字节放低地址,低字节放高地址(符合书写习惯:从左到右)
- 小端序:高字节放高地址,低字节放低地址
假设我们有一个16位(2字节)数值0x1234(十六进制),它可以分成两个字节:
高字节:0x12
低字节:0x34
在大端序(Big-endian)中
如果该数值从地址0x1000开始存储,那么大端序会将高字节放在高地址,低字节放在低地址:
| 地址 | 数据 |
|0x1000 | 0x12|
| 0x1001 | 0x34 |
因此,在大端序中,数值0x1234会按照高位在前的顺序排列。
在小端序(Little-endian)中
为了对比,小端序会将低字节放在低地址,高字节放在高地址。仍然以地址0x1000为起始:
| 地址 | 数据 |
|0x1000 | 0x34|
| 0x1001 | 0x12 |
2.2定长编码
16位整型——2个字节
32位整型——4个字节
64位整型——8个字节
2.3变长编码
标签:编码,字节,grpc,61,字段,Address,数据传输,protobuf From: https://blog.csdn.net/qq_41705360/article/details/143271168