「Go + grpc-gateway で作る JSON API サーバ速習会」を開催しました

こんにちは.Wantedly でエンジニアをしている泉(@izumin5210)です.現在はプロフィール・つながり基盤チームにて何年後かの Wantedly を作りつつ,People のマイクロサービスたちと戯れる仕事をしています.

さて,先日 Wantedly 東京オフィスにて「Go + grpc-gateway でつくる JSON API サーバ速習会」というイベントを開催しました.本記事では,この速習会で話したこと・やったことを軽く紹介したいと思います.


なにをやったか

次のような内容を簡単に話しつつ,ちょっとしたハンズオンをしました.

  • Wantedly People のマイクロサービス開発において, どのような課題があったか
  • 課題の解決策として grpc-gateway の提案
  • grpc-gateway の補助とレール敷設のためのツールである grapi の紹介

当日のハンズオンで使ったリポジトリは wantedly/grpc-gateway-study です.develop ブランチには RDB をバックエンドに持ったマイクロサービスのサンプルコードがあります.

grpc-gateway

grpc-gateway は gRPC サーバの前段に立つリバースプロキシです.gRPC(protobuf)の通信を僕達が慣れ親しんだ application/json な API に変換してくれます.Wantedly 以外での採用事例で有名なものとしては,Kubernetes が利用している分散 KVS である etcd があります.

Go + grpc-gateway という構成自体は去年秋から"こっそり"本番に投入されています.「JSON API でも gRPC(protobuf)の IDL とコードジェネレーションの恩恵を受けたい」というモチベーションで採用されました.Wantedly People アプリが起動されるたびにアクセスされるサービスですが,非常に安定して動作しています.

grapi

grpc-gateway 利用していくにあたって,見えてきた弱点として「ボイラプレートが非常に多い」というものがありました.マイクロサービスを新しく作りたいと思ったときに,「また listener を2つ開いてサーバを2つ立てるコードを書くのか…」「またあの Makefile を作るのか…」みたいな負の感情にとらわれて生産性が下がるという非常に悩ましい問題でした.これを解決するために作られたのが grapi です(読み方は "ぐらっぴ").

grapi は「サーバの起動プロセスをラップしたパッケージ」と「コードジェネレーションをおこなう CLI」の2つの顔を持っています.

パッケージとしての grapi は,gRPC と grpc-gateway それぞれの起動プロセスをシンプルな API でラップします.自分で書くと gRPC サーバ実装の登録 + サーバ起動でそこそこの記述量を要求されますが,そこを非常に少ない行数で実現できる API を提供します.

func Run() error {
// ミドルウェアのクライアントなどの初期化
db, err := sqlx.Open("postgres", "postgres://postgres:@localhost/grpc-gateway-study?sslmode=disable")
if err != nil {
return err
}
defer db.Close()

// サーバ起動
s := grapiserver.New(
grapiserver.WithDefaultLogger(),
grapiserver.WithServers(
server.NewBookServiceServer(db),
),
)
return s.Serve()
}

CLI としての grapi は,「Rails ライクなコード生成」 と「protoc コマンドのラッパー」などを提供します.コード生成については,grapi init によるプロジェクト生成やGoogleの「API 設計ガイド」に則った .proto.go の生成などをします.ツール側である程度のレールを敷いてあげることで,開発者は余計なことを考える必要なく本質的な部分の実装の集中できるようになります.

おわりに

今週末の Go Conference 2018 Spring にて,grpc-gateway と grapi の活用やこれらを用いたマイクロサービス開発,そこからどう発展していくかなど,より WHAT にフォーカスした話をさせて頂く予定です.

また,今月開催の技術書典4で頒布予定の Wantedly Tech Book 4 では「なぜ Go か」「なぜ grpc-gateway を採用したか」「なぜ grapi が必要だったか」など,より WHY にフォーカスした内容の記事を書く予定です.

Wantedly, Inc.'s job postings
Anonymous
3c7db7dd fa0c 4655 9225 ea81967920bb?1536915809
Picture?1523062719
20620884 1261426487300551 61623792624306910 n
Picture?1523143883
38135534 f797 45ba 9124 0d4ce88ad6a4?1508994704
30 Likes
Anonymous
3c7db7dd fa0c 4655 9225 ea81967920bb?1536915809
Picture?1523062719
20620884 1261426487300551 61623792624306910 n
Picture?1523143883
38135534 f797 45ba 9124 0d4ce88ad6a4?1508994704
30 Likes

Weekly ranking

Show other rankings

Page top icon