Slide 1

Slide 1 text

gRPC 入門 Taiga Sakaguchi 1

Slide 2

Slide 2 text

Sakaguchi Taiga 教員→Web エンジニア 歴3 年 バックエンドエンジニア 都内メガベンチャーに勤務 2

Slide 3

Slide 3 text

gRPC とは Google によって開発されたRPC フレームワーク 3

Slide 4

Slide 4 text

RPC とは Remote Procedure Call の頭字語(遠隔手続き呼び出し) ネットワークを通じて別のコンピュータ上で動作するソフトウェア の関数を呼び出すための仕様 4

Slide 5

Slide 5 text

一般的な関数呼び出し 5

Slide 6

Slide 6 text

RPC における関数呼び出し 6

Slide 7

Slide 7 text

RPC の何が嬉しいのか ローカルの関数かリモートの関数かを意識せずにコードを書くこと ができる 7

Slide 8

Slide 8 text

type Server struct {} type User struct{ ID string } func (s *Server) GetUser(id string) *User {} type Client struct {} func (c *Client)DoSomething() { u := c.GetUser("userid") } 8

Slide 9

Slide 9 text

REST だったら type Server struct {} func main() { r := gin.Default() r.GET("/user/:id", getUser) r.Run() } func getUser(c *gin.Context) {} type Client struct {} func (c *Client) DoSomething() { resp, err := http.Get("http://user/1") } 9

Slide 10

Slide 10 text

https://grpc.io/docs/what-is-grpc/introduction/ 10

Slide 11

Slide 11 text

Protocol Buffers Google により開発 IDL (インターフェース定義言語) 通信や永続化での利用を目的としたシリアライズフォーマット コードやDocs など自動生成できる 11

Slide 12

Slide 12 text

syntax = "proto3"; service User { rpc GetUser(GetUserRequest) returns (GetUserResponse) {} } message GetUserRequest { string id = 1; } message GetUserResponse { string id = 1; string name = 2; } 12

Slide 13

Slide 13 text

サーバー用の生成コード // ... type UserServer interface { GetUser(context.Context, *GetUserRequest) (*GetUserResponse, error) mustEmbedUnimplementedUserServer() } // ... 13

Slide 14

Slide 14 text

クライアント用の生成コード // ... type UserClient interface { GetUser(ctx context.Context, in *GetUserRequest, opts ...grpc.CallOption) (*GetUserResponse, error) } func NewUserClient(cc grpc.ClientConnInterface) UserClient { return &userClient{cc} } // ... 14

Slide 15

Slide 15 text

ここでクイズ gRPC の「g 」の意味はなんでしょうか? 1. Google 2. Good 3. Great 4. Game 15

Slide 16

Slide 16 text

ここでクイズ gRPC の「g 」の意味はなんでしょうか? 1. Google 2. Good 3. Great 4. Game 16

Slide 17

Slide 17 text

gRPC の「g 」はバージョンごとに意味がかわるらしい https://github.com/grpc/grpc/blob/master/doc/g_stands_for.md 17

Slide 18

Slide 18 text

gRPC のメリット HTTP/2 で通信 Protocol Buffers によるシリアライズ ストリーミング処理 多くの言語に対応(Go, Java, Kotlin, Node, PHP, Python, Ruby,... ) 18

Slide 19

Slide 19 text

4 つの通信方式 Unary RPC Server streaming RPC Client streaming RPC Bidirectional streaming PRC 19

Slide 20

Slide 20 text

Unary RPC 1 Request - 1 Response 20

Slide 21

Slide 21 text

Server streaming RPC 1 Request - N Response 例)push 通知など 21

Slide 22

Slide 22 text

Client streaming RPC N Request - 1 Response 例)データを分割して複数回に分けてアップロード 22

Slide 23

Slide 23 text

Bidirectional streaming PRC WebSocket のような双方向通 例) チャット 23

Slide 24

Slide 24 text

gRPC のデメリット PRC の設計に気をつけないと破綻する 実装に時間がかかる ブラウザでのサポートが十分でない 24

Slide 25

Slide 25 text

gRPC が向いているケース Microservice プライベートなAPI モバイル、IoT 25

Slide 26

Slide 26 text

ブラウザ - サーバー間で導入するには grpc-web grpc-gateway connect 26

Slide 27

Slide 27 text

grpc-web 27

Slide 28

Slide 28 text

grpc-gateway 28

Slide 29

Slide 29 text

connect https://connect.build/ 29

Slide 30

Slide 30 text

connect 30

Slide 31

Slide 31 text

参考 https://grpc.io/ https://zenn.dev/hsaki/books/golang-grpc-starting https://christina04.hatenablog.com/entry/2017/11/13/190000 https://qiita.com/gold-kou/items/a1cc2be6045723e242eb 31

Slide 32

Slide 32 text

32