gitkadoの日記

島根の若手エンジニアが暇潰しに書いてます

最近知ったこと(gRPC編)

仕事でgRPCを触る可能性があったので軽く調べてみました。
前提知識としてRPCを簡単に説明します。

gRPCとは

f:id:gitkado:20200523010426p:plain

転載: What is gRPC?

プチ情報(本編では深掘りしない)

grpc-gateway(GitHub)

  • gRPCをREST APIとして呼び出せるようにする
  • RPCサーバに対してのリバースプロキシサーバを起動する(参考)
    • コンテナ内で2つのサーバを起動することになる(うーん...)
  • ルーティングはProtocolBuffersに定義してbuildする

No plan to support
True bi-directional streaming.

  • grpc-gatewayは双方向streamingに対応していない
    • ProtocolBuffersで双方向streamingを定義してはいけない
    • 個人的にはgRPCの速度パフォーマンスが活かせないので微妙

身の回りのgRPC

Googleの認可基盤(Zanzibar)ではgRPCが使用されています。

実装例

1. service.proto(ProtocolBuffers)を作成

syntax = "proto3";
package authorization;
option go_package = "pb;authorization";

service Authorization {
    rpc Check (stream CheckMessage) returns (stream CheckResponse);
}

message CheckMessage {
    string name = 1;
}

message CheckResponse {
    bool is_check = 1;
}

2. 以下のコマンドでservice.protoからGo言語のコードを生成

protoc --go_out=plugins=grpc:. pb/service.proto

3. 生成されたコードのinterfaceをServer/Clientそれぞれで実装

サンプル

動くコードを書いてみました。(Dockerが必要です)

github.com

感想

とりあえずgRPCでServer/Clientは実装できたからOKとしよう。
本編と関係ないがZanzibarの論文読むのは辛かった...