Open6

gRPCについて

Hina🐣Hina🐣

RPCとは

gRPCの前に、まずRPCについて説明しましょう。

RPCとは?

RPC:Remote Procedure Call
離れた場所にある関数(Procedure)を、まるでローカル関数のように呼び出す技術

イメージ(比較)

通常の関数呼びだし

user := GetUserById(1)

普通にローカルのプログラム内の関数呼び出し

RPC呼び出し

user := grpcClient.GetUserById(1)

GetUserByIdは別サーバーの関数なのだ!!
自分のプログラムで定義していない関数なのに、普通に呼び出して使えちゃう!!

Hina🐣Hina🐣

従来の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>

複雑じゃ・・・

Hina🐣Hina🐣

RPCとRESTの違い

そもそもAPIとは
API=ソフトウェア間のやり取りの窓口
→RESTもRPCもAPIの一種
設計思想が違うのだ!!

それぞれの設計思想について

RPC

  • クライアント→サーバの「関数」を呼びだす
  • エンドポイント名=動詞(getUser, createUser)
  • gRPC, JSON-RPC,XML-RPCなど

REST

  • 「**リソース(データ)**に対する操作」をHTTPの動詞(GET,POST,PUT,DELETE)で表現
  • エンドポイント名 = 名詞 (/users)
  • 操作はHTTPメソッドで指定
Hina🐣Hina🐣

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
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のような双方向通信のイメージ

Hina🐣Hina🐣

実際にgRPCを実装

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