この記事のターゲット層
- viviONという会社に興味がある方
- golangのAPIについて学びたい方
- gRPCを触り始めた方
筆者が抱えているgRPCの最大の課題感
クライアントサイドからRPCを呼び出す為には、やること多すぎて辛いんだってばよ。。。。!
ただでさえgolangは「ハハハ、golang?筋トレにはちょうどいい言語だね!」とDisられるほど特定のロジックを組むためには大量のcode stepを要求される言語です。
APIサーバ間の通信には当たり前ですが、クライアントサイドが存在しており、ただでさえ記述量の多い言語なのにgRPCでAPIコールをしようとするとリクエストstructを他のリクエスト用structに型変換するだけで一日が終わってしまいます。
問題その② ブラウザ(クライアントサイド)からカジュアルにRPCを呼べない
これを解消するためには、gRPCサーバの前段にProxyを置くかgrpc-webを利用する必要がありました。
以下がそのリポジトリです。
サーバなど立てずにもっとカジュアルにcurl http://xxx.com/posts
みたいなターミナルからワンライナーで呼び出せると嬉しいですよね > <
時代は進歩し前段にProxyを挟まくてもjson curlをサポートしてくれるOSSがあった
protobufジェネレータで有名なBufを開発している「Buf Technologies, Inc」のconnect-goです。
(※ Node.js版はまだ、試験運用段階で、今年中にはProductionになるのではないかとのことです。)
connect-goはgRPCのラッパー
アプリ内部では基本的にこれまで通りリクエストとレスポンスにprotobufを利用するのですが、アプリケーションレイヤーレベルでconnectが存在しており、http/(1 or 2)でのリクエストをラッピングしてprotobufにコンバートしてくれます。
つまり、以下のようなgRPC呼び出しが
grpcurl \
-plaintext \
-d '{"title": "Hello"}' \
localhost:8000 example.v1.GreetService/Greet
以下のように呼び出すことが可能です。
curl \
--header "Content-Type: application/json" \
--data '{"title": "Hello"}' \
http://localhost:8000/example.v1.GreetService/Greet
更に凄いのがcurl + --http2
オプションで呼び出してもちゃんと動作する為、guzzle等のメジャーHTTP Clientから高速なプロトコルであるhttp2を利用してRPCを呼び出すこともできます。
つまり、gRPCとJSON:APIの両対応ハイブリッド状態でAPIを公開できる ... ! (凄い!)
まとめ
gRPCがAPIの標準になる世界はもうすぐそこまで来ているのかもしれない。。
Part.2は 「protocからBufに乗り換えて設定をソースコード管理しよう」です☆
採用PR