【微服务】protobuf中proto3简单总结

发布于:2025-02-11 ⋅ 阅读:(31) ⋅ 点赞:(0)

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 包含:
      • EchoRequestEchoResponse 的结构体定义。
      • 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