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

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

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for Naoya Furudono Naoya Furudono
December 13, 2024
100

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

Avatar for Naoya Furudono

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パッケージ」として提供