Slide 1

Slide 1 text

1 Protocol Buffersスキーマ定義から GoのCLIを⽣成する 古殿直也 (@furudono2) ホスティング事業部 事業開発チーム 2024.12.13

Slide 2

Slide 2 text

2 ⾃⼰紹介 ホスティング事業部 事業開発チーム 2023年 新卒⼊社 古殿直也 Naoya Furudono ● ホスティングサービスを作っています ● ランニングとお酒が好きです ● プログラミング⾔語も好きです ● Twitter : @furudono2 ● あだ名は donokun

Slide 3

Slide 3 text

3 セクションタイトル Web APIだけじゃなくて、バッチ処理でもスキーマ駆動開発して幸せになりたい! 最後のピースをProtobufスキーマからのCLI⽣成で埋める スキーマ駆動でバッチを書こう

Slide 4

Slide 4 text

4 1. Protobuf / Connectで⾏うWeb APIサーバのスキーマ駆動開発 2. Webサービスでのバッチ処理の実⾏ 3. clioの紹介 ⽬次

Slide 5

Slide 5 text

スキーマ駆動開発: API設計をスキーマとして定義して、それをもとに開発すること スキーマ駆動開発、幸せです 5 API提供者 ● 仕様を明⽰できる ● 機械的に検証できる ● ボイラープレートの⽣成 API利⽤者 ● 仕様を明⽰してもらえる ● モックを作れる ● ボイラープレートの⽣成 5

Slide 6

Slide 6 text

スキーマ駆動開発: API設計をスキーマとして定義して、それをもとに開発すること スキーマ駆動開発、幸せです 6 API提供者 ● 仕様を明⽰できる ● 機械的に検証できる ● ボイラープレートの⽣成 ● (シナリオテストと相性🙆) API利⽤者 ● 仕様を明⽰してもらえる ● モックを作れる ● ボイラープレートの⽣成 6 今日はこちらの話

Slide 7

Slide 7 text

● スキーマを定義する仕組みと、それを活⽤する仕組み ● Protocol Buffers ○ スキーマ定義 ○ コンパイラツールチェーン (protoc) ○ プラグインとしてのコード⽣成機 ● Connect ○ Web API実装をサポート Protocol Buffers と Connect でスキーマ駆動開発する 7 スキーマ駆動開発、幸せです https://connectrpc.com/docs/go/getting-started API提供者 ● 仕様を明⽰できる ● 機械的に検証できる ● ボイラープレートの⽣成

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

スキーマ駆動開発、幸せです 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/

Slide 10

Slide 10 text

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のドキュメントから抜粋)

Slide 11

Slide 11 text

Connectはサービスインターフェースとボイラープレートを⽣成する 11 https://connectrpc.com/docs/go/getting-started ● Protobufスキーマから以下を⽣成する ○ サービスのインターフェース ○ サービスを動作させるConnect サーバ(http サーバと思ってここ では⼗分) ● リクエストのマーシャルとルーティングを Connectがやってくれる ● 開発者はインターフェースを満たすサービス (ビジネスロジック)を実装すれば良い

Slide 12

Slide 12 text

Protocol Buffers / Connectでスキーマ駆動開発、よさそう 12 https://connectrpc.com/docs/go/getting-started API提供者 ● 仕様を明⽰できる ● 機械的に検証できる ● ボイラープレートの⽣成

Slide 13

Slide 13 text

スキーマ駆動開発、幸せです Webアプリケーションにはバッチ処理がつきもの 13 ● 単にフロントエンドのためのAPIを定義すれば終わりではない ● バッチ処理も必要 ● もちろんスキーマ駆動開発したい。幸せになりたいので ● バッチもAPI API提供者 ● 仕様を明⽰できる ● 機械的に検証できる ● ボイラープレートの⽣成

Slide 14

Slide 14 text

14 ⼤体いい感じだが、 ボイラープレートの⽣成がうまく⾏かない

Slide 15

Slide 15 text

スキーマ駆動開発、幸せです 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/ 再掲

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

Connectはサービスインターフェースとボイラープレートを⽣成する 17 ● Protobufスキーマから以下を⽣成する ○ サービスのインターフェース ○ サービスを動作させるConnect サーバ(http サーバと思ってここ では⼗分) ● リクエストのマーシャルとルーティングを Connectがやってくれる ● 開発者はインターフェースを満たすサービス (ビジネスロジック)を実装すれば良い 再掲 Connectサーバはバッチ処理には不適格 参考: https://connectrpc.com/docs/go/getting-started API提供者 ● ✅仕様を明⽰できる ● ✅機械的に検証できる ● ❌ボイラープレートの⽣ 成

Slide 18

Slide 18 text

● JobはKubernetesのリソース ● Podが正常に完了するまで実⾏されるように してくれる ● CronJobはそれをスケジュールにそって実⾏ する ● コンテナ内のコマンドを実⾏する ● Connectサーバをたてられても困る ● APIサーバではなくCLIが必要 k8s CronJobでコマンド実⾏したいから 18

Slide 19

Slide 19 text

コマンドをジョブごとに実装する 19 ● バッチ処理の種類ごとにrpcを定義する ● それを呼び出すコマンドを実装する ○ サブコマンドを⽣やして、 ○ 引数の処理をする ● ボイラープレート...

Slide 20

Slide 20 text

clioを使ってボイラープレートを排除する 20 ● バッチジョブを指定し引数を解釈するCLIの実 装が必要 ● バッチ処理ごとにそれぞれ実装する ● Connectサーバたてられても困る clio

Slide 21

Slide 21 text

clio 21 ● Protobufスキーマ定義からGoのCLIを⽣成するツール ○ github.com/naoyafurudono/clio-go

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

23 スキーマ駆動開発、幸せです API提供者 ● ✅仕様を明⽰できる ● ✅機械的に検証できる ● ✅ボイラープレートの⽣成

Slide 24

Slide 24 text

24 スキーマ駆動開発、幸せです API提供者 ● ✅仕様を明⽰できる ● ✅機械的に検証できる ● シナリオテストと相性🙆 ● ✅ボイラープレートの⽣成

Slide 25

Slide 25 text

25 セクションタイトル Web APIだけじゃなくて、バッチ処理でもスキーマ駆動開発して幸せになりたい! 最後のピースをProtobufスキーマからのCLI⽣成で埋める スキーマ駆動でバッチを書こう

Slide 26

Slide 26 text

26 Thank you!