*

新しいRPCフレームワーク、gRPCをGoで試してみる。

公開日: : 投稿者: GCP

 

みなさん、今年の2月末にGoogleが発表したgRPCをご存知でしょうか?gRPCとは、こちらも今年の5月にRFCとして公開されたばかりのHTTP/2を標準でサポートした新しいRPCフレームワークであり、効率的で拡張性の高いAPIや最近流行のマイクロサービスの作成をサポートします。本記事では、Goでのサンプルアプリケーションの作成を通してこのgRPCの通信を試してみようと思います。

gRPCの概要

grpc_concept_diagram_00

図1.gRPCの全体像(http://www.grpc.io/docs/より転載)

 gRPCのサーバーとクライアントはお互いに様々な環境(Google内部のサーバーから、各自のデスクトップ環境まで)で通信でき、gRPCがサポートしている言語(C++, Java, Go, Python, Ruby, Node.js, Android Java, C#, Objective-C, PHP)で書くことができます。

例えばサーバーをJava,クライアントをGoやPython, Rubyで実装する、といった感じです。

サンプルアプリケーションを作ってみよう!

では早速ですが実際にGoからgRPCを試してみたいと思います。
今回はシンプルなメッセージのやり取りを行うだけのサーバーとクライアントをそれぞれ実装します。

また、以下のプログラムはMacOSX 10.10.5でのみ動作確認しています。

アプリケーションの作成〜実行までの流れは以下の通りです。

  1. grpc-goのダウンロード
  2. サービスの定義(protoファイルの作成)
  3. 2.で定義したサービスを満たすインターフェースの生成
  4. 3.で生成したインターフェースを満たすサーバーの実装
  5. 3.で生成したインターフェースを満たすクライアントの実装
  6. 実行

gRPC

 

grpc-goのダウンロード

今回はGoでgRPC通信を試すため、まずgRPCのGo実装であるgrpc-goをインストールします。
以下のURLからダウンロードしてインストールしてください。

https://github.com/grpc/grpc-go

protoファイルの作成

次にprotoファイルを作成します。protoファイルの作成方法については以下のドキュメントを参照ください。

https://developers.google.com/protocol-buffers/docs/proto3?hl=ja

今回作成したprotoファイルは以下の通りです。

helloworld.proto

nameを受け取ってmessageを返すSayHello()を定義しています。

また、HelloRequestメッセージとHelloReplyメッセージはそれぞれnameとmessageというフィールドを持っています。各フィールドはタグ番号を持っていて、「=」の後で定義します。タグ番号は1以上の自然数で、(このタグ番号でフィールドを識別するため)重複なく必ず指定する必要があります。

次に定義したprotoファイルからサーバーとクライアントのインターフェースを生成します。このインターフェースはprotocプログラム(とGoの場合はそれに加えてprotocのGoプラグイン)でprotoファイルをコンパイルすることにより自動生成されますので、まずはprotocプログラムとプラグインをダウンロードします。

https://github.com/google/protobuf

上記レポジトリをcloneもしくはダウンロードしてから以下の各コマンドを実行し、インストールを完了させてください。

次にprotoc-gen-goをインストールします。下記コマンドを実行し、protoc-gen-goをインストールを完了させてください。

これでインターフェースの生成準備が出来ました。

インターフェースの生成

先ほど作成したprotoファイルと同ディレクトリ内で以下のコマンドを実行し、定義したprotoファイルに基づいたインターフェースを生成してください。

実行すると、helloworld.pb.goというファイル名で先ほど作成したprotoファイルに応じた以下のようなファイルが作成されると思います。
※このファイルを修正する必要はありません。

次に定義したサービスに基づいてサーバーとクライアントを作成します。

gRPCサーバーの実装

今回は以下のような受けたリクエスト(Name)に応じてレスポンス(Message)を返すという、シンプルな構成のサーバーをGoで作成しました。

gRPCクライアントの実装

それに対し、以下のようなクライアントをGoで作成しました。

実行

では今回作成したプログラムをターミナルから実行してみましょう。
まずはサーバーを起動します。

スクリーンショット 2015-08-24 17.21.23

次にクライアントを実行します。

スクリーンショット 2015-08-24 17.24.11

サーバーから”Greeting: Hello, wdgk!”というレスポンスが返ってきていることが分かると思います。ちなみに、サーバーが起動していなかったり、指定するIPアドレス(ポート番号)を間違っていたりすると、

スクリーンショット 2015-09-07 12.04.34

スクリーンショット 2015-09-09 09.51.40

このように指定したサーバーへの接続に失敗します。

接続に成功すると、サーバー側ではこのようなログが吐かれています。

スクリーンショット 2015-08-24 17.27.08

まとめ

 今回はgRPCの基礎の基礎という形で、サンプルアプリケーションの作成を通じてgRPCの大体のイメージを掴んでもらいました。他にも異なる言語で実装した場合や、そもそも通信速度はどうなのか?等、未だ未検証なものはありますが、通信部分はgRPCに任せて開発者はロジック部分に専念する、というような切り分け方がスムーズに出来れば、gRPCの大きな強みの1つになりそうだなと思いました。また、マイクロサービス化が進められているサービスの中での各コンポーネント間の通信やhttp/2のメリットを享受できるサービス等から少しずつ普及していくのではと考えています。

本記事が皆様がgRPCを始める第1歩になれば幸いです。

※今回使用したソースコードは以下のレポジトリに置いてあります。
https://github.com/wdgk/grpc-sampler/

関連記事

『Google Cloud Platform セッション- 最新技術と日本での展開について』速報メモ

本日、『Google Cloud Platform セッション- 最新技術と日本での展開について』と

記事を読む

APIs Explorer使ってみた

GoogleのAPI達 皆さん、APIs Explorer使ってますか? GoogleはGm

記事を読む

AppEngineでTwilioを試してみた(基本編)

AppEngineでTwilioを試してみた(基本編) AppEngineでTwilioを試し

記事を読む

2016/03/03 GCE vs AWS vs Azure ベンチマーク

2016/03/03 GCE vs EC2 vs Azureベンチマーク 本シリー

記事を読む

2015/10/16 GCE vs AWS ベンチマーク

2015/10/16 GCE vs AWS ベンチマーク 本シリーズでは定期的に

記事を読む

GCP×Zencoderで始める動画トランスコーディング

はじめに 以前apps-gcpでは、GCP(GoogleCloudPlatform)と連携可能なA

記事を読む

2016/04/19 GCE vs AWS vs Azure ベンチマーク

2016/04/19 GCE vs EC2 vs Azureベンチマーク 本シリー

記事を読む

Cloud SDKをmac, Linux, Windowsにインストール・初期設定までの導入手順徹底解説!!

~Google Cloud Architect取得への道~ みなさん、Google Cloud

記事を読む

AppEngineでTwilioを試してみた(応用編)

AppEngineでTwilioを試してみた(基本編) AppEngineでTwilioを試し

記事を読む

2015/01/15 GCE vs AWS ベンチマーク

2015/01/15 GCE vs AWS ベンチマーク 本シリーズでは定期的にGCEとEC2のベ

記事を読む

PAGE TOP ↑