1
/
5

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

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

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

Golang + grpc-gateway でつくるJSON API サーバ速習会@wantedly (2018/03/27 19:00〜)
概要 Wantedlyが内部向けにやっている勉強会に15名様だけご招待。 Go で サーバを書くのによく問題になるのが, * 「どのライブラリを使えばいいかわからない」 * 「レールがないのでどう書けばいいかわからない」 * 「冗長なコードが多い」 また,JSON API サーバを実装する際に問題になるのが, * 「ドキュメントのメンテがしんどい」 grpc-gateway を利用して,これらの問題から解放された快適な JSON API サーバ開発を紹介します! ## 対象 * API サーバを書くベスト
https://wantedly.connpass.com/event/82378/


なにをやったか

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

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

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

wantedly/grpc-gateway-study
grpc-gateway-study - sample code for grpc-gateway study #grpc_gateway_wt
https://github.com/wantedly/grpc-gateway-study

grpc-gateway

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

grpc-ecosystem/grpc-gateway
grpc-gateway - gRPC to JSON proxy generator following the gRPC HTTP spec
https://github.com/grpc-ecosystem/grpc-gateway

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

grapi

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

izumin5210/grapi
grapi - 😮 A surprisingly easy API server in gRPC and Go
https://github.com/izumin5210/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 の生成などをします.ツール側である程度のレールを敷いてあげることで,開発者は余計なことを考える必要なく本質的な部分の実装の集中できるようになります.

grapi - A surprisingly easy and good API server, implemented with gRPC and Go
Recorded by izumin5210
https://asciinema.org/a/172436

おわりに

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

Go Conference 2018 Spring (2018/04/15 09:00〜)
スケジュール / Time Schedule 時間 ルーム1(Room 1) ルーム2(Room 2) 09:30 - 会場(Open) 10:00 - 10:10 オープニング(Opening Talk) 10:10 - 11:00 キーノート(Keynote) 11:00 - 11:10 休憩(Break) 休憩(Break) 11:00 - 11:50 ■スポンサーセッション(Suponsor Sessions) ・サイボウズ株式会社 様(Cybozu, Inc.) ・株式会社メルカリ 様(Merc
https://gocon.connpass.com/event/82515/

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

技術書典4
技術書の祭典が2018年4月22日(日)@秋葉原UDXで開催決定!
https://techbookfest.org/event/tbf04
Wantedly, Inc.'s job postings
30 Likes
30 Likes

Weekly ranking

Show other rankings
Like Masayuki Izumi's Story
Let Masayuki Izumi's company know you're interested in their content