Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
3プロトコルを実現するconnect-go / Fukuoka.go#20
Search
yoshihiro shu
October 23, 2024
1
280
3プロトコルを実現するconnect-go / Fukuoka.go#20
yoshihiro shu
October 23, 2024
Tweet
Share
Featured
See All Featured
Done Done
chrislema
182
16k
The Language of Interfaces
destraynor
156
24k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
33
2k
Why You Should Never Use an ORM
jnunemaker
PRO
55
9.2k
YesSQL, Process and Tooling at Scale
rocio
171
14k
StorybookのUI Testing Handbookを読んだ
zakiyama
28
5.4k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
Docker and Python
trallard
43
3.2k
Raft: Consensus for Rubyists
vanstee
137
6.7k
Practical Orchestrator
shlominoach
186
10k
How STYLIGHT went responsive
nonsquared
96
5.3k
The World Runs on Bad Software
bkeepers
PRO
67
11k
Transcript
1 3プロトコルを実現する connect-go 朱 義宏 / GMO PEPABO inc. 2024.10.23 Fukuoka.go
2 ⾃⼰紹介 ホスティング事業部 ロリポップ! for Gamersチーム 2024年 中途⼊社 朱 義宏 Shu Yoshihiro
• 旅⾏が好き(最近は東南アジアに興味あり) • ボクシングフィットネスジムに通い始めました • Twitter : @yoshihiro_shu
GMOペパボについて 3 https://pepabo.com/
4 アジェンダ 1. connect-goについて 2. どう実現しているのか 3. for Gamersのアーキテクチャ
Connectについて ‧connect-go: ライブラリとしてのConnect ‧Connect Protocol: RPCプロトコルとしてのConnect 定義 5
1. connect-goについて 6
RPC(Remote Procedure Call)とは? 7
Connectについて RPC(Remote Procedure Call)とは? 8 ローカルからリモートサーバーの関数を実⾏する技術
connect-goが対応している RPCの仕様について 9
connect-goについて gRPC 10 https://grpc.io/docs/what-is-grpc/introduction/#overview
connect-goについて gRPC-Web 11 https://github.com/grpc-ecosystem/grpc-gateway?tab=readme-ov-file#about
connect-goについて 12 Connect Protocol
connect-goについて 13 それぞれRPCプロトコルとHTTPの対応バージョン gRPC gRPC-Web Connect Protocol HTTP/1.1 ❌ ⭕
⭕ HTTP/2 ⭕ ⭕ ⭕
HTTP/1.1とHTTP/2の違いは? 14
connect-goについて HTTP/1.1とHTTP/2の違い 15 HTTP/1.1はテキストベース HTTP/2はバイナリベース https://hpbn.co/http2/#binary-framing-layer
connect-goについて HTTP/1.1とHTTP/2の違い 16 HTTP/2ではフレームを分割することで、 1つのTCP接続で複数のリクエストとレスポンスを同時に送受信が可能 https://hpbn.co/http2/#request-and-response-multiplexing
17 connect-goについて この複雑な仕様を どう実装しているのか?
connect-goについて 疑問点 18 gRPC-Webではプロキシを使うことでHTTP/1.1通信を実現している
connect-goについて この複雑な仕様をどう実装しているのか? 19 ドキュメントのチュートリアル的に、ハンドラーひとつで実現できている。。。 https://connectrpc.com/docs/go/getting-started
connect-goについて 疑問点 20 connect-goのハンドラーは、 プロキシなしで、HTTP/1.1とHTTP/2、更に3プロトコルどうやって実現しているのか?
2. どう実現しているのか 21
どのように実現しているのか 22 結論 HTTP Headerの"Content-Type"によって、 それぞれのプロトコルのHandlerを実⾏している
connect-goのhttp.Handler 23
どのように実現しているのか それぞれのProcedureごとに`http.HandlerFunc`を⽣成している connect-goのhttp.Handler 24
どのように実現しているのか 通信⽅式によって、Handlerを変えている connect-goが⽣成するhttp.Handler 25
connect-goのServeHTTP 26
どのように実現しているのか HTTP Headerの"Content-Type"から、対応したプロトコルのHandlerを取得 connect-goのServeHTTP 27 https://github.com/connectrpc/connect-go/blob/main/handler.go#L181
どのように実現しているのか "Content-Type"と対応するプロトコル connect-goのServeHTTP 28 gRPC gRPC-Web Connect Protocol application/grpc application/grpc+json
application/grpc+proto ⭕ application/grpc-web application/grpc-web+proto application/grpc-web+json ⭕ application/proto application/json ⭕ application/connect+proto application/connect+json ⭕
どのように実現しているのか Procedure関数を実⾏するために、コネクションを確⽴する connect-goのServeHTTP 29 https://github.com/connectrpc/connect-go/blob/main/handler.go#L224
どのように実現しているのか Procedure関数を実⾏し、コネクションを閉じる connect-goのServeHTTP 30 https://github.com/connectrpc/connect-go/blob/main/handler.go#L224
protocolHandler 31
どのように実現しているのか 様々なProtocol, Codec, CompressorをサポートをしているHTTP HandlerのInterface protocolHandler 32 https://github.com/connectrpc/connect-go/blob/main/protocol.go#L89
どのように実現しているのか protocolHandlerのInterface 33 https://github.com/connectrpc/connect-go/blob/main/protocol.go#L89
どのように実現しているのか サーバー側でクライアントとの通信を⾏い、メッセージの送受信をするオブジェクトを 返す protocolHandler - NewConn 34 https://github.com/connectrpc/connect-go/blob/main/protocol.go#L89
どのように実現しているのか リクエストとレスポンスの圧縮形式を決める protocolHandler - NewConn 35 https://github.com/connectrpc/connect-go/blob/main/protocol.go#L89
どのように実現しているのか HTTP Headerの"Content-Type"を取得し、対応した形式の操作するオブジェクトを取 得 protocolHandler - NewConn 36 https://github.com/connectrpc/connect-go/blob/main/protocol_grpc.go#L176
どのように実現しているのか protocolHandler - NewConn 37 "Content-Type"と対応するシリアライズ形式 Protocol Buffers JSON application/proto
⭕ application/grpc application/grpc-web ⭕ application/json ⭕ application/grpc+proto application/grpc-web+proto application/connect+proto ⭕ application/grpc+json application/grpc-web+json application/connect+json ⭕
3. for Gamersのアーキテクチャ 38
39
MySQL Frontend (Type script) Backend (Go) アプリケーション DB (Amazon RDS)
コントロールパネル Kubernetes Cluster (オンプレミス ) オンプレミスデータセンター Baremetal #1 (Ubuntu/LXD) Baremetal #n (Ubuntu/LXD) LXD Cluster Ceph Cluster VM #1 VM #2 VM #n for Gamersのアーキテクチャ 引⽤: ロリポップ ! for Gamersの立ち上げ
for Gamersのアーキテクチャ 技術選定におけるバックエンドの課題 41 ‧API仕様がコード化したい ‧スキーマ駆動開発を⾏いたい ‧サービスの特性上、⼀般的なリソースのCRUDに加えてRPC的な要素が多く、 無理にRestfulなAPIを落とし込まないで良い ‧ブラウザや別サービスアプリケーションと通信がしたい 引⽤:
ロリポップ ! for Gamersの立ち上げ
for Gamersのアーキテクチャ Connectの採⽤ 42 ‧Protocol Buffersを採⽤し、スキーマ駆動開発を実現 ‧1つのHandlerでgRPC, gRPC-Web, Connect Protocolに対応
‧プロキシなしでHTTP/1.1及びHTTP/2通信が可能
Appendix 43
Appendix connectrpc/connect-goのコントリビューターになりました! 44 https://github.com/connectrpc/connect-go/pull/786
45 Thank you!