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文件需指定版本,常用的有proto2
和proto3
(推荐使用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优先用于频繁出现的字段(编码更高效)。
- 类型 :支持基础类型(
int32
、string
、bool
等)和自定义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