1. HOME
  2. ブログ
  3. IT技術
  4. Evansを使ったGolang × gRPC開発

Evansを使ったGolang × gRPC開発

gRPCを用いたAPIサーバー開発

gRPCはgoogle社が開発したRPC通信のひとつで、マイクロサービス間での通信や速度が求められる場合によく使用されます。

gRPCではデータ転送のシリアライズフォーマットとしてProtocol Buffersを採用しており、protoファイルというIDLを記述しコンパイルすると、任意の言語のクライアント・サーバー用のコードを自動で生成してくれる優れものです。

またスキーマファーストの開発となるため、API仕様書が無くてもprotoファイルを見れば分かるといった開発ができることもメリットの1つとなります。

しかしREST APIであれば動作確認する場合にCurlやPostmanなどを使って簡単に動作確認ができますが、gRPCの場合はバイナリベースのため人間が目視して確認するには専用のクライアントツールを使う必要があります。

そこで本記事ではサンプルで作った簡単なgRPC APIサーバーに対して、EvansというgRPCクライアントツールを使って動作確認をする方法を説明していこうと思います。

Evansとは

改めてEvansとはgRPC向けサードパーティクライアントツールになります。

他にもgRPC公式のgrpc_cliや特に有名なgRPCurlなどがあります。

その中でもEvansは他と比べて特徴的なのが、REPLモードとCLIモードの2つを提供していることが挙げられます。

REPLモード

最大の特徴であるREPLモードは他のクライアントツールにはない、インタラクティブなUIでサーバーとやりとりをすることが出来ます。

参考: 公式Github

使い方は後ほど説明しますが、実際に使ってみると非常に使いやすいです。

予測補完機能が優秀で次に何を入力すればいいか、選択肢は何があるかなどを画面上に従って入力するだけで使用することができます。

そのためAPI名なんだっけ...といったことはなく使い慣れていない場合でもサクサクと動作確認をすることができます。

CLIモード

CLIモードは他のgrpc_cliやgRPCurlと同じような、非インタラクティブなUIによる操作モードになります。

参考: 公式Github

使い方としてはコマンドラインからサービスやAPI名を入力してリクエストを送るとJSON形式でレスポンスを取得することができます。

ある程度慣れていればこちらの方が素速く使うことができますし、レスポンスがJSONで手に入るため他のコマンドラインを組み合わせることで様々な加工がしやすくCLIモードを使うことも非常に多いかと思います。

今回使うAPIサーバーのサンプル

ここからは簡単なgRPCのAPIサーバーを作って、実際にEvansを使って動作確認をしてみたいと思います。

従業員取得API

今回は従業員(Employee)のデータを返すAPIを作成しました。gRPCの開発は本記事の主旨ではないためどのようなAPIを作ったのかだけ簡単に説明いたします。

protoファイルは以下の通りです。

また従業員データはダミーデータとして以下のようにべた書きしています。

Employee (従業員情報)

従業員情報にはID、名前、年齢、雇用形態の4つの情報を持ちます。

雇用形態はEnum型で正社員とパートの2パターンあります。

ServiceとRPCメソッド

従業員情報に関して1件取得、全件取得、雇用形態別に取得の3種類となります。

Evansを使ってAPIコールする

では早速Evansを使って実際に動作確認をやってみようと思います。

Evansのインストール

まずはEvansをHomebrewを使ってインストールします。

バージョン確認をして表示されればインストール完了となります。

 

また本記事ではEvansバージョン0.10.9を使っていきます。

コマンドとオプション

Evansに準備されている代表的なコマンドとオプションの一覧です。

コマンド説明
replREPLモードで実行する
cliCLIモードで実行する
オプション説明
--protoprotoファイルのパスを指定する
--hostgRPCサーバーのホストを指定
--port, -pgRPCサーバーのポートを指定 (default "50051")
--reflection, -rgRPC reflectionを使用している場合 (default "false")

gRPC リフレクションについて

基本的には--protoオプションを使って定義元となるProtocol Buffersファイルを指定する必要があるのですが、実際の開発現場では大量のファイルが作られることがほとんどです。

そうなってくると毎回個別に指定するのは非常に面倒になります。

そこでgRPCの公式が用意しているリフレクションの設定をサーバー側で登録していれば、毎回Protocol BuffersのIDLを直接的に読み込まずにメソッドを呼び出すことが出来るようになります。

今回もサーバー起動時にリフレクションの登録をしているためprotoの指定はせずに -r オプションを指定して実行していきます。

REPLモード

まずはREPLモードを使って動作確認してみます。

REPLモードとリフレクションオプションを指定して実行すると、このようにインタラクティブモードで立ち上がります。

RPCの実行をするためにはpackageとserviceを指定し、最後に実行するRPCメソッドを選びます。

途中はこのように入力の補完候補が出てくるため覚えたりコピペしてくる必要さえありません。

最後にrequestの引数である従業員IDを入力して実行すると

このように従業員情報を取得することができました。

もし引数がEnum型の場合は選択肢が出てきます。

他にもshowコマンドやdescコマンドで一覧や詳細情報を表示することも可能です。

CLIモード

今度は同じようにCLIモードで実行していきます。

CLIの場合はevans cli [package].[service].[rpc method]のフォーマットで実行するメソッドを指定します。

例えば全従業員情報を取得する場合はこのようになります。

もし引数が必要なAPIの場合はechoとパイプを使って渡すことが出来ます。

これでモード別の動作確認は以上となります。

さいごに

今回はEvansというgRPCクライアントツールを使ってgRPCのAPIを動かしてみることができました。

REPLモードとCLIモードを使ってみた感想としては、どちらを使うかは一長一短あるためケースバイケースかなと思いました。

例えばPRを出してレビュアーに動作確認をして欲しい場合は、CLIモード用にコマンドを準備してあげた方がより早く確認することができるかと思いますし、自分で開発中に動かすのであればREPLモードの方が柔軟で楽に確認ができるため状況に応じて使い分けたらいいかと思います。

ぜひEvansを使ってgRPC開発を楽しんでください!

書いた人はこんな人

広告メディア事業部
広告メディア事業部
「好きを仕事にするエンジニア集団」の(株)ライトコードです!

ライトコードは、福岡、東京、大阪の3拠点で事業展開するIT企業です。
現在は、国内を代表する大手IT企業を取引先にもち、ITシステムの受託事業が中心。
いずれも直取引で、月間PV数1億を超えるWebサービスのシステム開発・運営、インフラの構築・運用に携わっています。

システム開発依頼・お見積もり大歓迎!

また、現在「WEBエンジニア」「モバイルエンジニア」「営業」「WEBデザイナー」「WEBディレクター」を積極採用中です!
インターンや新卒採用も行っております。

以下よりご応募をお待ちしております!
https://rightcode.co.jp/recruit

関連記事

採用情報

\ あの有名サービスに参画!? /

バックエンドエンジニア

\ クリエイティブの最前線 /

フロントエンドエンジニア

\ 世界を変える…! /

Androidエンジニア

\ みんなが使うアプリを創る /

iOSエンジニア