这是我参与「第五届青训营 」伴学笔记创作活动的第 18 天
0 Protobuf 简介
Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准,目前已经正在使用的有超过 48,162 种报文格式定义和超过 12,183 个 .proto 文件。他们用于 RPC 系统和持续数据存储系统。
Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。目前提供了 C++、Java、Python 三种语言的 API。
1 Protobuf 基本规范
- Protobuf 文件采用
.proto
作为文件后缀 - 除结构定义的有括号外,需以分号结尾
- Message 命名采用驼峰命名法,其字段命名采用小写字母加下划线命名法
- Enums 类型名采用驼峰命名法。字段命名采用大写字母加下划线命名法
- Service 名采用驼峰命名法
- Rpc 方法采用驼峰命名法
2 字段基本规范
2.1 基本格式
限定修饰符
+ 数据类型
+ 字段名称
= 字段编码值
+ [字段默认值]
2.2 限定修饰符
required
: 必需字段。对于发送方来说,这是一个必要字段,发送方必须为这一字段设置一个合法值;对于接收方来说,只有收到这一字段,才能正常进行业务。required
修饰字段的缺失与格式错误都会引起编解码异常,进而导致消息无法被识别,进而报错。optinal
: 可选字段。对于发送方来说,可以根据情况选择是否设置该字段。对于接收方来说,当该字段缺失或是无法识别时会自动忽视该字段信息。Repeated
: 重复字段。表示该字段可以包含零个或多个元素,当缺失或者无法识别时会被接收方当做optinal
字段处理。
2.3 数据类型
Protobuf 类型 | 对应的 Go 类型 |
---|---|
double | float64 |
float | float32 |
int32 | int32 |
int64 | int64 |
uint32 | uint32 |
uint64 | uint64 |
sint32 | int32 |
sint64 | int64 |
fixed32 | uint32 |
fixed64 | uint64 |
sfixed32 | int32 |
sfixed64 | int64 |
bool | bool |
string | string |
bytes | []byte |
2.4 字段名称
字段名采用下划线命名
2.5 字段编码值
- 字段编码值越大,时间与空间效率越低,因此应使用较小的编码值,以 1-15 最佳
- 1900-2000 的编码为内部保留值,不建议使用
2.6 字段默认值
对于 required
类型字段,当设置了默认值且发出者没有填写该字段,会默认选择默认值作为该字段值
3 service 的定义
- 需要定义该 service 服务的 请求
Request
与Response
- 对于没有请求参数的 service 服务,我们一般也定义相应的
Request
,当然,没有参数时为空 - 在 .proto 中 service 的定义格式如下:
service XXXXService {
rpc XXXX (XXXXRequest) returns (XXXXResponse) {}
}