Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
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
220
3プロトコルを実現するconnect-go / Fukuoka.go#20
yoshihiro shu
October 23, 2024
Tweet
Share
Featured
See All Featured
GraphQLの誤解/rethinking-graphql
sonatard
67
10k
How GitHub (no longer) Works
holman
310
140k
The Straight Up "How To Draw Better" Workshop
denniskardys
232
140k
Speed Design
sergeychernyshev
25
650
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
93
17k
Stop Working from a Prison Cell
hatefulcrawdad
267
20k
KATA
mclloyd
29
14k
Docker and Python
trallard
40
3.1k
The Pragmatic Product Professional
lauravandoore
32
6.3k
Producing Creativity
orderedlist
PRO
341
39k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
27
880
Embracing the Ebb and Flow
colly
84
4.5k
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!