protoc-gen-go 和 protoc-gen-go-grpc 的区别
Differences between protoc-gen-go and protoc-gen-go-grpc
我对 protoc-gen-go
和 protoc-gen-go-grpc
有点困惑。我知道:
protoc-gen-go
包含 protobuf 消息serialization/deserialization 的代码
protoc-gen-go-grpc
包含 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=.
问题:
- 为什么这只适用于
protoc --go_out=.
(为什么它也生成 gRPC client/server 代码?)
- 使用一种方法与另一种方法相比有何优势?
谢谢,
直流
旧方法正在使用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 也对此进行了解释。
我对 protoc-gen-go
和 protoc-gen-go-grpc
有点困惑。我知道:
protoc-gen-go
包含 protobuf 消息serialization/deserialization 的代码protoc-gen-go-grpc
包含 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=.
问题:
- 为什么这只适用于
protoc --go_out=.
(为什么它也生成 gRPC client/server 代码?) - 使用一种方法与另一种方法相比有何优势?
谢谢, 直流
旧方法正在使用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 也对此进行了解释。