Upgrade to Pro — share decks privately, control downloads, hide ads and more …

入門gRPC - 23卒エンジニア志望学生LT会 / Introduction of gRPC

入門gRPC - 23卒エンジニア志望学生LT会 / Introduction of gRPC

gRPCがOSSとして公開されてから既に5年以上経ち、実際のプロダクトでの導入も一般的になってきました。そのようなgRPCをよく知らない/よく分からない人に対して、gRPCの概要、使える場面、使い方の3つに焦点を絞って説明しました。

195f71c8183f8d27da66aa0618f293b6?s=128

task4233

July 17, 2021
Tweet

Transcript

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

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

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

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

  5. RPC: Remote Procedure Call あるプロセスが、別アドレス空間のプロセスを実行する呼び出し RESTの場合 RPCの場合 リソースを要求 リソースを返答 処理の呼び出し

    を要求 実行結果 を返答 現在時刻をください! time.Now()を 実行してください! 実行結果は 23:14:23 +0900 現在時刻は 23:14:23 +0900
  6. RPCはリモート呼び出しをローカルと(ほぼ)同様に扱える プログラマは他のマシンとの送受信を意識する必要がない client := NewRpcClient() fmt.Println(client.Now()) 例) JSON-RPC, XML-RPC, gRPCなど

    サーバがNow()を実行して、 clientにその結果を返却
  7. gRPC: gRPC Remote Procedure Call Googleが2015年にOSS化したRPCフレームワーク ・高速かつ簡単に他言語間でもデータ通信が可能 ・Netflix, Dropbox, etcd等で利用

    gRPCの3つの特徴 ・Protocol Buffersによる実装 ・HTTP/2 でデータを送受信 ・複数の通信形式から選択可能
  8. 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) {} }
  9. Protocol Buffersの特徴 ・型安全な定義が可能  ・https://developers.google.com/protocol-buffers/docs/proto3#nested ・IDLから多言語のサーバ/クライアントのコードを自動生成可能  ・protocコンパイラを利用  ・C++, C#, Dart, Go,

    Java, Kotlin, Python等  ・プラグインでOpenAPI, Markdown, HTML等も生成可能 ・独自形式のバイナリデータに変換するので高効率
  10. 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 サーバ
  11. 4種類の通信方式 名称 サーバへの 要求 サーバからの 返答 Unary RPC 1 1

    Server Streaming RPC 1 多 Client Streaming RPC 多 1 Bidirectional Streaming RPC 多 多 StreamingとUnaryの2種類をクライアントとサーバ側で選択可能
  12. gRPCが使えそうなケース 多言語でサービスを構築している環境 ・IDLでスキーマ定義をすれば複数の言語で利用できる 大規模かつモジュールの分離度が高い環境 ・モジュール間の通信はgRPCに投げられるので生産性が向上する Protocol Buffersと開発環境のマッチ度が 大きな判断指標になりそう

  13. gRPCの使い方(Go編) 1. IDLを記述する 2. IDLから各言語のコードを生成する 3. 各言語でインタフェース定義を書く 4. サーバにハンドラを登録する 5.

    クライアントから呼び出す https://github.com/task4233/grpc-demo
  14. 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) {} }
  15. 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) }
  16. 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 }
  17. 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()
  18. 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)
  19. まとめ : gRPCは...... ・高速に他言語間でもデータ通信が可能なRPCフレームワーク ・Protocol Buffersに合致する環境では効果的 ・proto定義を最初に書いてから各言語で実装 →初期の開発スピードは停滞するが、後々恩恵が得られる 他の技術とのメリット、デメリットを吟味して 使ってみてください!

    ありがとうございました!
  20. 参考資料 • 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.