メインコンテンツへスキップ

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はきっとあなたのプロジェクトを支える心強い選択肢になります。