| この記事の要点 |
|
概要
gRPC は Google が開発・公開している RPC (Remote Procedure Call: 遠隔手続き呼び出し) フレームワークです。RPC とは「ネットワーク越しの関数を、あたかも手元の関数のように呼び出す」仕組みのことで、gRPC はその通信に HTTP/2 を、データ形式に Protocol Buffers(.proto) を採用することで、高速・低オーバーヘッド・多言語対応を実現しています。REST/JSON な Web API に比べてコンパクトで高速なため、特にマイクロサービス間の内部通信で広く使われます。親セクションは Web通信プロトコル です。
仕組み
gRPC の中心にあるのは IDL (インターフェース定義言語) としての .proto ファイルです。ここにサービス (呼び出せるメソッド群) とメッセージ (やり取りするデータ構造) を定義します。
- コード生成:
.protoから protoc コンパイラが各言語のクライアント/サーバの雛形コードを自動生成します。開発者はネットワーク処理を書かずに、生成された関数を呼ぶだけで通信できます。 - Protocol Buffers でシリアライズ: 送受信するデータは protobuf でバイナリ化されます。JSON より小さく・速く・型が明確で、フィールド番号によるスキーマ進化 (前方/後方互換) もしやすくなっています。
- HTTP/2 上で多重化・ストリーミング: 土台が HTTP/2 のため、1 接続で多数の呼び出しを多重化でき、ストリーミングも自然に扱えます。
gRPC のメソッドには 4 つの通信パターンがあります。1 リクエスト 1 レスポンスの ユーナリ、サーバが連続して返す サーバストリーミング、クライアントが連続して送る クライアントストリーミング、双方が同時に流す 双方向ストリーミング です。
実用例
まずサービスとメッセージを .proto に定義します。タグ記号などはコード内で正しく表示されるよう記述しています。
# greeter.proto (IDL)
syntax = "proto3";
package greeter;
service Greeter {
// ユーナリ呼び出し
rpc SayHello (HelloRequest) returns (HelloReply);
// サーバストリーミング
rpc SayHelloStream (HelloRequest) returns (stream HelloReply);
}
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
}
# .proto から各言語のコードを生成 (例: Python)
python -m grpc_tools.protoc -I. \
--python_out=. --grpc_python_out=. greeter.proto
# 生成コードを使った呼び出し (擬似)
# stub = GreeterStub(channel)
# reply = stub.SayHello(HelloRequest(name="world"))
# print(reply.message)
クライアントは生成された stub.SayHello(...) をローカル関数のように呼ぶだけで、内部的に HTTP/2 + protobuf で通信が行われます。
主な用途
- マイクロサービス間通信: サービス同士を低遅延・低オーバーヘッドでつなぐ内部 API として最有力。
- 多言語混在環境: Go・Java・Python・Node など異なる言語のサービスを、共通の
.protoで型安全に連携させる。 - ストリーミング処理: ログ・センサー・株価など連続データの送受信に双方向ストリーミングを使う。
- モバイル/IoT のバックエンド: コンパクトなバイナリで通信量を抑えたい場面。
REST/JSON との比較
| 項目 | gRPC | REST/JSON |
|---|---|---|
| データ形式 | Protocol Buffers (バイナリ) | JSON (テキスト) |
| 土台 | HTTP/2 | 主に HTTP/1.1・HTTP/2 |
| スキーマ | .proto で厳格に定義 | 緩い (OpenAPI 等は任意) |
| ストリーミング | 双方向まで対応 | 基本は要求-応答 |
| ブラウザ直接利用 | 不可 (要 gRPC-Web) | 容易 |
| 人間可読性 | 低い (バイナリ) | 高い |
注意点
- ブラウザから直接は使えない: ブラウザは生の gRPC を扱えないため、Web フロントからは gRPC-Web とプロキシ (Envoy 等) が要る。公開 Web API には REST の方が無難なことも多い。
- バイナリでデバッグしにくい: 中身が protobuf なので、JSON のようにそのまま目視できない。grpcurl などの専用ツールを使う。
- .proto の互換管理: フィールド番号の使い回しや型変更はスキーマ互換を壊す。番号は欠番化し、再利用しないなどの運用ルールが要る。詳しくは Protocol Buffers(.proto) を参照。
- 学習コストとインフラ対応: HTTP/2 前提のため、ロードバランサや監視が HTTP/2・gRPC に対応している必要がある。
関連リンク
子ページ
子ページはありません
同階層のページ
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- Git pushした変更の取消し|revert・履歴変更と保護の注意点 2026-10-15 23:49:01
- Gitでローカルを戻す前に|reset・restoreの違いと退避範囲 2026-10-15 23:49:01
- Git rebaseの使い方|対象範囲・競合解決・pushの判断 2026-10-15 22:50:59
- Git pullの使い方|取込み先・ff-only・競合とstashの注意点 2026-10-15 22:50:59
- Git pushの使い方|送信先・タグ・force-with-leaseの条件 2026-10-15 22:12:47
- Git remoteの設定・確認・削除|SSH URLとfetch/pushの違い 2026-10-15 22:12:47
- Gitリモートリポジトリの作成|初回push・既存履歴・mirrorの注意 2026-10-15 15:48:16
- Gitのuser.name・user.email設定|local/global・確認と過去履歴の注意 2026-10-15 15:30:07
- LinuxにGitをインストール|配布元・初期設定・TLSと認証の確認 2026-10-15 15:30:06
- Git導入と初回push|Linuxサーバー・Windows/macOS・SSH設定 2026-10-15 14:51:54
- Db2のCREATE INDEX|索引定義・INCLUDEと実行計画の確認 2026-10-15 14:10:22
- Db2の自動採番|IDENTITY・ID取得とRESTARTの注意点 2026-10-15 14:10:22
- 【DB2】特定スキーマの全テーブルの全カラム情報を取得する方法 2026-10-15 13:53:15
- Db2のシーケンスとIDENTITYの違い|採番とカタログの確認SQL 2026-10-15 13:53:15
- Db2で複数カラムをUPDATEする方法|SET・WHEREと更新前の値 2026-10-15 13:53:15