gRPC (Google 2015)(ジーアールピーシー)
Google 2015年公開のRPC (Remote Procedure Call) フレームワーク。Protocol Buffers + HTTP/2 ベースで双方向Streaming・低遅延・多言語対応、マイクロサービス通信の定番。
概要
gRPC はGoogle が2015年2月にオープンソース化したRPC (Remote Procedure Call) フレームワーク。Google 内部RPC「Stubby」(10年運用の社内システム) のオープンソース化、CNCF (Cloud Native Computing Foundation) 寄贈。Protocol Buffers (バイナリシリアル化) + HTTP/2 (多重化) ベースで4通信パターン (Unary / Server Streaming / Client Streaming / Bidirectional Streaming) を提供、多言語SDK (10+ 言語) でマイクロサービス間通信の定番に。
gRPC 主要マイルストーン
| 年月 | 出来事 |
|---|---|
| 2015-02 | Google が gRPC 公開 |
| 2016-08 | gRPC 1.0 リリース |
| 2017-03 | CNCF Incubating |
| 2020-02 | CNCF Graduated |
| 2021 | gRPC-Web 安定化 (ブラウザ対応) |
| 2024 | バージョン 1.65+ |
通信パターン
| パターン | 説明 |
|---|---|
| Unary | 1リクエスト / 1レスポンス (通常RPC) |
| Server Streaming | 1リクエスト / N レスポンス |
| Client Streaming | N リクエスト / 1 レスポンス |
| Bidirectional Streaming | N リクエスト / N レスポンス (WebSocket類似) |
Protocol Buffers (Protobuf)
gRPC のシリアル化フォーマット:
- バイナリ形式 (JSON より3-5倍小・5-100倍高速)
- スキーマ定義 (.proto ファイル)
- 多言語SDK 自動生成
- バージョン互換 (前方・後方互換性)
// my_service.proto
syntax = "proto3";
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply);
}
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
}
# 自動コード生成
protoc --go_out=. --go-grpc_out=. my_service.proto
gRPC vs REST API 比較
| 項目 | REST API (JSON) | gRPC (Protobuf) |
|---|---|---|
| シリアル化 | JSON (テキスト) | Protocol Buffers (バイナリ) |
| サイズ | 1× | 1/3-1/5 |
| 速度 | 1× | 5-100× |
| プロトコル | HTTP/1.1 (主) | HTTP/2 標準 |
| Streaming | 限定 (SSE) | 4 パターン |
| Browser 対応 | 標準 | gRPC-Web 必要 |
| デバッグ | 容易 (Curl) | 困難 (バイナリ) |
| 学習曲線 | 低 | 中 |
| マイクロサービス | 標準 | 主流 |
| Cloud Native | 限定 | 標準 |
主要利用先
| プロダクト | 用途 |
|---|---|
| Kubernetes | API 通信 |
| Etcd | 分散KV ストア |
| TiKV / TiDB | 分散DB |
| CockroachDB | 分散SQL |
| Vitess | MySQL 分散 |
| Apache Beam | データパイプライン |
| Apache Kafka (一部) | ストリーミング |
| TensorFlow Serving | ML 推論 |
| Netflix Conductor | ワークフロー |
| Google Cloud APIs | 全て |
| Microsoft Azure | 多数 |
| HBase Spanner | DB |
サポート言語 (公式)
| 言語 | SDK |
|---|---|
| C++ | grpc-cpp |
| Java | grpc-java |
| Python | grpc-python |
| Go | grpc-go (純Go) |
| Node.js | grpc-js |
| Ruby | grpc-ruby |
| C# / .NET | grpc-dotnet |
| Swift | grpc-swift |
| PHP | grpc-php |
| Dart | grpc-dart |
gRPC-Web
ブラウザJavaScript からgRPC を呼び出す変種:
- gRPC-Web プロキシ (Envoy / nginx)
- Envoy / Nginx で gRPC → gRPC-Web 変換
- ストリーミングは Server Streaming のみ (Bidirectional 不可)
- 2018年Google公開・2020年安定化
主要ツール
| ツール | 用途 |
|---|---|
| protoc | コード生成 |
| Envoy | gRPC プロキシ |
| Buf | Protobuf Lint / Build |
| grpcurl | gRPC 用 curl |
| BloomRPC | GUI クライアント |
| Postman gRPC | API テスト |
関連用語との違い
- vs REST: 軽量バイナリ / テキスト
- vs WebSocket: RPC 構造化 / 単メッセージ
- vs GraphQL: クエリ言語 / RPC
FAQ
Q1: REST vs gRPC? A: 公開API・ブラウザ用途・人間可読性ならREST。マイクロサービス間・低遅延・大量通信ならgRPC。両者使い分けが現代主流。
Q2: HTTP/3 対応? A: gRPC はHTTP/2 が前提・HTTP/3 (QUIC) 直接対応は2024年実験的。Cloudflare等の Edge Proxy 経由でHTTP/3 接続可能。
Q3: 学習リソース? A: gRPC 公式チュートリアル (grpc.io)・「gRPC: Up and Running」(O'Reilly 2020)・YouTube CNCF プレゼン多数。