骆贵 发表于 2025-8-29 10:48:52

[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文件需指定版本,常用的有proto2和proto3(推荐使用proto3,语法更简洁):
syntax = "proto3"; // 声明使用proto3语法包名(Package)

用于避免命名冲突,类似代码中的命名空间:
package example.user; // 定义包名,生成代码时会作为命名空间/包结构导入其他Proto文件(import)

可通过import复用其他文件的定义:
import "common/address.proto"; // 导入外部proto文件消息类型(Message)


[*]核心部分,用于定义结构化数据,类似“类”或“结构体”:
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)

定义枚举类型,限制字段只能取预设值:
enum Gender {
GENDER_UNSPECIFIED = 0; // proto3要求枚举第一个值为0(默认值)
MALE = 1;
FEMALE = 2;
}

// 在message中使用
message User {
Gender gender = 6; // 引用枚举类型
}服务定义(Service)


[*]用于RPC场景,定义服务接口和方法:
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代码:
protoc --python_out=./ user.protoX 参考文献

    本文作者:      千千寰宇   
    本文链接:         https://www.cnblogs.com/johnnyzen   
    关于博文:评论和私信会在第一时间回复,或直接私信我。   
    版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA   许可协议。转载请注明出处!
    日常交流:大数据与软件开发-QQ交流群: 774386015      【入群二维码】参见左下角。您的支持、鼓励是博主技术写作的重要动力!   

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: [RPC/序列化] Proto 文件的语法解读