LoginSignup
1
0

golang ✕ gRPCでWeb用のプロキシサーバやgRPC-WEBを挟まずにブラウザからRPCをコールする [gRPC ✕ golangをDRYに Part.1]

Last updated at Posted at 2023-05-29

この記事のターゲット層

  • 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です。
スクリーンショット_2022-06-22_21.04.jpg

(※ 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

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0