飽き性の頭の中
Goで複数アプリケーション(メインアプリケーションとサイドカー)の開発環境を作ってみたのサムネイル

Goで複数アプリケーション(メインアプリケーションとサイドカー)の開発環境を作ってみた

2019-06-14に公開

IT技術メモ
# Go# Docker

1 つのプロジェクトで複数の Go アプリケーションをビルドするときの開発環境を自分なりに整えてみた。

手間は減ったにせよ、ホットリロードとかはできていないので、改善できそうなら教えて欲しい。

メインアプリケーションとサイドカー

イメージとしては、メインのサーバーがいてその補助として裏でジョブを実行するサブアプリケーションがいるような感じ。

Ruby でいえばsidekiqを使っていればこれに当たる。

『分散システムデザインパターン ―コンテナを使ったスケーラブルなサービスの設計』では、こういうのを、メインのアプリケーションに対して、サイドカーと呼ぶらしい。

分散システムデザインパターン ―コンテナを使ったスケーラブルなサービスの設計

今回は Go なので、goworkerというものを使っている。同じ Go のプロジェクトであっても、ビルドして吐き出したいバイナリは2つあることになる。さらにgoworkerはジョブの管理に Redis を裏で使うので、合計3つのアプリケーションを起動する必要がある。

それらを開発環境でいい感じに起動・再起動しないと開発したものを動かして確かめられない。その手間を少しでも楽にしようと整えた話。

フォルダ構成

Go の場合、ビルドの起点になるファイルは main パッケージにいる必要があるなのでメインのアプリケーションとサイドカーのビルドの起点となるファイルはどちらもメインパッケージにいなければならない

今回は次のようなイメージ

├── worker
│   └── main.go
└── main.go

こうすることで . 起点でビルドすればメインのアプリケーション、./worker 起点でビルドすればサイドカーが吐かれるはず。

両アプリケーションをビルドする

いちいちどちらもコマンドを叩くと大変なのでシェルにまとめた。

# メインアプリケーション
if [ -e hoge-main ]; then
    # 既にバイナリがある場合は削除
    rm hoge-main
fi

echo 'メインアプリケーションをビルド中...'
go build -o hoge-main .

# サイドカー
if [ -e hoge-worker ]; then
  # 既にバイナリがある場合は削除
  rm hoge-worker
fi

echo 'サイドカーをビルド中'
go build -o hoge-worker ./worker/

コマンドを叩くと次のような状態になるはず。

├── worker
│   └── main.go
├── main.go
├── hoge-main
└── hoge-worker

あとはこのバイナリと Redis を実行するだけとなる。

実行は forego を使った

github.com

バイナリと Redis の立ち上げにはforegoというものを使った。foreman in Goだとと公式にも書いてあるようにforemanの Go バージョンである。

Procfileを書くだけなのでとても簡単。

main: ./hoge-main
worker: ./hoge-worker
redis: redis-server

しかもforegoでやっておくと、各々自前で起動するのと違って、各アプリケーションごとに色分けされてログが出るのでとても見やすい。

20190614163527.png

まとめると

これら一連の処理をシェルスクリプトにまとめるとこうなる。

# メインアプリケーション
if [ -e hoge-main ]; then
    # 既にバイナリがある場合は削除
    rm hoge-main
fi

echo 'メインアプリケーションをビルド中...'
go build -o hoge-main .

# サイドカー
if [ -e hoge-worker ]; then
  # 既にバイナリがある場合は削除
  rm hoge-worker
fi

echo 'サイドカーをビルド中'
go build -o hoge-worker ./worker/

# バイナリとredisの立ち上げ
forego start

Go のプログラムを書き換えて起動し直すときは、一度ctrl + cで落としてから、再度スクリプトを実行すれば更新できる。

少し手間ではあるが、これで 2 つ(Redis 入れて一応 3 つ)のアプリケーションが更新されるので、まだマシにはなる。ビルド時間もそんなに遅くはないので、この更新処理が保存時とかに走るようにしたらもっと楽になるんだろうか。

Profile picture

たわ / tawachan

1994年生まれ(29歳)

大学院修士課程(政治学)(2021-2023)

Web開発(2017-)

関連記事

タグ一覧

# 福岡:39# 東京:20# 大学院:13# 移住:10# エナジードリンク:9# Google:8# ブロックチェーン:8# Mac:7# Webエンジニア:7# Apple:6# Firebase:6# Next.js:6# Sony:6# サントリー:6# Googleフォト:5# インドネシア:5# 埼玉:5# 英語:5# AWS:4# Canon:4# EOS 8000D:4# Kindle:4# TypeScript:4# ZONe:4# ラーメン:4# 京都:4# 仮想通貨:4# 社会人:4# 鴨川シーワールド:4# Docker:3# EOS8000D:3# Google Drive:3# Lightroom:3# Markdown:3# Pixel:3# React:3# React Native:3# a7iii:3# d.school:3# iPad:3# iPad mini:3# アマルティア・セン:3# アメリカ:3# コワーキングスペース:3# セブンイレブン:3# デザイン思考:3# レッドブル:3# ワークショップ:3# 卒業旅行:3# 寿司:3# 紅葉:3# 長崎:3# API:2# ChatGPT:2# ECR:2# ERC20:2# Expo.io:2# Firestore:2# GPT4:2# Gatsby.js:2# GitHub Actions:2# Kindle Oasis:2# Kindle Paperwhite:2# LINE:2# MacBook Pro:2# NestJS:2# Notion:2# Oculus:2# Oculus Quest:2# Pixel Buds:2# VS Code:2# Zotero:2# iPhone:2# pandoc:2# re:Invent:2# かき小屋:2# カフェ:2# ギグワーカー:2# サーチコンソール:2# ジャカルタ:2# スターバックス:2# ステーキ:2# スマートウォッチ:2# ソラマチ:2# チョコレート:2# ニューヨーク:2# バリ島:2# パンとエスプレッソと:2# ヒュッゲ:2# ビーチ:2# ブックスタンド:2# ブログ:2# マクドナルド:2# ミズマチ:2# モンスターエナジー:2# ワイヤレスイヤホン:2# 三千院:2# 両国:2# 修士論文:2# 兵庫:2# 千葉:2# 博多:2# 堀江貴文:2# 宮崎:2# 就活:2# 嵐山:2# 川越:2# 広島:2# 新宿御苑:2# 旅行:2# 日米学生会議:2# 有馬温泉:2# 東寺:2# 東浩紀:2# 機械学習:2# 歴史:2# 民主主義:2# 江ノ島:2# 清澄白河:2# 独自ドメイン:2# 神奈川:2# 神戸:2# 転職:2

©2023 tawachan All Rights Reserved.