gRPCについて
はじめに
gRPC初心者がgRPCについてまとめてみました。間違っている部分や補足などありましたらガンガン投げていただけると嬉しいです。
Web+DB PRESSのVol.110「速習gRPC」の記事を参考にしております。(めちゃくちゃわかりやすかった。。)
新たに学んだことがあったらどんどん追記していく予定です。
*実務経験1年程度の駆け出しエンジニアです。業務ではRESTを使用した開発を行っております。gRPCに精通している訳ではないのでその点ご容赦ください。
gRPCとは
grpcはGoogleが開発し、OSSとして提供されている RPC(遠隔手続き呼び出し)フレームワークです。
gRPCを用いることで様々な言語で書かれたクライアントアプリケーションから、別のマシーンのサーバアプリケーションへ通信手段を意識せずに接続できる。マイクロサービス間の通信に適している。
通信プロトコルはHTTP/2を使用
gRPCは通信プロトコルとしてHTTP/2を使用しているHTTPメソッド、ステータスコード、URL、ヘッダなどに変更はなく、特徴としてストリームが挙げられる。
ストリームとは
同一のTCP接続においてクライアントとサーバ間で双方向にデータをやりとりできる仕組みのことである。単一のTCP接続の中で複数のストリームを生成し、リクエストとレスポンスを並列に処理できる。それらは個々で独立しておりブロックされることはない。
・gRPCの主な用途
・マイクロサービス間の通信
・モバイルアプリとサーバ間の通信
・ブラウザとサーバ間の通信
gRPCとRESTの通信間の違い
gRPCとRESTでは何が違うのか
設計モデル
REST: リソース
RESTはリソース指向の設計モデルである。URLとHTTPメソッドで対象のリソースを操作する。URLが対象のリソースを表現して、HTTPメソッドのPOST,GET,PUT,DELETEがCRUD操作に対応する。
gRPC: メッセージとサービス
gRPCはRPCと呼ばれる通信相手に操作を要求する手法を採用している。gRPCの場合、操作そのものをサービスおよびメソッドで表現して、操作に必要な情報や操作の結果を型付けしたメッセージを表現する。
データ形式
REST: JSON
JSONの利点は読みやすい、多くのプログラミング言語がサポートしている。拡張しやすいなどが挙げられる。しかしサーバおクライアントの両方で対象のJSONを解析するコードを書く必要があり、使用しているプログラミング言語が違うとそれらのコードを言語ごとに書かなければならない。
gRPC: バイナリデータ
gRPCはバイナリデータを使用する。
gRPCがデフォルトで使用するprotobufはprotocコマンドを提供している。protocコマンドはデータ構造やRPCを定義したファイルをコンパイルして、対象のプログラミング言語に対応したコードと、それらをバイナリデータに変換するコードを生成する。
これにより、サーバとクライアントで使用している言語が違う場合も、データをシリアライズ/デシリアライズするコードを書く必要がなくなり、シームレスに接続できる。
通信方式
REST:リクエスト/レスポンス
RESTは1つのリクエストに対して1つのレスポンスを返す方式をサポートしている。1つのリクエストで複数のレスポンスを取得する通信や、チャットのような双方向な通信はRESTの範囲外となる。
gRPC:様々なストリーミング
gRPCは1つのリクエストに対して1つのレスポンスを返す方式の他、HTTP/2の機能を活かしたストリーミングによる通信方式を提供している。ストリーミングによる通信方式は3種類あり、サーバからクライアントへの複数のメッセージを送信する方式、クライアントからサーバへ複数のメッセージを送信する方式、さらにクライアントとサーバの双方向で複数のメッセージを送信する方式がある。
今回はここまで。
次回はgRPCのデータ形式、Protocol Buffersについて記事にしたいと思っております。
