使用Go语言的API,Protocol Buffers的APIv1和APIv2之间有什么区别
关于这篇文章
由于 Protocol Buffers 在 Go 语言的 API 中发布了新的 V2 (APIv2),导致了 import 路径、仓库和 protoc-gen-go 等方面出现了一些混乱,因此我们来进行整理。
[2021/2/13更新]
在初次投稿时(2020/05/11),尚未发布适用于APIv2的protoc-gen-go-grpc,但在2020年10月发布了该版本,因此我进行了更新。
关于使用Go语言API的Protocol Buffers
Protocol Buffers(以下简称protobuf)是一种语言中立的数据序列化机制,Go语言也提供了用于使用protobuf的API。
最初的 API 在约2010年提供,把它称为 APIv1。
随后,在2020年3月发布了新的 APIv2。
APIv2的简要特点:
-
- *.proto ファイルで定義された protobuf のアノテーションを Go から読めるようにした
-
- APIv2 は後方互換性はない
APIv1 は今後もずっとサポートを継続する(原文: We intend to maintain support for APIv1 indefinitely.)
关于[补充] protoc-gen-go
编译*.proto文件需要使用一个名为protoc的编译器,但protobuf本身是语言中立的,因此需要一个名为protoc-gen-go的插件来生成Go语言的代码。protoc-gen-go和下文中提到的gRPC stub代码生成也有APIv1和APIv2之间的差异。
APIv1和APIv2的差异
APIv1的意思是应用程序编程接口版本1。
-
- 最新バージョンは v1.4 系
v1.4.0 から内部的には APIv2 を使って実装されている
APIv1 の import パス等は以下を参照
APIv2可以用中文来解释为应用程序接口版本2。
-
- バージョンは v1.20.0 から始まる
APIv1 のバージョンが 1.20 まで進まないだろうという予想とのこと
APIv2 の import パス等は以下を参照
关于 protoc-gen-go 和 gRPC 的存根代码生成
如果是APIv1的情况下
在 APIv1 中,我们可以在 protoc 命令中加入 –go_out=plugins=grpc 选项,以便生成 gRPC 存根代码给 protoc-gen-go 工具使用。
protoc --go_out=plugins=grpc:. sample.proto
对于APIv2的情况
APIv2版本的 protoc-gen-go 不再生成 gRPC 的存根代码,需要额外安装 protoc-gen-go-grpc 插件。
export GO111MODULE=on
go get google.golang.org/protobuf/cmd/protoc-gen-go
go get google.golang.org/grpc/cmd/protoc-gen-go-grpc
protoc --go_out=. --go-grpc_out=. sample.proto
请提供更多的上下文信息来帮助我准确地回答你的问题。
-
- A new Go API for Protocol Buffers
-
- Goが新たなリフレクションベースのProtocol Buffer APIを獲得
- Go Protocol Buffer Message API V2 のReflectionとgRPC Server-side Interceptorを使ってAPIの呼び出し権限チェックを実現する