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

use*_*681 7 grpc-go

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

  • protoc-gen-go 包含用于 protobuf 消息序列化/反序列化的代码
  • protoc-gen-go-grpc 包含 gRPC 服务器和客户端的代码

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

protoc -I $protodir --go_out=plugins=grpc:./genproto/ $protodir/v1/foo.proto
Run Code Online (Sandbox Code Playgroud)

并且生成的foo.pb.go包含用于消息序列化gRPC 服务器/客户端的代码。另外,我只protoc-gen-go安装在我的系统上。

我有一种感觉,这是在 GO 中进行 gRPC旧方法,新方法protoc --go_out=. --go-grpc_out=.

问题:

  1. 为什么这仅适用于protoc --go_out=.(为什么它还生成 gRPC 客户端/服务器代码?)
  2. 使用一种方法与另一种方法相比有什么优势?

谢谢,直流

use*_*681 10

老办法是使用github.com/golang/protobuf模块。它附带protoc-gen-go生成 protobuf 消息grpc 代码的序列化(何时--go_out=plugins=grpc使用)。

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

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

stackoverflow 上更长的答案。

另外,发行说明解释了这一点。