Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
11
Help us understand the problem. What are the problem?

posted at

updated at

Protocol Buffers用 Go言語APIの 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月にリリースされたため内容を更新しました。

Protocol Buffers用 Go言語API について

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 自体は言語ニュートラルなためGo言語用のコードの生成するには protoc-gen-go というプラグインが必要になる。この protoc-gen-go と後述する gRPC のスタブコード生成にも APIv1 と APIv2 で違いが生じている。

APIv1 と APIv2 の違い

APIv1

  • 最新バージョンは v1.4 系
    • v1.4.0 から内部的には APIv2 を使って実装されている
  • APIv1 の import パス等は以下を参照
対象
import のパス github.com/golang/protobuf
ソースのリポジトリ https://github.com/golang/protobuf
protoc-gen-go github.com/golang/protobuf/protoc-gen-go
gRPCスタブコード生成 同上

APIv2

  • バージョンは v1.20.0 から始まる
    • APIv1 のバージョンが 1.20 まで進まないだろうという予想とのこと
  • APIv2 の import パス等は以下を参照
対象
import のパス google.golang.org/protobuf
ソースのリポジトリ https://github.com/protocolbuffers/protobuf-go
protoc-gen-go google.golang.org/protobuf/cmd/protoc-gen-go
gRPCスタブコード生成 google.golang.org/grpc/cmd/protoc-gen-go-grpc

protoc-gen-go と gRPC のスタブコード生成について

APIv1 の場合

APIv1 では protoc--go_out=plugins=grpc オプションを付けることで、protoc-gen-go に gRPC スタブコードを生成させることができた。

gRPC用スタブコードの生成例
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
gRPC用スタブコードの生成例
protoc --go_out=. --go-grpc_out=. sample.proto

参考

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
11
Help us understand the problem. What are the problem?