WEB+DBのgRPC + Goサンプルプログラムを動かしてみる
WEB+DBの記事を実践してみたので、公開 著作権的に怒られないと思っている
gRPC
- RPC(RemoteProcedureCall)を実現するGoogle製のプロトコル
- ProtocolBuffersを使ってprotoファイル(IDL)をシリアライズする
- シリアライズしたファイルは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実装
クライアントstub実装
サーバー起動・クライアントプログラム実行
# サーバー起動 $ go run ./echo/server # 任意の文字列を送信してレスポンスさせる $ go run ./echo/client hogehoge 2019/07/20 19:04:46 hogehoge