Protobuf 语法学习 | 青训营笔记

62 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 18 天

0 Protobuf 简介

Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准,目前已经正在使用的有超过 48,162 种报文格式定义和超过 12,183 个 .proto 文件。他们用于 RPC 系统和持续数据存储系统。

Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。目前提供了 C++、Java、Python 三种语言的 API。

1 Protobuf 基本规范

  1. Protobuf 文件采用 .proto 作为文件后缀
  2. 除结构定义的有括号外,需以分号结尾
  3. Message 命名采用驼峰命名法,其字段命名采用小写字母加下划线命名法
  4. Enums 类型名采用驼峰命名法。字段命名采用大写字母加下划线命名法
  5. Service 名采用驼峰命名法
  6. Rpc 方法采用驼峰命名法

2 字段基本规范

2.1 基本格式

限定修饰符 + 数据类型 + 字段名称 = 字段编码值 + [字段默认值]

2.2 限定修饰符

  • required : 必需字段。对于发送方来说,这是一个必要字段,发送方必须为这一字段设置一个合法值;对于接收方来说,只有收到这一字段,才能正常进行业务。required 修饰字段的缺失与格式错误都会引起编解码异常,进而导致消息无法被识别,进而报错。
  • optinal : 可选字段。对于发送方来说,可以根据情况选择是否设置该字段。对于接收方来说,当该字段缺失或是无法识别时会自动忽视该字段信息。
  • Repeated : 重复字段。表示该字段可以包含零个或多个元素,当缺失或者无法识别时会被接收方当做 optinal 字段处理。

2.3 数据类型

Protobuf 类型对应的 Go 类型
doublefloat64
floatfloat32
int32int32
int64int64
uint32uint32
uint64uint64
sint32int32
sint64int64
fixed32uint32
fixed64uint64
sfixed32int32
sfixed64int64
boolbool
stringstring
bytes[]byte

2.4 字段名称

字段名采用下划线命名

2.5 字段编码值

  1. 字段编码值越大,时间与空间效率越低,因此应使用较小的编码值,以 1-15 最佳
  2. 1900-2000 的编码为内部保留值,不建议使用

2.6 字段默认值

对于 required 类型字段,当设置了默认值且发出者没有填写该字段,会默认选择默认值作为该字段值

3 service 的定义

  1. 需要定义该 service 服务的 请求 RequestResponse
  2. 对于没有请求参数的 service 服务,我们一般也定义相应的 Request,当然,没有参数时为空
  3. 在 .proto 中 service 的定义格式如下:
    service XXXXService {
        rpc XXXX (XXXXRequest) returns (XXXXResponse) {}
    }