Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Protocol Buffersスキーマ定義から GoのCLIを生成する

Naoya Furudono
December 13, 2024
20

Protocol Buffersスキーマ定義から GoのCLIを生成する

Naoya Furudono

December 13, 2024
Tweet

Transcript

  1. 2 ⾃⼰紹介 ホスティング事業部 事業開発チーム 2023年 新卒⼊社 古殿直也 Naoya Furudono •

    ホスティングサービスを作っています • ランニングとお酒が好きです • プログラミング⾔語も好きです • Twitter : @furudono2 • あだ名は donokun
  2. スキーマ駆動開発: API設計をスキーマとして定義して、それをもとに開発すること スキーマ駆動開発、幸せです 6 API提供者 • 仕様を明⽰できる • 機械的に検証できる •

    ボイラープレートの⽣成 • (シナリオテストと相性🙆) API利⽤者 • 仕様を明⽰してもらえる • モックを作れる • ボイラープレートの⽣成 6 今日はこちらの話
  3. • スキーマを定義する仕組みと、それを活⽤する仕組み • Protocol Buffers ◦ スキーマ定義 ◦ コンパイラツールチェーン (protoc)

    ◦ プラグインとしてのコード⽣成機 • Connect ◦ Web API実装をサポート Protocol Buffers と Connect でスキーマ駆動開発する 7 スキーマ駆動開発、幸せです https://connectrpc.com/docs/go/getting-started API提供者 • 仕様を明⽰できる • 機械的に検証できる • ボイラープレートの⽣成
  4. スキーマ駆動開発、幸せです Protocol Buffer で記述するスキーマ定義 • Serviceは複数のRPCを提供する • RPCはリクエストを受け取りレスポンスを返す ◦ リクエスト‧レスポンスのスキーマは

    messageとして定義する • messageはそれを構成するフィールドをもつ • フィールドは名前、型、番号をもつ • コメントも書ける • 拡張機能もある https://github.com/naoyafurudono/greeting/blob/main/greet/v1/greet.proto 8
  5. スキーマ駆動開発、幸せです Protocol Buffer で記述するスキーマ定義 • Serviceは複数のRPCを提供する • RPCはリクエストを受け取りレスポンスを返す ◦ リクエスト‧レスポンスのスキーマは

    messageとして定義する • messageはそれを構成するフィールドをもつ • フィールドは名前、型、番号をもつ • コメントも書ける • 拡張機能もある https://github.com/naoyafurudono/greeting/blob/main/greet/v1/greet.proto 9 API提供者 • 仕様を明⽰できる • 機械的に検証できる • ボイラープレートの⽣成 https://protobuf.dev/programming-guides/proto3/
  6. Connectはサービスインターフェースとボイラープレートを⽣成する 10 https://connectrpc.com/docs/go/getting-started • Protobufスキーマから以下を⽣成する ◦ サービスのインターフェース ◦ サービスを動作させるConnect サーバ(http

    サーバと思ってここ では⼗分) • リクエストのマーシャルとルーティングを Connectがやってくれる • 開発者はインターフェースを満たすサービス (ビジネスロジック)を実装すれば良い Connect is a slim library for building browser- and gRPC-compatible HTTP APIs. You define your service with a Protocol Buffer schema, and Connect generates type-safe server and client code. Fill in your server's business logic and you're done — no hand-written marshaling, routing, or client code required! (Connectのドキュメントから抜粋)
  7. Connectはサービスインターフェースとボイラープレートを⽣成する 11 https://connectrpc.com/docs/go/getting-started • Protobufスキーマから以下を⽣成する ◦ サービスのインターフェース ◦ サービスを動作させるConnect サーバ(http

    サーバと思ってここ では⼗分) • リクエストのマーシャルとルーティングを Connectがやってくれる • 開発者はインターフェースを満たすサービス (ビジネスロジック)を実装すれば良い
  8. スキーマ駆動開発、幸せです Protocol Buffer で記述するスキーマ定義 • Serviceは複数のRPCを提供する • RPCはリクエストを受け取りレスポンスを返す ◦ リクエスト‧レスポンスのスキーマは

    messageとして定義する • messageはそれを構成するフィールドをもつ • フィールドは名前、型、番号をもつ • コメントも書ける • 拡張機能もある https://github.com/naoyafurudono/greeting/blob/main/greet/v1/greet.proto 15 API提供者 • ✅仕様を明⽰できる • ✅機械的に検証できる • ボイラープレートの⽣成 詳細: https://protobuf.dev/programming-guides/proto3/ 再掲
  9. Connectはサービスインターフェースとボイラープレートを⽣成する 16 参考: https://connectrpc.com/docs/go/getting-started • Protobufスキーマから以下を⽣成する ◦ サービスのインターフェース ◦ サービスを動作させるConnect

    サーバ(http サーバと思ってここ では⼗分) • リクエストのマーシャルとルーティングを Connectがやってくれる • 開発者はインターフェースを満たすサービス (ビジネスロジック)を実装すれば良い 再掲 API提供者 • ✅仕様を明⽰できる • ✅機械的に検証できる • ボイラープレートの⽣成
  10. Connectはサービスインターフェースとボイラープレートを⽣成する 17 • Protobufスキーマから以下を⽣成する ◦ サービスのインターフェース ◦ サービスを動作させるConnect サーバ(http サーバと思ってここ

    では⼗分) • リクエストのマーシャルとルーティングを Connectがやってくれる • 開発者はインターフェースを満たすサービス (ビジネスロジック)を実装すれば良い 再掲 Connectサーバはバッチ処理には不適格 参考: https://connectrpc.com/docs/go/getting-started API提供者 • ✅仕様を明⽰できる • ✅機械的に検証できる • ❌ボイラープレートの⽣ 成
  11. clio 22 • Protobufスキーマ定義からGoのCLIを⽣成するツール ◦ github.com/naoyafurudono/clio-go ◦ 紹介記事: https://zenn.dev/nfurudono/articles/719e3aafac6065 •

    以下を⽣成する ◦ Connectサービスのインターフェースをそのまま受け⼊れて ◦ サービスを動作させるcobra.Commandを返す関数 • cobra.Commandはコマンドライン引数のマーシャルとルーティング(RPCの選択)を⾏う • Connectと同様に、「protoc plugin + Goパッケージ」として提供