gRPC じーあーるぴーしー
Protocol BuffersRPCHTTP/2マイクロサービスストリーミングIDL
gRPCについて教えて
gRPCとは
gRPC(ジーアールピーシー)は、Googleが2015年に公開したオープンソースのRPC(Remote Procedure Call=遠隔手続き呼び出し)フレームワークです。RPCとは「別のサーバー上にある関数を、あたかも手元で呼び出すように実行する」仕組みのことで、gRPCはそれをモダンな技術スタックで実現しています。
通信プロトコルにはHTTP/2を採用し、データのシリアライズ(変換)にはProtocol Buffers(Protobuf)という高効率な形式を使います。REST APIがテキスト(JSON)でやりとりするのに対し、gRPCはバイナリ(0と1の羅列)でやりとりするため、データが小さくなり通信速度が大幅に向上します。
マイクロサービスアーキテクチャの普及とともに「サービス間通信をいかに速く・安全に・型安全に行うか」が課題になり、gRPCはその解答として急速に普及しました。GoogleやNetflix、Squareなど大規模システムで採用実績があります。
gRPCの仕組みと構造
gRPCの全体像は「定義ファイルを書く→コードを自動生成→呼び出す」というシンプルな流れです。
| ステップ | 内容 |
|---|---|
① .protoファイルを書く | サービスとメッセージの定義(IDL) |
② protocでコード生成 | クライアント・サーバーのスタブを自動生成 |
| ③ サーバー側を実装 | 生成されたインターフェースに処理を書く |
| ④ クライアントから呼び出す | まるでローカル関数のように呼び出せる |
4つの通信パターン
gRPCには用途に応じた4つの通信モードがあります。
| パターン | 説明 | 使いどころ |
|---|---|---|
| Unary RPC | 1リクエスト→1レスポンス | 通常のAPIと同じ |
| Server Streaming | 1リクエスト→複数レスポンス | 株価・ログのリアルタイム配信 |
| Client Streaming | 複数リクエスト→1レスポンス | ファイルアップロード |
| Bidirectional Streaming | 双方向に複数送受信 | チャット・リアルタイム通信 |
Protocol Buffers(Protobuf)の.protoファイル例
syntax = "proto3";
service UserService {
rpc GetUser (UserRequest) returns (UserResponse);
}
message UserRequest {
int32 user_id = 1;
}
message UserResponse {
int32 user_id = 1;
string name = 2;
string email = 3;
}
このファイル1つから、10以上のプログラミング言語向けのコードが自動生成されます。
歴史と背景
- 2000年代〜 Googleは社内で「Stubby」と呼ばれる独自のRPCフレームワークを使い、膨大なサービス間通信を処理していた
- 2015年2月 Stubbyをベースにオープンソース化したgRPC 1.0を公開。HTTP/2とProtobufを採用
- 2016年〜 CNCF(Cloud Native Computing Foundation)に寄贈され、Kubernetes・Envoyなどクラウドネイティブ技術との親和性が高まる
- 2017〜2018年 マイクロサービスブームとともに採用企業が急増。Netflix、Cisco、Juniperなどが導入
- 2020年〜 gRPC-Webの登場でブラウザからの直接呼び出しも可能に。Envoyプロキシ経由での利用が広がる
- 現在 gRPC is a CNCF Graduated Projectとして成熟したエコシステムを持ち、サービスメッシュ・Kubernetes環境での標準的な選択肢に
REST APIとgRPCの比較
システム発注・選定の際に「REST APIとgRPC、どちらを使うべき?」と問われることがよくあります。
| 比較項目 | REST API | gRPC |
|---|---|---|
| データ形式 | JSON(テキスト) | Protocol Buffers(バイナリ) |
| 通信プロトコル | HTTP/1.1(主流) | HTTP/2 |
| 速度・効率 | 普通 | 高速・軽量(2〜10倍程度) |
| 型の安全性 | 弱い(実行時エラー) | 強い(コンパイル時検出) |
| ブラウザ対応 | ◎ ネイティブ対応 | △ gRPC-Web経由が必要 |
| 学習コスト | 低い | やや高い |
| 向いている用途 | 外部公開API・Webアプリ | サービス間通信・IoT・リアルタイム |
| ツールの充実度 | ◎ 豊富 | ○ 充実してきた |
関連する規格・RFC
| 規格・RFC番号 | 内容 |
|---|---|
| RFC 9113 | HTTP/2の仕様(gRPCが採用する通信プロトコル) |
| RFC 7541 | HPACK — HTTP/2のヘッダー圧縮アルゴリズム |
| Protocol Buffers v3 | Googleが定めるgRPCのデータ直列化フォーマット仕様 |
| gRPC Core Spec | gRPC公式の通信仕様(grpc.io/docs/guides/) |
| gRPC-Web | ブラウザからgRPCを利用するためのプロキシ仕様 |
関連用語
- REST API — HTTPベースの標準的なWeb API設計スタイル。gRPCと比較・選定されることが多い
- Protocol Buffers — gRPCが採用するGoogleのバイナリシリアライズ形式
- HTTP/2 — gRPCが採用する高速通信プロトコル。多重化・ヘッダ圧縮が特徴
- マイクロサービス — gRPCが最も活躍するアーキテクチャパターン
- API Gateway — 外部クライアントとgRPCサービス群の間に置く中継コンポーネント
- サービスメッシュ — Istio・EnvoyなどgRPCと組み合わせて使うサービス間通信管理基盤