[WIP] gRPCの中身ってどんな?feat. Go


はじめに

Goが大好きで、一通り勉強した後何やろうかなと思い、gRPCに手を出してしまいました。。
と言うのも、WEB+DB PRESSのvol.114でkyashの特集をやっており、Goのアーキテクチャなどが紹介され、マイクロサービス 化を実践してみたくて、gRPCに興味が湧きました!

そこで、よく分かるgRPCの良書があったのでそちらをまとめて行きたいと思います。

gRPCとは?

言わずもがなGoogleが開発しているRPC用のフレームワーク
RPCとは異なる場所にあるプログラムを呼び出すための仕組みを指します。
イメージとしては外部APIとHTTP通信でJSONを用いてやり取りする様な物です。

  • HTTP/2の仕組みを用いた高速な通信
  • Protocol Buffersを使ったRPCの定義とコード生成(レビューも出来ちゃう!)

もうここまで言うとマイクロサービスにドチャクソ向いてるのは分かりますよね!?

動かしてみる

色んな記事にある様に、チュートリアルしてもらうのが一番早く、確実です。

ここではコードの書き方を何となく理解できればグッドです!

gRPCの仕組み

RPC

gRPCの単一の呼び出しはRPCと言います。
RPCには種類が4つあります。

  • Unary RPC
  • Server streaming RPC
  • Client streaming RPC
  • Bidirectional streaming RPC

これはよくあるgRPCの記事で言うそれぞれ上から

  • 1リクエスト1レスポンス
  • 1リクエストNレスポンス
  • Nリクエスト1レスポンス
  • NリクエストNレスポンス

と言うやつの正式名称ですね!

チャットとかの実装だとBidirectional streaming RPCを使います。

Channel (goのchannelとは別)

gRPCの裏側を支える代表的な要素がこのChannel(goではClientConn)
gRPCの通信を行うための経路の様な物

Channelはいくつかの状態を持ちます。
最後に切断するまで状態が切り替わっていく様になっています。

  • CONNECTING
  • READY
  • TRANSIENT_FAILURE
  • IDLE
  • SHUTDOWN

Channel作成直後はCONNECTINGから始まり、使い終わるとSHUTDOWNになります。

gRPCとHTTP/2

gRPCはHTTP/2の元、通信を行っています。
HTTP/2に関してはそろそろ知っておきたいHTTP/2の話で概要が掴めるかと思います。

個人的に一番「うオ!!」っと思ったのは
今まで1リクエスト1レスポンだったものが Streamが導入され、複数の通信を行える様になった と言う点です!(すごい。。)

  • Connection
  • Stream
  • Frame

このワードを押さえてください。

ひとつのRPCに大してひとつのHTTP/2 Streamが対応しています。
そしてそれら(Connection, Stream)を管理しているのがgRPCのChannel(goではClientConn)です。