golangでgRPCを使ったAPIServerを作ってみる

はじめに

eureka, Inc.
Eureka Engineering
12 min readDec 5, 2017

--

この記事は、 eureka Advent Calendar 2017 5日目の記事です。

こんにちは、エウレカでCTO(*Cat Tech Officer)を営む傍、サーバーサイドエンジニアとして
日々生計を立てている@marnie-eureです。

2015年にgRPCが発表されてから、2年が経ちましたね。
国内外の大手企業でのgRPCの事例も増えてきました。

これからのご時勢、gRPCの一つも使えないのでは、愛する猫たちを養っていくことも難しいかもしれない。

そんな危機感にかられたので、今回はふわふわっとgRPCを使ってAPIを作ってみようと思います。

  • (注) CTO(Chief Tech Officer)は@kaneshinなので 猫以外の話 はそちらにお問い合わせください。

gRPC Basics

gRPC?

gRPCは、Googleによって開発されたRPCフレームワークです。
HTTP/2を使用した通信層(ProtocolBuffersでシリアライズ)とProtocolBuffers(標準)としたテンプレートコードの生成がセットで提供されています。

勿論、HTTP2のstreamもサポートしています。
gRPCのRPC方式は以下の通り。

  • Unary RPC (1リクエスト1レスポンス)
  • Server streaming RPC (1つのリクエストに複数レスポンス)
  • Client streaming RPC (複数のリクエストに一つのレスポンス)
  • Bidirectional streaming RPC(双方向)

対応言語/platformも幅広く

  • C++
  • go
  • Ruby
  • Android Java
  • PHP
  • Objective-C

等の複数言語をサポートしています。

実装してみる

eurekaでは主にgolangを採用してますので、golangで実装します :)

前準備

  • gRPCをインストールします。
  • protoファイルからコード生成をするコンパイラ(protoc)をインストールします。

protocのダウンロードはos別にこちらから
私の環境がosx-x86_64なので今回は protoc-3.5.0-osx-x86_64.zip を利用します。

PATHの通ったディレクトリに解凍したディレクトリの/bin の中のバイナリを移してあげてください。

  • protocのGo用のプラグインをインストールします。

.protoファイルにインターフェースを定義する

gRPCをベースにした開発では、まずはIDLを使ってprotoにAPIの定義を書きます。

ProtocolBuffer以外もサポートはしているようですが、
ツール周りやドキュメントが一番手厚いし、標準に寄り添って行きたい民なので、今回はprotocolBufferで.protoファイルを作ります。

  • request
  • response
  • client,serverのinterface
  • registerMethod
  • port listen
  • 作った実処理の登録,serve
  • 主要な通信層の処理は提供されているので、HTTP/2関連の実装は必要ない。
  • protoからボイラーテンプレートコードやドキュメントも作られるのは楽。
  • middlewareも増えている。
  • proto3がgoの型を全て網羅してるわけではなさそうなので、applicationLayerの既存コードの型合わない場合は変換層とか必要そう。
  • curlでポチッと、みたいなのが使えなくなったので、テストがちょっと大変。grpc-gatewayでも使うべきなのかしら。

--

--

eureka, Inc.
Eureka Engineering

Learn more about how Eureka technology and engineering