Carpe Diem

備忘録。https://github.com/jun06t

grpc-gatewayでgRPCサーバをRESTで叩けるようにする

概要

gRPCはProtocol Buffersを喋るもの同士ではメリットが大きいですが、RESTしか叩け無いものや、curlでRESTを叩くようにサクッと検証したかったりするときに不便です。
そんな問題を解消してくれるのがgrpc-gatewayで、protobuf定義からREST APIを提供するリバースプロキシを生成してくれます。

github.com

環境

続きを読む

gRPCにおける各RPC方式の実装方法【Bidirectional streaming RPC】

概要

前回の

gRPCにおける各RPC方式の実装方法【Client streaming RPC】 - Carpe Diem

に引き続き、最後はBidirectional streaming RPCの実装方法を紹介します。
チャットのようなリアルタイム通信や、大きなデータを少しずつ処理したい時、Simple RPCで毎回コネクションを張るコストを避けたい時などに有用です。

環境

  • golang 1.9.2
  • grpc 1.7.2
  • protobuf 3.4.0

成果物

最終的に出来たコードはこちら

github.com

続きを読む

gRPCにおける各RPC方式の実装方法【Client streaming RPC】

概要

前回の

gRPCにおける各RPC方式の実装方法【Server streaming RPC】 - Carpe Diem

に引き続き、今回はClient streaming RPCの実装方法を紹介します。
こちらは大きなリクエストを分割して送りたい時に有用です。

環境

  • golang 1.9.2
  • grpc 1.7.2
  • protobuf 3.4.0

成果物

最終的に出来たコードはこちら

github.com

続きを読む

gRPCにおける各RPC方式の実装方法【Server streaming RPC】

概要

前回の

gRPCにおける各RPC方式の実装方法【Simple RPC】 - Carpe Diem

に引き続き、今回はServer streaming RPCの実装方法を紹介します。
サーバ側から複数のレスポンスを送ることができるので、フィードなどをReactiveに取得したい時に使ったり、サーバサイドプッシュを使いたい時などで有用です。

環境

  • golang 1.9.2
  • grpc 1.7.2
  • protobuf 3.4.0

成果物

最終的に出来たコードはこちら

github.com

続きを読む

gRPCにおける各RPC方式の実装方法【Simple RPC】

概要

gRPCは4つのRPC方式を持っています。

RPC方式 説明 使い所
Unary(Simple) RPC シンプルな1 Request - 1 Response方式 一般的なマイクロサービスなど
Server streaming RPC 1 Request - N Response方式 サーバサイドプッシュ・フィードなど
Client streaming RPC N Request - 1 Response方式 データアップロードなど
Bidirectional streaming RPC 1つのTPCコネクションの中で、RequestとResponseの送受信を任意数繰り返す。
WebSocketに近い?
チャットなど双方向の同期が欲しい時。
コネクション数を節約したい時

ref: grpc / gRPC Concepts

それぞれ実装が異なるので、各方式での書き方を簡単に紹介します。
今回はSimple RPCのやり方です。

続きを読む

protoeasyでprotobufのコンパイルを簡単にする

概要

gRPCなどで使われているprotobufですが、.protoの定義は簡単でもコンパイルにちょっと学習コストがかかります。
gogoprotogrpc-gatewayといった他のライブラリも使うと、中々にカオスなコマンドになります。

grpc-gatewayの例

protoc -I/usr/local/include -I. \
  -I$GOPATH/src \
  -I$GOPATH/src/github.com/grpc-ecosystem/grpc-gateway/third_party/googleapis \
  --grpc-gateway_out=logtostderr=true:. \
  path/to/your_service.proto

ref: https://github.com/grpc-ecosystem/grpc-gateway

この辺の手間を解決してくれるのが次のツールです。

github.com

面倒なコマンドをオプションで簡単に使えるようにしてくれます。

続きを読む

TypeScriptのthisでハマった話

概要

AngularでエラーハンドリングをまとめようとしたらTypeScriptのthisの扱いにハマった話です。

環境

  • TypeScript 2.5.3
  • Angular 4.4.6

どんな問題が起きていたか

APIコールのロジックでエラーが発生した時のハンドリングをまとめることができるよう、共通のErrorServiceを持っていました。
ただ時々ErrorServiceでCannot read property 'navigateByUrl' of undefinedというエラーが出てきていました。

続きを読む