feature image

2021年12月23日 | ブログ記事

gRPC 完全に理解した

この記事はtraP Advent Calendar 2021 42日目の記事です。

こんにちは、20Bのxxarupakaxxです。

今回はgRPCについて解説していきます。

※本記事ではgRPCのサンプルコードはございません。ただただgRPCについて話していきます。

自分が所属しているプロジェクトのミーティングでgRPCについて話題が上がり実際にgRPCで開発を進める方針になったので自分が調べた限りの知見をまとめて共有しようかなと思います。

gRPCってなんぞや

gRPCって聞かれてもなんも思いつかないですよね.. gがついているから、Googleがなんか作ったんじゃないのって思うそこのあなた!そうです、Googleが開発したものなんです!!ですが、g + RPC..
RPCってなんだろうと思う方が多いかと思います。なのでまずRPCについて軽く説明していきます。

RPCってなに

RPCとは、Remote Procedure Callの略で逐語的に遠隔手続き呼び出しと訳されます。すなわち、別の場所にあるプログラムを呼び出そうっていう意味になります。もっと詳しく説明すると、違うアプリケーションロジックをあたかも自分のアプリケーションの処理と同じように扱えることができるというものです。
gRPC以外にもJSON-RPC,XML-RPCなどがあります。

gRPCについて

では本題のgRPCについて触れていきたいと思います。
gRPCの利点は大きく三つの点が挙げられます。

これは、gRPCの性質の利点ですが開発を進めるうえでgRPCを導入することで得られる素晴らしい恩恵はスキーマファーストであることです。
protoファイルを先に定義するのでAPIの仕様が初期の段階に整っており、常に仕様が確認できる状態にあるということ、これが素晴らしいのです!

こういう点から僕はgRPCを推していきたいですね(gRPC自体も性能として素晴らしいものばかりです)

gRPCの通信の種類

gRPCは様々な通信方式を可能にします。そしてそれらは簡単に実装ができます。

Unary RPC

1つのリクエストに対して一つのレスポンスを返す一般的な通信です。REST APIと動きは似ています。

Server streaming RPC

クライアントから送られてきた一つのリクエストに対して、複数回に分けてレスポンスを返す通信方式です。最後のレスポンスを返した後も任意にサーバーの情報を変更に応じてクライアントにその情報を送ることができます。

Client streaming RPC

クライアントからリクエストを分割して送ってサーバーはすべてのリクエストを受け取ってからレスポンスを返します。大きなデータをPOSTしたいときに便利です。

Bidirectional streaming RPC

クライアントからリクエストが送られてきたときにサーバーとクライアントは一つのコネクションを確立しお互いに任意のタイミングでリクエストとレスポンスを送りあうことが可能になります。
WebSocketが脳裏に浮かぶ方もいるかと思います。WebSocketはREST APIで主に用いられますがWebSocket用のサーバーを別途で用意する必要があり少し手間が存在します。また、gRPC(HTTP/2)は無駄な情報が少ないのでWebSocketと比べて高速です。

以上がgRPCの説明でこれが理解できれば、gRPCはどのようなものかがわかるかと思います。
次にgRPCを学習するにつれて出会う用語について説明したいと思います。

gRPC-Web

gRPC通信をWebで使うことができるというものです。つまりgRPCをブラウザで動けるようにブラウザの制限にあわせたプロトコルを定義しているものです。

gRPC-Webを使用した場合(左)とgRPCを呼び出すREST APIを実装したサーバーを用意した場合(右)

HTTPサーバーが仲介者として機能することなく、WebアプリがgRPCバックエンドサービスと直接通信できるようになるものですね。またクライアントもバックエンドもgRPCでの実装なので完全なエンドツーエンドのgRPCサービスアーキテクチャを作成できることが利点です。protoファイルに記述したらあとはお互い実装あるのみで開発も進められやすいです。
ですが、gRPC-Webでブラウザを使うのにはプロキシを挟む必要があります。(envoyとかnginxとか)
grpc-webにはmode = grpcwebtext, mode = grpcweb の二種類のモードがありコンテンツタイプは、それぞれapplication/grpc-web-text,application/grpc-web+protoであります。
しかしgrpcwebtextはUnaryとServer streamingがサポートされているがgrpcwebは現在のところ、Unaryのみとなっています。

gRPC-Webの詳細はこちらで確認できます。

Core concepts, architecture and lifecycle
An introduction to key gRPC concepts, with an overview of gRPC architecture and RPC life cycle.

gRPC-WebとREST API

gRPCのほうがREST APIと比べて高速です。ですが、クライアントがRESTfulな開発を進めていてからのgRPCへ移行は厳しいものがあります。ほぼすべてをgRPCベースに書き換える必要があるのでgRPCで得られる恩恵よりもコストが高く感じられます。

gRPC-Gateway

gRPC-GatewayはgRPCで書かれたAPIをJSONまたはgRPCで提供できるプロキシです。

gRPC-Gateway

protoファイルに書かれたサービスの定義をgRPC-Gatewayは理解し、それをREST APIのように変換してくれます。envoy等のプロキシを挟む必要がなく(あってもよい)gRPC-GatewayだけでRESTfulなAPIを受け取れます。また、protoファイルからswagger.jsonを自動出力してくれる機能も備わっており、ドキュメント生成に関しては申し分ないです!この自動生成を使えばすぐさまAPIの仕様を管理&&修正できるのでもうやばいですね

ですが、gRPC-Webと比べて、JSONの解析に時間がかかりgRPC-Webと比べたらパフォーマンスは落ちます。
gRPC-Gatewayの詳細はこちらで確認できます。

gRPC-Gateway
Documentation site for the gRPC-Gateway

envoyでもいいのでは?

先ほど説明した通り、gRPC-GatewayとenvoyはどちらもJsonをgRPCに変換してくれる機能を持ち合わせています。
ですがenvoyは高機能なプロキシソフトウェアであって負荷分散や圧縮やアクセスログの出力もnginx等と同じように使えます。また、gRPC-GatewayはGo言語でのみの対応であるが、envoyは他言語にも対応しています。

gRPC-JSON transcoder — envoy 1.21.0-dev-9105f4 documentation

使い道はどちらでもいいですが、JSONを変換してくれるだけでいい+Golang実装だったら、gRPC-Gatewayでいいのかなと思います。

最後に

gRPCのgってGoogleのgじゃないんですよね。gRPCのgの意味合いはバージョンごとに異なります。
1.0のときはggRPCを表し,その次の1.1のときはgoodを表します。現在最新のバージョンである1.44ではgreatを表すそうです。詳細はこちらで確認できます。

grpc/g_stands_for.md at master · grpc/grpc
The C based gRPC (C++, Python, Ruby, Objective-C, PHP, C#) - grpc/g_stands_for.md at master · grpc/grpc

また余談ですがサムネイルの子犬キャラクターかわいいですよね!!実は、gRPCのマスコットで犬種がGolden Retrieverで名前はPanCakesです。よくみるとgRPCという文字が隠れていますね!!本当にかわいい!!!!!!!!


機会があれば、gRPCを実際に用いた記事を書きたいと思います!!

明日のAdCは@mazreanさんです。楽しみですね~~!!

xxarupakaxx icon
この記事を書いた人
xxarupakaxx

20Bです。SysAd班,Game班で活動してます。C#、Go言語が好き

この記事をシェア

このエントリーをはてなブックマークに追加
共有

関連する記事

2021年8月12日
CPCTFを支えたWebshell
mazrean icon mazrean
2021年5月19日
CPCTF2021を実現させたスコアサーバー
xxpoxx icon xxpoxx
2021年12月8日
C++ with JUCEでステレオパンを作ってみた【AdC2021 26日目】
liquid1224 icon liquid1224
2021年11月25日
【一人カラオケ活用術】安く済ませるボーカルレコーディング【AdC2021 13日目】
liquid1224 icon liquid1224
2021年11月24日
クリスマスデートをしよう!!!
mera icon mera
2021年12月24日
DBを移行しました
hijiki51 icon hijiki51
記事一覧 タグ一覧 Google アナリティクスについて