[RPC/序列化] Proto 文件的语法解读

1 概述: Proto 文件

proto 文件 = gRpc 远程调用协议中 Protobuf 序列化方案的数据结构与调用服务定义文件

  • Proto文件(Protocol Buffers,简称 Protobuf)是Google开发的一种数据序列化格式,用于结构化数据的定义和交换

常被用于RPC(远程过程调用)和数据存储场景。以下是对其核心要素的解读:

  • proto 文件的格式后缀: .proto

应用场景

proto 文件的应用场景

  • 云端微服务间的 gRpc 远程调用与通信场景
  • 物联网领域,端云协议(一般搭配 MQTT 通信协议)
  • ...

核心特点

  • 高效:二进制编码,体积比JSON小,解析速度快。
  • 跨语言:支持多编程语言(Java、Python、Go等)。
  • 可扩展:新增字段不影响旧版本解析(向前兼容)。

Proto文件清晰定义了数据结构和服务功能交互接口,是跨系统数据交换的高效方案。

2 Proto 文件的语法解读

版本声明 (syntax)

Proto文件需指定版本,常用的有proto2proto3(推荐使用proto3,语法更简洁):

protobuf 复制代码
syntax = "proto3"; // 声明使用proto3语法

包名(Package)

用于避免命名冲突,类似代码中的命名空间:

protobuf 复制代码
package example.user; // 定义包名,生成代码时会作为命名空间/包结构

导入其他Proto文件(import)

可通过import复用其他文件的定义:

protobuf 复制代码
import "common/address.proto"; // 导入外部proto文件

消息类型(Message)

  • 核心部分,用于定义结构化数据,类似"类"或"结构体":
protobuf 复制代码
message User {
  // 字段格式:[修饰符] 类型 名称 = 字段编号;
  string name = 1;    // 字符串类型,编号1(唯一,用于二进制编码,1-15占1字节)
  int32 age = 2;      // 32位整数
  bool is_student = 3;// 布尔值
  Address addr = 4;   // 引用其他message类型(如导入的Address)
  
  // 重复字段(类似数组)
  repeated string hobbies = 5; // repeated表示该字段可包含多个值
}
  • 字段编号:必须唯一,1-15优先用于频繁出现的字段(编码更高效)。
  • 类型 :支持基础类型(int32stringbool等)和自定义message类型。

枚举(Enum)

定义枚举类型,限制字段只能取预设值:

protobuf 复制代码
enum Gender {
  GENDER_UNSPECIFIED = 0; // proto3要求枚举第一个值为0(默认值)
  MALE = 1;
  FEMALE = 2;
}

// 在message中使用
message User {
  Gender gender = 6; // 引用枚举类型
}

服务定义(Service)

  • 用于RPC场景,定义服务接口和方法:
protobuf 复制代码
service UserService {
  // 定义RPC方法:参数为Request,返回Response
  rpc GetUser(GetUserRequest) returns (UserResponse);
  rpc UpdateUser(UpdateUserRequest) returns (UpdateResponse);
}

// 方法参数和返回值的message定义
message GetUserRequest {
  int32 user_id = 1;
}
message UserResponse {
  User user = 1;
  bool success = 2;
}

生成代码

  • Proto文件需通过编译器(protoc)生成对应语言的代码(如Java、Python、Go等),生成的代码包含序列化、反序列化及消息操作的方法。

例如,生成Python代码:

bash 复制代码
protoc --python_out=./ user.proto

X 参考文献

相关推荐
千千寰宇2 个月前
[计算机组成原理] 字符集编码: Unicode 字符集(UTF8/UTF16/UTF32) 和 `BOM`(Byte Order Mark/字节序标记) / UnicodeTextUtils
软件通用方案-序列化/数据传输结构