Slide 1

Slide 1 text

入門gRPC 23卒エンジニア志望学生LT会 2021/07/17 Takashi Mima(@task4233)

Slide 2

Slide 2 text

本日の目標 gRPCをよく知らない or よく分からない人が、 ・gRPCとは何なのか ・どのような場面で使えるのか ・どのように使えばいいのか を分かるようになること

Slide 3

Slide 3 text

自己紹介 ・Takashi Mima(@task4233) ・芝浦工業大学 M1 ・サーバサイドとセキュリティ ・好きなことは散歩 ・バイトでGoを書いてます

Slide 4

Slide 4 text

RPC、使ったことありますか?

Slide 5

Slide 5 text

RPC: Remote Procedure Call あるプロセスが、別アドレス空間のプロセスを実行する呼び出し RESTの場合 RPCの場合 リソースを要求 リソースを返答 処理の呼び出し を要求 実行結果 を返答 現在時刻をください! time.Now()を 実行してください! 実行結果は 23:14:23 +0900 現在時刻は 23:14:23 +0900

Slide 6

Slide 6 text

RPCはリモート呼び出しをローカルと(ほぼ)同様に扱える プログラマは他のマシンとの送受信を意識する必要がない client := NewRpcClient() fmt.Println(client.Now()) 例) JSON-RPC, XML-RPC, gRPCなど サーバがNow()を実行して、 clientにその結果を返却

Slide 7

Slide 7 text

gRPC: gRPC Remote Procedure Call Googleが2015年にOSS化したRPCフレームワーク ・高速かつ簡単に他言語間でもデータ通信が可能 ・Netflix, Dropbox, etcd等で利用 gRPCの3つの特徴 ・Protocol Buffersによる実装 ・HTTP/2 でデータを送受信 ・複数の通信形式から選択可能

Slide 8

Slide 8 text

Protocol Buffers Googleが2008年にOSS化したシリアライズフォーマット ・IDL(インタフェース記述言語)で定義(.proto) syntax = "proto3"; // バージョンの指定(v2から破壊的変更が行われている ) package adder; // パッケージ名の指定 message NumMessage { // 型 フィールド名 = ユニークなタグ番号 (1-indexed); int64 value = 1; } service AdderService { // rpc メソッド名(入力) returns (出力) {} rpc Add(NumMessage) returns (NumMessage) {} }

Slide 9

Slide 9 text

Protocol Buffersの特徴 ・型安全な定義が可能  ・https://developers.google.com/protocol-buffers/docs/proto3#nested ・IDLから多言語のサーバ/クライアントのコードを自動生成可能  ・protocコンパイラを利用  ・C++, C#, Dart, Go, Java, Kotlin, Python等  ・プラグインでOpenAPI, Markdown, HTML等も生成可能 ・独自形式のバイナリデータに変換するので高効率

Slide 10

Slide 10 text

gRPCはHTTP/2でデータを送受信する HTTP/2は仮想的に多重化されたバイナリベースのプロトコル ・データをバイナリ形式でエンコードするので転送量が少ない gRPCではサーバ/クライアントでHTTP/2に対応する必要があった ・grpc-gatewayでHTTP/1.1対応可能 ・https://github.com/grpc-ecosystem/grpc-gateway クライアント gRPCサービス リバース プロキシ REST API (HTTP/1.1) gRPC サーバ

Slide 11

Slide 11 text

4種類の通信方式 名称 サーバへの 要求 サーバからの 返答 Unary RPC 1 1 Server Streaming RPC 1 多 Client Streaming RPC 多 1 Bidirectional Streaming RPC 多 多 StreamingとUnaryの2種類をクライアントとサーバ側で選択可能

Slide 12

Slide 12 text

gRPCが使えそうなケース 多言語でサービスを構築している環境 ・IDLでスキーマ定義をすれば複数の言語で利用できる 大規模かつモジュールの分離度が高い環境 ・モジュール間の通信はgRPCに投げられるので生産性が向上する Protocol Buffersと開発環境のマッチ度が 大きな判断指標になりそう

Slide 13

Slide 13 text

gRPCの使い方(Go編) 1. IDLを記述する 2. IDLから各言語のコードを生成する 3. 各言語でインタフェース定義を書く 4. サーバにハンドラを登録する 5. クライアントから呼び出す https://github.com/task4233/grpc-demo

Slide 14

Slide 14 text

1.IDLを記述する serviceにAddメソッドを持たせる ・入出力はNumMessageというmessage // adder/adder.proto syntax = "proto3"; // バージョンの指定(v2から破壊的変更が行われている ) package adder; // パッケージ名の指定 message NumMessage { // 型 フィールド名 = ユニークなタグ番号 (1-indexed); int64 value = 1; } service AdderService { // rpc メソッド名(入力) returns (出力) {} rpc Add(NumMessage) returns (NumMessage) {} }

Slide 15

Slide 15 text

2.IDLから各言語のコードを生成する $ protoc --go_out=plugins=grpc:. adder.proto ・messageはstructに ・serviceはinterfaceに // adder/adder.pb.go type NumMessage struct { Value int64 `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` } type AdderServiceClient interface { Add(ctx context.Context, in *NumMessage, opts ...grpc.CallOption) (*NumMessage, error) }

Slide 16

Slide 16 text

3.生成されたserviceのinterfaceを実装 Goではinterface内のメソッドを全て宣言すれば実装できる // adder/adder.go type AdderServer struct{} func (s *AdderServer) Add(ctx context.Context, in *NumMessage) (*NumMessage, error) { return &NumMessage{ Value: in.Value + 1, // 1を加算 }, nil }

Slide 17

Slide 17 text

4. サーバにハンドラを登録する // main.go s := grpc.NewServer() // 登録 adderServer := &adder.AdderServer{} adder.RegisterAdderServiceServer(s, adderServer) // Liten conn, err := net.Listen("tcp", PORT) if err != nil { fmt.Fprintf(os.Stderr, "failed to listen: %s", err.Error()) } defer conn.Close()

Slide 18

Slide 18 text

5. クライアントから呼び出す serverとのconnectionを用意 ・https://github.com/task4233/grpc-demo/blob/master/client/client.go#L15-L24 clientを宣言してメソッドを呼び出す // client/client.go client := adder.NewAdderServiceClient(conn) return client.Add(ctx, req)

Slide 19

Slide 19 text

まとめ : gRPCは...... ・高速に他言語間でもデータ通信が可能なRPCフレームワーク ・Protocol Buffersに合致する環境では効果的 ・proto定義を最初に書いてから各言語で実装 →初期の開発スピードは停滞するが、後々恩恵が得られる 他の技術とのメリット、デメリットを吟味して 使ってみてください! ありがとうございました!

Slide 20

Slide 20 text

参考資料 ● gRPC A high performance open source universal RPC framework, gRPC, 2021, https://grpc.io/ . ● Protocol Buffers, Google, 2021, https://developers.google.com/protocol-buffers . ● gRPC vs REST: Understanding gRPC, OpenAPI and REST and when to use them in API design, Google, 2020 . https://cloud.google.com/blog/ja/products/api-management/ understanding-grpc-openapi-and-rest-and-when-to-use-them ● Rodrigo Quezada, GraphQL & gRPC, 2017, https://blog.datank.ai/graphql-grpc-part-1-54d92a109619 ● Andrew S. Tanenbaum, 分散システム--原理とパラダイム, PEARSON, 2009.