Protocol Buffers (proto3) 使用规范
字段编号规则
规则描述 | 详细说明 |
---|---|
字段编号必须唯一 | 每个字段必须分配唯一的编号。 |
保留字段编号范围 | 数字 19,000 到 19,999 保留给 Protocol Buffers 实现,使用时编译器会发出警告。 |
字段使用后不能更改 | 更改字段编号等同于删除旧字段并添加一个新编号的字段。 |
字段编号永远不应重复使用 | 重复使用字段编号会导致解析错误和数据丢失风险。 |
字段编号优化建议 | 1 到 15 用于最常使用的字段,因为这些编号在线格式中占用更少的空间。 |
关于 import、package 和 go_package
- go_package:Go 的命名空间,设定
.protoc
生成的 Go 代码路径。 - package:
.proto
的命名空间,用于分隔不同.proto
文件中的相同定义字段。 - import:
.proto
导入路径,导入其他.proto
文件。
示例:
syntax = "proto3";
package example; // 定义proto命名空间
import "google/protobuf/timestamp.proto"; // 导入依赖文件
message Sample {
google.protobuf.Timestamp create_time = 1; // 使用导入的字段
}
protoc 是 Protocol Buffers 编译器,用于将 .proto 文件编译生成代码
- –go_out :golang编译支持,指定输出文件路径;
- –-go_opt :指定参数,比如 --go_opt=paths=source_relative 就是表明生成文件输出使用相对 路径。
- 如果 .proto 文件路径是 ./echo/echo.proto
使用 paths=source_relative 时,生成的代码文件路径是 ./echo/echo.pb.go。
如果不使用,会生成到输出目录的根目录,如 ./echo.pb.go。 - –go-grpc_out=.指定生成 gRPC 相关代码的输出目录
- –go-grpc_opt=paths=source_relative同上
- .\echo\echo.proto 指定要编译的 .proto 文件,.\echo\echo.proto 是目标 .proto 文件的相对路径,表示编译 echo 目录下的 echo.proto 文件
protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --gogrpc_opt=paths=source_relative .\echo\echo.proto
--go_out
和 --go-grpc_out
的区别
1. --go_out
- 作用:生成与消息(Message)相关的代码。
- 生成内容:
- 包含
.proto
文件中定义的消息类型(message
)、枚举(enum
)等。 - 生成的代码主要用于序列化和反序列化数据。
- 包含
- 生成文件:
- 默认生成文件名为
xxx.pb.go
(对应.proto
文件名)。
- 默认生成文件名为
- 示例代码:
- 如果
.proto
文件定义如下:syntax = "proto3"; message EchoRequest { string message = 1; } message EchoResponse { string message = 1; }
--go_out
会生成的xxx.pb.go
包含:EchoRequest
和EchoResponse
的结构体定义。- Protobuf 序列化与反序列化的代码。
- 如果
2. --go-grpc_out
- 作用:生成与服务(Service)相关的 gRPC 代码。
- 生成内容:
- 包含
.proto
文件中定义的service
和 RPC 方法的接口、客户端和服务器的代码。 - 用于实现客户端和服务器的通信逻辑。
- 包含
- 生成文件:
- 默认生成文件名为
xxx_grpc.pb.go
(对应.proto
文件名)。
- 默认生成文件名为
- 示例代码:
- 如果
.proto
文件定义如下:syntax = "proto3"; service EchoService { rpc SendEcho(EchoRequest) returns (EchoResponse); }
--go-grpc_out
会生成的xxx_grpc.pb.go
包含:EchoService
服务的接口定义。- 客户端和服务器的代码框架:
- 客户端用来调用服务。
- 服务器用来实现服务逻辑。
- 如果
3. go_out
是生成 RPC 吗?
不是直接生成 RPC,
--go_out
只负责生成消息定义相关的代码,与 gRPC 无关。真正的 RPC 相关代码是由
--go-grpc_out
生成的。
区别总结
--go_out
:负责消息的定义(数据层),生成的是与数据结构相关的代码。--go-grpc_out
:负责服务和 RPC 的逻辑(通信层),生成的是客户端和服务器的代码框架。
两者通常需要配合使用,--go_out
生成数据序列化代码,--go-grpc_out
生成服务逻辑代码。
protoc安装
https://github.com/protocolbuffers/protobuf/releases/
插件安装
protoc-gen-go: 用于生成消息代码(–go_out)。
protoc-gen-go-grpc: 用于生成 gRPC 服务代码(–go-grpc_out)。
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest