Go言語とgRPCとDockerでTodoアプリを作ろう!

こんにちは。KOUKIです。

タイトル通り、Go言語とgRPCとDockerを使って、Todoアプリを作ってみようと思います。

今回は、フロントエンド部分は作成しません。いずれはVueJSで作りたいと思いますが、本記事ではバックエンドのみ作成します。

なお、データベースはMongoDBを使用します。

Go言語からMongoへのアクセスは、「mongo」パッケージを使用します。

gRPCのあれこれ

gRPCについては、以下の記事を参考にしてください。

開発に必要な環境構築についても触れています。

事前準備

本記事で作成するアプリケーションは、Mac上で動作確認をします。

また、以下のモジュールをインストールしてください。

加えて、protocをインストールする必要があります。

protocはあとで使うので、その時何をするか見てください。

プロジェクトの準備

まずは、プロジェクトを作成しましょう。

たくさん作成しましたね。。ファイルの説明は、後ほど行います。

Dockerの設定

Dockerの設定を行いましょう。まずは、メインとなるGo言語の環境をDockerfileに記述しましょう。

<user>」の部分は適宜書き換えてください。

このDockerfileから以下のコマンドで、docker imageを作成します。

続いて、docker-compose.ymlファイルを作成します。

DBには、MongoDBを使いました。

こちらのvolumesの「user」も適宜変えてください。

また、今回はフロントエンドの実装を行わない為、データのやり取りは二つのコンテナを立てて行います。それが、clientコンテナとserverコンテナです。

起動に必要なファイルを作成していないので、あとでdockerコンテナが立ち上がるか確認します。

Todoアプリの作成

準備が長くなりましたが、いよいよTodoアプリの作成に取り掛かります!

Todoサーバーの構築

さて、最初にTodoサーバーの構築を行いましょう。

todo.protoファイルに以下の実装をしてください。

続いて、generate.shに以下の設定を行います。

ここでprotocが出てきました。このコマンドは、protoファイルからGo言語用のgRPCコードを自動生成してくれます。

terminal上で、以下のコマンドを実行しましょう。

続いて、Server側のコードを実装します。

この状態で、以下のコマンドを実行してみてください。

Starting Serverが出力されていればOKです。

データ登録処理

データ登録処理を実装しましょう。

まずは、プロトファイルを更新します。

CreateTodoとCreateTodoRequest、CreateTodoResponseを追加しました。

protoファイルを書き換えたので、以下のgrpcコードも更新しましょう。

serverコードにMongoDBに接続する処理を書きます。

続いて、先ほど作成したCreateTodoサービスを実装します。

次にclient側のコードを作成します。

Makefileに以下のコマンドを登録してください。

上記は、clientコンテナを起動するためのコマンドです。

最後に、次のコマンドをterminal上で実行します。

問題なくデータが登録されました!

データ読取処理

続いて、データ読取サービスを作成しましょう。

まずは、protoファイルの編集です。

ReadTodoサービスとReadTodoRequest、ReadTodoResponseを追加しました。

以下のコマンドで、gRPCコードを更新しましょう。

続いて、server側のコードを更新します。

ReadTodoメソッドを追加しました。

続いて、clientコードの更新を行います。

readTodoHandler関数を追加しました。この関数は、createTodoHandlerにて生成したIDを使用するので、createTodoHandler関数ではIDを戻り値として返すように修正しました。

以下のコマンドを実行します。

OKですね。

データ更新処理

続いて、データ更新処理を実装します。

protoファイルを更新しましょう。

以下のコマンドでコンパイルします。

続いて、serverコードを実装します。

続いて、clientコードを実装します。

次のコマンドにて、動作確認をしましょう。

データ削除処理

続いて、削除サービスを実装しましょう。

protoファイルを編集します。

以下のコマンドで、コンパイルします。

serverコードを編集します。

続いて、clientコードを実装します。

動作確認をしましょう。

OKですね。

データ取得処理

最後に、Mongoからデータの一覧を取得するサービスを実装しましょう。

最初にprotoファイルを実装します。

今までとは違って、ListTodoResponseにはstreamキーワードを追加しています。これは、サーバー側からクライアントへ複数のデータを送信することを示しています。データは一気に送信されるわけではなく、データが取得されたタイミングで送信されます。

以下のコマンドで、コンパイルしましょう。

続いて、server側のコードを実装します。

また、clientコードを実装します。

動作確認をしてみましょう。

OKですね。

おわりに

gRPCのコードは、慣れれば実装規則が決まっているので書きやすく感じます。

ガンガンコードを書いて使いこなしていきましょう^^

それでは、また!

ソースコード

プロトファイル

サーバーコード

クライアントコード

Dockerfile

docker-compose.yml

generate.sh

Makefile

関連記事

参考書籍