gRPCとgrpc-gatewayを フル活用したweb開発

D7bdc8a7ccee78c64ca96e0ed4a7b070?s=47 Go Sagawa
December 04, 2019

gRPCとgrpc-gatewayを フル活用したweb開発

D7bdc8a7ccee78c64ca96e0ed4a7b070?s=128

Go Sagawa

December 04, 2019
Tweet

Transcript

  1. gRPCとgrpc-gatewayを フル活用したweb開発 golang.tokyo #28 Dec 4, 2019 Go Sagawa and

    factory,inc. @go_sagawa
  2. About me Go Sagawa Backend engineer and factory, inc. Smartphone

    app Div Twitter : @go_sagawa
  3. 構成

  4. 今日話すこと • protoをどう作成するか • grpc-gatewayをどのように活用するか grpc-gatewayの活用方法 protoをどうやって作るか?

  5. ケース1 機能で分ける 画面数50程のアプリに対し 大まかな機能毎に10数proto 1protoに2~8API 共通で使うものが数proto

  6. ケース1 の問題点 クライアント側もprotoからコード生成したいが、 rpcの情報が邪 魔 上手く抽象化されず、複雑になってくる

  7. 抽象化してないもの

  8. 抽象化したもの

  9. 抽象化したもの Bは他でも使うの で共通に

  10. 抽象化したもの × 書き換えが多く発生 × Bが共通で使われない × 別のprotoでC’が作れられる × 名前がかぶる ×

    依存関係がわかりにくい
  11. 解決するために protoの時点で 構造化を意識してみよう!

  12. protoを上手く構造化する

  13. protoを上手く構造化する

  14. 改良したproto構成 画面数50程のアプリに対し 大まかな機能毎にrpc用protoと画面protoが10数 モデルprotoが50程 rpc以外はクライアント側も利用してコード生成 画面protoは極力モデルを利用する

  15. その他のtips フォーマッタとしてclang-format を活用する

  16. その他のtips nilになる可能性のあるユーザ定義メッセージを明示 する

  17. その他のtips grpc-gatewayで ゼロ値も出力するように設定しておく 参考:【grpc-gateway】0, false, nullなどの値をJSON出力対象にする Https://qiita.com/cpp0302/items/2450ee93e7c5fbec28a7

  18. その他のtips レビューをクライアント側も交えて行う →全APIモックを作り切ってから実装に入っている Backend iOS android

  19. 共通proto protoで全て表現できるのは良いですが、スキーマからAPI仕様がしれなくなるのでアン チパターンなのではと思ってます。 共通のパラメータはgRPCのメタデータでやり取りするのが良いと思います。

  20. grpc-gatewayの活用法 単にprotobufがjsonになってデバッグしやすくなる 事がメリットではない!

  21. grpc-gatewayの活用法 ・net.httpを利用しており、同じようにミドルウェアが かける。

  22. grpc-gatewayの活用法 ・ログイン以外のAPIを暗号化および複合する ・メンテナンス状態にして全APIをシャットアウトする ・バージョンを判断して、強制アップデートを促す ・外部サービス(広告サービスや各種ツール)から呼ばれる、通信方式がJSONでないリ クエストの対処 ・ヘルスチェック用のAPI提供    

  23. まとめ • protoは上手く構造化して抽象化するとより活用 しやすい • grpc-gatewayはmiddlewareを使うとより強力に なる