protoc-gen-go 和 protoc-gen-go-grpc 的区别

Differences between protoc-gen-go and protoc-gen-go-grpc

我对 protoc-gen-goprotoc-gen-go-grpc 有点困惑。我知道:

但是,我正在使用以下命令

protoc -I $protodir --go_out=plugins=grpc:./genproto/ $protodir/v1/foo.proto

并且生成的 foo.pb.go 包含用于 gRPC server/client 的消息序列化 的代码。另外,我的系统上只安装了 protoc-gen-go

我觉得这是在 GO 中执行 gRPC 的旧方法,而 新方法protoc --go_out=. --go-grpc_out=.

问题:

  1. 为什么这只适用于 protoc --go_out=.(为什么它也生成 gRPC client/server 代码?)
  2. 使用一种方法与另一种方法相比有何优势?

谢谢, 直流

旧方法正在使用github.com/golang/protobuf模块。它带有 protoc-gen-go 生成 protobuf 消息的序列化 grpc 代码(当使用 --go_out=plugins=grpc 时)。

所谓的 new-way 正在使用 google.golang.org/protobuf 模块 = 协议缓冲区的 Go 绑定的主要修订版。它带有一个不同的 protoc-gen-go,不再支持生成 gRPC 服务定义。对于 gRPC 代码,Go gRPC project 开发了一个名为 protoc-gen-go-grpc 的新插件。 plugins 标志提供了一种以旧方式调用 gRPC 代码生成器的方法,现已弃用。

重要说明:用户应努力为运行时库和用于生成 Go 绑定的 protoc-gen-go 插件使用相同的版本。

较长的答案

Release Notes 也对此进行了解释。