originbenntou’s blog

技術的なアウトプットを日々まとめる

WEB+DBのgRPC + Goサンプルプログラムを動かしてみる

WEB+DBの記事を実践してみたので、公開 著作権的に怒られないと思っている

gRPC

以下の要素は気になった

バックサーバー間通信には使えるが、フロントエンド/バックエンドサーバー間通信には使えない grpc-gateway を使うとREST APIを受け付けるリバースプロキシサーバーを立てられるみたい

事前準備

$ mkdir path/to/go/src/grpc_go_sample
$ ln -s path/to/work/directory

# protobufインストール
## protoファイルコンパイル用
$ brew install protobuf

# 確認
protoc --version
libprotoc 3.7.1

# Go 用の Protocol Buffers ランタイムをインストール
## Goサーバーで使用
$ go get -u github.com/golang/protobuf/protoc-gen-go

Modules

goのパッケージ管理ツールはglide -> depと進化を遂げたが、go 1.11の世界では新たにModulesという機構が生まれ、go mod コマンドでmodulesを管理することができるようになった。(言語レベルでモジューリングがサポートされたことを意味する)

goの思想としてもdepではなくmodulesに置き換えていくことを推進してるっぽいので、早めに直しておくと良いと思う。

# Go 1.11以上
$ export GO111MODULE=on

# path/to/go/src/grpc_go_sample にて実施
$ go mod init

protoファイル実装

gRPC を使った開発では、メソッドとメッセージを Protocol Buffers で用意する必要があります。

# echo/proto/echo.proto

syntax = "proto3";

package echo;

message EchoRequest {
    string message = 1;
}

message EchoResponce {
    string message = 1;
}

service EchoService {
    rpc Echo (EchoRequest) returns (EchoResponce);
}
  • string型のmessageというフィールドを持つ、EchoRequest,EchoResponceというmassage型を定義
    • フィールド名がmessageなのでややこしいw
    • RESTだとmessage型はJSONで表現されていた
  • serviceブロックにはEchoというメソッドを定義
    • クライアントからこのメソッドを呼び出す
    • EchoRequestはクライアントから渡されるリクエストメッセージ
    • EchoResponceはクライアントに渡すレスポンスメッセージ

コンパイル

$ protoc --proto_path ./echo/proto --go_out=plugins=grpc:./echo/proto/ ./echo/proto/echo.proto

server実装

リポジトリ参照 server

クライアントstub実装

リポジトリ参照 client

サーバー起動・クライアントプログラム実行

# サーバー起動
$ go run ./echo/server

# 任意の文字列を送信してレスポンスさせる
$ go run ./echo/client hogehoge

2019/07/20 19:04:46 hogehoge