gRPCについて
🚀はじめに
本記事では、gRPC(ジーアールピーシー)という通信プロトコルについて、
その「背景(なぜ生まれたか)」と「嬉しさ(導入する利点)」、さらにRESTとの比較やサンプルコードまで、
実用に役立つ情報を盛り込んで紹介します。
🏗️gRPCとは何か?
gRPC(Google Remote Procedure Call)は、Googleが開発した高速で軽量なRPCフレームワークです。
内部的にはHTTP/2を使い、通信データはProtocol Buffers(Protobuf)というバイナリ形式でやり取りされます。
「API通信をもっと賢く・高速に・型安全にした次世代のRPC」
🕰️gRPCが生まれた背景
🌐REST APIの限界
マイクロサービスが普及するにつれ、サービス間通信の回数が激増しました。
従来のREST APIでは以下のような課題が浮上します:
-
毎回HTTPヘッダーが重く、オーバーヘッドが大きい
-
データ形式がJSONのため、シリアライズ/デシリアライズが重い
-
型情報が薄く, APIミスが実行時でないと発見できない
-
リアルタイム性やストリーミング通信への対応が弱い
🛠️Google社内の実情と課題
Googleは数千のマイクロサービスを内部で運用しており、
その中で求められた要件:
-
軽量で高パフォーマンスな通信
-
安定した型安全なインタフェース
-
双方向通信やストリーミング対応
その結果生まれたのがgRPCです。
🌟gRPCの嬉しさ
⚡高速&軽量
-
バイナリ形式(Protobuf)により通信量が最小限
-
HTTP/2対応により接続の多重化が可能
-
モバイルやIoTデバイスでも高速応答
🔧型安全な自動生成コード
-
.proto
ファイルからサーバ/クライアントのコードを多言語対応で自動生成 -
明確な型定義により、補完・静的解析が強力
🔄柔軟な通信パターン
-
通常のリクエスト/レスポンス
-
サーバストリーミング
-
クライアントストリーミング
-
双方向ストリーミング
🧩メンテナンス性と拡張性
-
API定義が1箇所(
.proto
)に集約されることで、仕様が明確 -
後方互換性を保った進化がしやすい
⚔️REST APIとの比較
項目 | REST API | gRPC |
---|---|---|
プロトコル | HTTP/1.1 | HTTP/2 |
データ形式 | JSON | Protocol Buffers(バイナリ) |
通信速度・効率 | 普通(テキストベース) | 高速(バイナリ&多重化) |
ストリーミング | 非標準(WebSocket等が必要) | 標準で対応(双方向ストリーム可能) |
型安全性 | 低い(手動で記述) | 高い(コード生成+コンパイル) |
クロス言語対応 | OpenAPIなどで補完可能 | 多言語対応が標準 |
ブラウザ対応 | ◎(直接呼び出し可能) | △(gRPC-Webが必要) |
デバッグのしやすさ | ◎(curlやPostmanでOK) | △(専用ツールが必要) |
【情報】gRPCは内部通信に強く、RESTは外部公開APIに適しています。
🧪gRPCの簡単なサンプルコード(Python)
📁 .protoファイル
syntax = "proto3";
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
}
🖥️ サーバー(Python)
import grpc
from concurrent import futures
import hello_pb2
import hello_pb2_grpc
class Greeter(hello_pb2_grpc.GreeterServicer):
def SayHello(self, request, context):
return hello_pb2.HelloReply(message=f"こんにちは、{request.name}さん!")
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
hello_pb2_grpc.add_GreeterServicer_to_server(Greeter(), server)
server.add_insecure_port('[::]:50051')
server.start()
server.wait_for_termination()
🧑💻 クライアント(Python)
import grpc
import hello_pb2
import hello_pb2_grpc
channel = grpc.insecure_channel('localhost:50051')
stub = hello_pb2_grpc.GreeterStub(channel)
response = stub.SayHello(hello_pb2.HelloRequest(name='田中'))
print(response.message)
【成功】このように、.proto
ファイルを書けば、gRPCが通信と型のコードを全部用意してくれます!
🎯gRPCの使いどころ
gRPCが特に活躍するのは以下のような場面です:
-
マイクロサービス間通信
-
IoT機器やスマホアプリとの通信
-
チャット・ゲーム・配信などのリアルタイム通信
-
内部システム向けAPI(外部公開しない用途)
🔚まとめ
gRPCは、RESTでは手に余る高度な通信要件をスマートに解決してくれる技術です。
-
「通信をもっと速く、正確に、安全にしたい」
-
「複数の言語を横断するシステムを一元管理したい」
-
「リアルタイムな双方向通信が欲しい」
そんなとき、gRPCはきっとあなたのプロジェクトを支える心強い選択肢になります。