Goマイクロサービスの基本構成
Go でマイクロサービスを開発する際に、プロジェクト全体の可読性と保守性を確保するための「最低限必要な」ディレクトリ構造と設定手順を示します。ここで紹介する構成は、Clean Architecture の考え方を取り入れつつ、シンプルに保てることを目的としています。
ディレクトリ構成(推奨)
以下の階層は cmd/ をエントリポイント、internal/ と pkg/ に機能別コードを分離した形です。各ディレクトリの役割は簡潔にコメントで示しています。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
project/ ├─ cmd/ # main パッケージ(サービス起動ロジック) │ └─ server/main.go ├─ internal/ # アプリ内部限定コード │ ├─ service/ # ビジネスロジック(UseCase) │ └─ adapter/ # 外部システムとの接続(リポジトリ、API クライアント等) ├─ pkg/ # 複数サービス間で再利用可能な汎用コード │ └─ models.go # ドメインモデルのみを定義 ├─ api/ # OpenAPI / gRPC の仕様ファイル ├─ configs/ # 環境別設定(YAML, JSON など) ├─ Dockerfile └─ docker-compose.yml |
cmd/は実行可能バイナリを生成するだけに留め、設定やロギングは外部から注入します。internal/service/にインターフェイスと実装を分離し、テスト時はモックで差し替えられるように設計します。pkg/models.goは構造体定義のみを保持し、バリデーションロジックや DB アクセスは含めません。
go.mod の管理
| 項目 | 推奨方法 |
|---|---|
| モジュール名 | GitHub リポジトリのパス(例:module github.com/yourorg/project) |
| 依存追加 | go get <pkg>@vX.Y.Z で取得し、必ず go mod tidy を実行して不要モジュールを除去 |
| バージョン固定 | CI で go.mod と go.sum が一致することを検証(go test ./... の前に実施) |
Clean Architecture と依存性注入(DI)の指針
- 層分割
- Domain:
pkg/models.goに純粋な構造体だけを置く。 - UseCase:
internal/service/配下にビジネスロジックのインターフェイスと実装を配置。外部依存はインターフェイスで抽象化。 -
Interface Adapter:リポジトリや外部 API クライアントは
internal/adapter/に実装し、UseCase からはインターフェイス経由で呼び出す。 -
DI ライブラリの選択肢(プロジェクト規模に合わせて)
- Uber fx – 起動・停止管理が自動化され、大規模サービス向き。
-
Google wire – コンパイル時に依存解決コードを生成し、ランタイムオーバーヘッドがゼロ。小〜中規模での採用が一般的。
-
簡易 DI 実装例(wire)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// cmd/server/main.go package main import ( "github.com/yourorg/project/internal/adapter" "github.com/yourorg/project/internal/service" "github.com/google/wire" ) var Set = wire.NewSet( service.NewUserService, adapter.NewUserRepository, ) |
テスト・CI の概要
| フェーズ | 推奨方針 |
|---|---|
| ユニットテスト | *_test.go を internal/service/ に配置し、外部依存はインターフェイスのモックで置き換える。 |
| 統合テスト | Docker Compose で DB・キュー等の依存コンテナを起動し、実際の API エンドポイントに対してリクエストを送る。 |
| CI パイプライン(例:GitHub Actions) 1. go test ./... -coverprofile=coverage.out でカバレッジ取得2. golangci-lint run による静的解析3. Docker イメージのビルド&プッシュ(タグはコミット SHA) |
テンプレート選定基準と比較表
テンプレートを採用する際に評価すべき項目を整理し、代表的な 2 つのリポジトリを客観的に比較します。数値情報(スター数・最終更新日など)は「参考情報」として掲載していますが、実務での導入判断は機能要件との合致度で行うことを推奨します。
| 評価項目 | neo7337/go-microservice-template | bruc3mackenzi3/go-microservice-template |
|---|---|---|
| ディレクトリ構成 | シンプルな 5 層構造(cmd, internal, pkg, api, configs) | 同様の構造に加え k8s/ ディレクトリで本番デプロイ設定を提供 |
| DI 実装 | 手動 DI が前提。wire の導入は任意 | Uber fx を標準採用し、起動コードがテンプレート化されている |
| OpenAPI / Swagger | 手作業で追加する方式(自動生成スクリプト未提供) | swaggo/swag によるコードベースからの自動生成が組み込まれている |
| CI/CD の充実度 | 基本的な GitHub Actions(テスト・Lint)のみ | テスト・Lint に加え Docker イメージビルド、GitHub Container Registry への自動プッシュを含むフロー |
| Kubernetes 対応 | Dockerfile と docker‑compose のみ提供 | k8s/ 配下に Deployment / Service / ConfigMap が完備 |
| 参考指標(2026 年時点) | Stars 120、最終更新 2024‑11‑03 | Stars 560、最終更新 2026‑06‑15 |
※上記の数値は GitHub の公開情報を元にした目安です。実際の採用判断では最新のリポジトリ状況をご確認ください。
主要テンプレートの概要
以下では、上表で取り上げた 2 つのテンプレートについて、構成要素と特徴だけを簡潔にまとめます。実装コードは省略し、導入時に注目すべきポイントのみ列挙します。
neo7337/go-microservice-template の概要
このテンプレートは「最小限の雛形」を提供することを目的としています。シンプルさが求められる PoC や学習用途に適しています。
- ディレクトリ構成(抜粋)
cmd/
server/main.go
internal/
service/ # UseCase 実装
adapter/ # リポジトリ実装
pkg/
models.go # ドメインモデルのみ
api/
openapi.yaml (任意)
configs/
config.yaml
Dockerfile
docker-compose.yml - DI:
wireの利用はオプション。手動で依存関係を組み立てる形のため、コードが増えると管理コストが上がります。 - テスト支援:モック生成ツール(例:
mockgen)を使用すれば簡易的にユニットテストが可能です。 - デプロイ:Dockerfile と docker‑compose が提供されるだけで、K8s 用マニフェストは同梱されていません。
bruc3mackenzi3/go-microservice-template の概要
本テンプレートは「本番レベルのコンテナ化」と「自動生成ドキュメント」を前提に設計されています。大規模プロジェクトや継続的デリバリーが必須の場合に有用です。
- ディレクトリ構成(抜粋)
cmd/
server/main.go
internal/
service/
adapter/
logger/
tracing/
pkg/
models.go
api/
openapi.yaml # swaggo により自動生成
configs/
config.yaml
k8s/
deployment.yaml
service.yaml
configmap.yaml
Dockerfile (multi‑stage)
docker-compose.yml
.github/workflows/ci.yml - DI:標準で Uber fx が組み込まれ、起動コードがテンプレート化されています。
- OpenAPI:
swaggo/swagによる自動生成スクリプトがmake generate等のコマンドで走ります。Swagger UI が/swagger/index.htmlで閲覧可能です。 - CI/CD:GitHub Actions のワークフローにテスト、Lint、Docker ビルド・レジストリへのプッシュが含まれます。
- Observability:
prometheus/client_golangと OpenTelemetry が組み込まれ、/metricsと Jaeger 用トレーシングエンドポイントを自動で公開します。
導入手順と実務での留意点
ここでは 共通化できるセットアップフロー と、環境ごとの設定・デプロイ時に注意すべきポイントをまとめます。冗長な記述は排除し、最小限のコマンドだけを示します。
共通セットアップフロー
- リポジトリ取得
bash
git clone https://github.com/<owner>/<template-repo>.git
cd <template-repo> - 依存解決(ローカル環境)
bash
go mod tidy - Docker ビルド(マルチステージ Dockerfile が前提)
bash
docker build -t myservice:dev . - ローカル起動(docker‑compose)
bash
docker compose up -d # DB・Redis 等の依存サービスが自動起動
docker run --rm -p 8080:8080 myservice:dev - ヘルスチェック
bash
curl -s http://localhost:8080/health | jq .
# {"status":"OK"} が返れば正常起動
環境変数とシークレット管理
| 種類 | 目的 | 推奨手段 |
|---|---|---|
| シークレット(DB パスワード・API キー) | 平文でコードに埋め込まない | Kubernetes Secret、または HashiCorp Vault と envFrom の組み合わせ |
| 設定ファイル(ポート番号・ロギングレベル) | 環境ごとに差分を持たせる | ConfigMap 化しマウント、もしくは VOLUME 経由で上書き |
| ログレベル切替 | 本番は INFO、デバッグ時は DEBUG |
起動コマンド例:LOG_LEVEL=debug ./myservice |
Kubernetes デプロイのポイント
- Deployment はレプリカ数やリソース制限を明示し、
readinessProbe/livenessProbeを設定することで自動回復性を向上させます。 - Observability:Prometheus の
ServiceMonitorと Jaeger のサイドカーはテンプレートに含まれているので、そのまま適用可能です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
# 例: k8s/deployment.yaml(抜粋) apiVersion: apps/v1 kind: Deployment metadata: name: myservice spec: replicas: 3 selector: matchLabels: app: myservice template: metadata: labels: app: myservice spec: containers: - name: app image: ghcr.io/yourorg/myservice:latest ports: - containerPort: 8080 envFrom: - configMapRef: name: myservice-config - secretRef: name: myservice-secret resources: limits: cpu: "500m" memory: "256Mi" readinessProbe: httpGet: path: /health port: 8080 initialDelaySeconds: 5 |
ライセンスと貢献ガイドライン
| テンプレート | ライセンス | PR の流れ(共通) |
|---|---|---|
| neo7337/go-microservice-template | MIT | Fork → ブランチ作成 → 変更 → go test ./... && golangci-lint run → PR(タイトルは [feat], [fix], [docs]) |
| bruc3mackenzi3/go-microservice-template | BSD‑3-Clause | 同上。CI が成功すればレビューは 2〜3 日以内に完了することが多い |
まとめ
- 基本構成:
cmd/,internal/,pkg/,api/,configs/の5層でシンプルかつ拡張性を確保。 - DI と Clean Architecture:プロジェクト規模に合わせて
wireかfxを選択し、インターフェイス中心の設計を徹底する。 - テンプレート比較:neo7337 は学習・PoC 向けの軽量版、bruc3mackenzi3 は本番環境に即したコンテナ化・CI/CD が充実した版。導入時は「DI の自動化」や「K8s マニフェスト」の有無で選択するとよい。
- 導入手順:リポジトリ取得 →
go mod tidy→ Docker ビルド → docker‑compose 起動の流れを共通化し、環境変数・シークレットは K8s の仕組みで管理する。
この構成と選定基準をベースにすれば、Go マイクロサービスの開発・運用がスムーズに進むはずです。ご不明点やプロジェクト固有の要件がある場合は、上記テンプレートをカスタマイズしながら適宜調整してください。