gRPCについて

今度これやる
参考資料

RPCとは
gRPCの前に、まずRPCについて説明しましょう。
RPCとは?
RPC:Remote Procedure Call
離れた場所にある関数(Procedure)を、まるでローカル関数のように呼び出す技術
イメージ(比較)
通常の関数呼びだし
user := GetUserById(1)
普通にローカルのプログラム内の関数呼び出し
RPC呼び出し
user := grpcClient.GetUserById(1)
GetUserByIdは別サーバーの関数なのだ!!
自分のプログラムで定義していない関数なのに、普通に呼び出して使えちゃう!!

従来のRPCについて
代表的なもの:SOAP
XMLベースで定義されたRPCプロトコル
データ形式: XML(人間可読だが冗長)
インターフェース定義: WSDL(Web Services Description Language)というXML形式の仕様書
セキュリティ: WS-Securityによる高度なメッセージレベルの認証・暗号化
プロトコル: 主にHTTP(だがSMTP, FTPなども使用可能)
使われた分野: 金融、保険、政府系、Java EE、.NET など
SOAPの呼び出し例
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<getUser xmlns="http://example.com/">
<id>1</id>
</getUser>
</soap:Body>
</soap:Envelope>
複雑じゃ・・・

RPCとRESTの違い
そもそもAPIとは
API=ソフトウェア間のやり取りの窓口
→RESTもRPCもAPIの一種
→設計思想が違うのだ!!
それぞれの設計思想について
RPC
- クライアント→サーバの「関数」を呼びだす
- エンドポイント名=動詞(getUser, createUser)
- gRPC, JSON-RPC,XML-RPCなど
REST
- 「**リソース(データ)**に対する操作」をHTTPの動詞(GET,POST,PUT,DELETE)で表現
- エンドポイント名 = 名詞 (/users)
- 操作はHTTPメソッドで指定

gRPCについて
項目 | REST | RPC(従来) | gRPC |
---|---|---|---|
プロトコル | HTTP/1.1 | HTTP/1.1, TCPなど | HTTP/2 |
データ形式 | JSON | JSON or XML | Protobuf |
型安全性 | 低い | 低い | 高い |
通信方法 | 一般的にReq/Resのみ | 一般的にReq/Resのみ | ストリーミング可能 |
速度 | 遅め | やや遅い(XML重い) | 非常に高速 |
自動コード生成 | 手作業 | 一部ツールありだが非主流 | Protobufから自動生成可 |
gRPCに必要な技術
- HTTP/2 https://zenn.dev/link/comments/47b143ff77727d
- Protocol Buffers
HTTP/2
RPCを行うために以下二つの動作は必要
- クライアントからサーバーに呼び出すと引数の情報を伝える
- サーバーからクライアントに戻り値の情報を伝える
→HTTP/2のPOSTを利用
Protocol Buffers(シリアライズ方式)
gRPCでは呼び出したかmん数の引数の情報や、戻り値の情報をプレーンテキストで書くのではなく、Protocol Buffersというシリアライズ方式を用いて変換した内容をリクエスト・レスポンスボディに含める必要がある。
gRPCで可能な4種類の通信方式
- Unary RPC
- Server streamig RPC
- Client streaming RPC
- Bidirection streaming RPC
Unary RPC
「1リクエスト-1レスポンス」の通信方法
Server streamig RPC
クライアントから送られた1回のリクエストに対して、サーバからのレスポンスが複数帰ってくる通信方式
Client streaming RPC
さっきと逆。
クライアントから複数のリクエストに対し、サーバーからは一回のレスポンス
Bidirection streaming RPC
サーバ/クライアントともに任意のタイミングで、リクエスト・レスポンスを送ることができる通信方式。
WebSocketのような双方向通信のイメージ

実際にgRPCを実装
- google.golang.org/grpc: GoでgRPCを扱うためのパッケージ
- google.golang.org/grpc/cmd/protoc-gen-go-grpc: protocコマンドがGoのコードを生成するのに利用