dockerを使って環境構築の手間を省いてすぐにgolangでgRPCを動かせるものを作った。
サーバーサイド、クライアントサイドのどちらかだけを作成しても、gRPCの仕様上 curl
を叩いて動作の確認ができず、デバッグのやりにくさがある。
なので今回は1レポジトリにサーバーサイド、クライアントサイド両方のコードを収め、簡単にサーバーサイドとクライアントサイドの動きがわかるようにした。
動機
LTで何かgolangネタをやろうと思い立ったのと、gRPCをとりあえず使ってみたかった。
gRPCは初めて触ってみたが, そもそも動かす段階に持っていくまでに苦労しそう?な気がしたので、dockerを立ち上げて server.go
と client.go
を起動すればdockerコンテナ内のローカルネットワークを使用してサーバーサイドとクライアントサイドの両方を動かせるようにした。
まだgRPC自体を触って半日だが、jsonのAPIアプリケーションを作るよりも便利そうな気がしている。
ソースコード
ここに置いてあります
https://github.com/yoshi42662/go-grpc
とりあえず最低限動く形にして書いてあるだけなので、使いやすさや可読性、ソースコードの品質はこれから上げていきたい。
使い方
Quick Start
-
Get repository
$ git clone git@github.com:yoshi42662/go-grpc.git
-
Build compose containers
$ docker-compose build
-
Get into server container and run server.go
$ docker-compose run server bash
(server-container) $ go run server/server.go
-
Get into server container from different console and run client.go
-
List all running containers
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a69220a48eda gogrpc_server "bash" 20 minutes ago Up 20 minutes 8080/tcp gogrpc_server_run_1
- Get into same gogrpc_server container with container ID.
$ docker exec -it a69220a48eda bash
- Run client.go inside container
(server-container) $ go run client/client.go
protocコマンドを使う
.proto
ファイルから .go
ファイルを生成するときに使用。
- dockerコンテナの中に入って実行。
$ docker-compose run server bash
(server-container) $ protoc --go_out=plugins=grpc:. pb/*.proto
所感
つまるところgRPCはネットワークでやりとりされるデータがJSONからバイナリになって、ルーティングやエンコーディング、デコーディングもgRPC側で勝手にやってくれるものっぽい。
実際触ってみるとドキュメント読む前でもなんとなく分かった。
gRPCはよい。便利。