gRPCのサーバー&クライアントをdockerとgoで動かしてみる


dockerを使って環境構築の手間を省いてすぐにgolangでgRPCを動かせるものを作った。

サーバーサイド、クライアントサイドのどちらかだけを作成しても、gRPCの仕様上 curl を叩いて動作の確認ができず、デバッグのやりにくさがある。

なので今回は1レポジトリにサーバーサイド、クライアントサイド両方のコードを収め、簡単にサーバーサイドとクライアントサイドの動きがわかるようにした。

動機

LTで何かgolangネタをやろうと思い立ったのと、gRPCをとりあえず使ってみたかった。

gRPCは初めて触ってみたが, そもそも動かす段階に持っていくまでに苦労しそう?な気がしたので、dockerを立ち上げて server.goclient.go を起動すればdockerコンテナ内のローカルネットワークを使用してサーバーサイドとクライアントサイドの両方を動かせるようにした。

まだgRPC自体を触って半日だが、jsonのAPIアプリケーションを作るよりも便利そうな気がしている。

ソースコード

ここに置いてあります
https://github.com/yoshi42662/go-grpc

とりあえず最低限動く形にして書いてあるだけなので、使いやすさや可読性、ソースコードの品質はこれから上げていきたい。

使い方

Quick Start

  • Get repository
    $ git clone [email protected]: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はよい。便利。