.protoファイルの管理方法に思いを馳せていたので書いた。
動機
FRESH!はMicroservicesアーキテクチャでやっているが、今まさにAPI v2というのが動いていて構成の刷新に動いている。技術的なトピックとしては
- iOS/AndroidからAPIへの通信をフルgRPC化
- Service Meshの導入
- Amazon ECS -> Kubernetes化
といったところで本格的に動きはじめている。
1つのRepositoryに1サービスという構成で作っているので、それぞれにgRPCのインタフェースを用意し、Service MeshでよしなにRoutingやDiscoveryしていく感じ。サービス毎にgRPC/Protocol Buffersのインタフェース定義のIDL(.protoファイル)を配置していく。
.proto群をかき集めたい
iOSやAndroidはもちろんMicroservices間の通信もそうなのだが、様々なサービスのIDLを利用してサービスにアクセスするためのプログラムを protoc
を使って自動生成していく。クライアントによって必要なサービスも違うし、参照しているバージョンも異なる。何よりも、リポジトリが散らばっているので、それを毎度各クライアントのリポジトリにコピーしてきたりして管理するのもなかなかダルい。
というわけで必要なIDLを定義して、それを一気に解決するようなツールが欲しくなったので書いたのが今回のprotodepである。
使い方は以下のように、protodep.tomlという依存関係を定義したtomlを用意する。
proto_outdir = "./proto"
[[dependencies]]
target = "github.com/openfresh/plasma/protobuf"
branch = "master"
[[dependencies]]
target = "github.com/grpc-ecosystem/grpc-gateway/examples/examplepb"
revision = "v1.2.2"
あとはprotodepを実行する。
$ protodep up
protodepでprotoを取得したら、vendoringツールにありがちなlockファイルができる(protodep.lock)。これでバージョン固定可能。
-fオプションを付ければforce updateも可能
$ protodep up -f
protodepはあくまでIDLを必要なところからかき集めるだけのツールなので、取得したIDLを使ってのstubの生成はセルフサービスでお願いします。