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

入門gRPC / Introduction of gRPC

入門gRPC / Introduction of gRPC

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

task4233

July 17, 2021
Tweet

More Decks by task4233

Other Decks in Technology

Transcript

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

    を要求 実行結果 を返答 現在時刻をください! time.Now()を 実行してください! 実行結果は 23:14:23 +0900 現在時刻は 23:14:23 +0900
  2. gRPC: gRPC Remote Procedure Call Googleが2015年にOSS化したRPCフレームワーク ・高速かつ簡単に他言語間でもデータ通信が可能 ・Netflix, Dropbox, etcd等で利用

    gRPCの3つの特徴 ・Protocol Buffersによる実装 ・HTTP/2 でデータを送受信 ・複数の通信形式から選択可能
  3. 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) {} }
  4. 4種類の通信方式 名称 サーバへの 要求 サーバからの 返答 Unary RPC 1 1

    Server Streaming RPC 1 多 Client Streaming RPC 多 1 Bidirectional Streaming RPC 多 多 StreamingとUnaryの2種類をクライアントとサーバ側で選択可能
  5. 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) {} }
  6. 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) }
  7. 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 }
  8. 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()
  9. 参考資料 • 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.