⚡ 3秒でわかる!この記事のポイント
- Gemini CLIでドメイン駆動設計に基づくマイクロサービス分割を自動提案
- gRPC/REST APIの設計・スキーマ定義・実装コードをAIが一括生成
- Docker Compose/Kubernetesへのデプロイ構成まで一気通貫で自動化
「モノリスからマイクロサービスに移行したいが、どこから手を付ければいいかわからない」「サービスの分割粒度がつかめない」——SES案件でマイクロサービスアーキテクチャに直面するエンジニアが急増しています。
結論から言えば、Gemini CLIを活用すれば、ドメイン駆動設計(DDD)に基づいたサービス分割からAPI設計、実装、デプロイ構成まで、マイクロサービス開発の全工程をAIの支援で効率的に進められます。
この記事では、Gemini CLIを使ったマイクロサービス開発の実践手法を、SES現場で即活用できる具体例とともに解説します。

マイクロサービスアーキテクチャの基礎
モノリスとマイクロサービスの比較
| 特性 | モノリス | マイクロサービス |
|---|---|---|
| デプロイ単位 | アプリケーション全体 | 個別サービス |
| 技術選択 | 統一 | サービスごとに自由 |
| スケーリング | 全体 | サービス単位 |
| 開発速度(小規模) | 速い | 遅い(オーバーヘッド) |
| 開発速度(大規模) | 遅い(依存関係) | 速い(独立開発) |
| 障害影響範囲 | 全体停止リスク | 局所的 |
SES案件でマイクロサービスが求められる場面
- 大規模ECサイト: 検索・カート・決済・在庫を独立運用
- 金融システム: 取引処理・残高管理・通知を分離
- SaaS プラットフォーム: テナント管理・課金・認証を独立
- IoTプラットフォーム: データ収集・分析・アラートを分離
Gemini CLIでドメイン駆動設計(DDD)を実践
ステップ1: ドメインモデルの抽出
# Gemini CLIでドメインモデルを分析
gemini "以下のビジネス要件からドメインモデルを抽出してください:
ビジネス: オンラインフードデリバリーサービス
主要機能:
- ユーザーがレストランのメニューを検索・注文
- レストランが注文を受け付け・調理状況を更新
- 配達員が注文を受け取り・配達
- リアルタイムの配達追跡
- レビュー・評価システム
- クーポン・ポイントプログラム
以下を出力してください:
1. 境界づけられたコンテキスト(Bounded Context)の一覧
2. 各コンテキストのエンティティとバリューオブジェクト
3. コンテキスト間の関係(Context Map)
4. ドメインイベント"
Gemini CLIが生成するドメインモデル:
【境界づけられたコンテキスト】
1. 注文管理(Order Management)
- エンティティ: Order, OrderItem
- バリューオブジェクト: OrderStatus, DeliveryAddress, Price
- ドメインイベント: OrderPlaced, OrderConfirmed, OrderCancelled
2. レストラン管理(Restaurant Management)
- エンティティ: Restaurant, Menu, MenuItem
- バリューオブジェクト: BusinessHours, Location, Category
- ドメインイベント: MenuUpdated, RestaurantOpened, RestaurantClosed
3. 配達管理(Delivery Management)
- エンティティ: Delivery, DeliveryDriver
- バリューオブジェクト: Route, DriverLocation, DeliveryStatus
- ドメインイベント: DeliveryAssigned, DeliveryPickedUp, DeliveryCompleted
4. ユーザー管理(User Management)
- エンティティ: User, Address
- バリューオブジェクト: Email, PhoneNumber, UserPreferences
- ドメインイベント: UserRegistered, UserProfileUpdated
5. 決済管理(Payment Management)
- エンティティ: Payment, Refund
- バリューオブジェクト: PaymentMethod, Amount, Currency
- ドメインイベント: PaymentProcessed, PaymentFailed, RefundIssued
6. レビュー・評価(Review & Rating)
- エンティティ: Review, Rating
- バリューオブジェクト: Score, Comment
- ドメインイベント: ReviewPosted, RatingUpdated
ステップ2: サービス分割の決定
gemini "上記のドメインモデルに基づいて、
マイクロサービスの分割を提案してください:
制約条件:
- チーム規模: 開発者12名(4チーム × 3名)
- 初期リリースまで: 6ヶ月
- 技術スタック: Go + gRPC + PostgreSQL + Redis
以下を出力:
1. 推奨サービス構成(サービス名・担当コンテキスト)
2. チームへのサービス割り当て
3. サービス間の通信方式(同期/非同期)
4. 共有データベースか個別データベースか
5. 段階的移行のロードマップ"
API設計をGemini CLIで自動化
gRPC スキーマの自動生成
gemini "注文管理サービスのgRPC Protocol Buffersスキーマを
生成してください:
サービス: OrderService
RPC メソッド:
- CreateOrder: 新規注文作成
- GetOrder: 注文詳細取得
- ListOrders: 注文一覧取得(ページネーション付き)
- UpdateOrderStatus: 注文ステータス更新
- CancelOrder: 注文キャンセル
- StreamOrderUpdates: 注文更新のリアルタイムストリーム
バリデーションルール、コメント、オプション設定も含めてください"
syntax = "proto3";
package fooddelivery.order.v1;
import "google/protobuf/timestamp.proto";
import "google/protobuf/field_mask.proto";
option go_package = "github.com/example/fooddelivery/gen/order/v1";
// 注文管理サービス
service OrderService {
// 新規注文を作成する
rpc CreateOrder(CreateOrderRequest) returns (CreateOrderResponse);
// 注文詳細を取得する
rpc GetOrder(GetOrderRequest) returns (Order);
// 注文一覧を取得する(ページネーション対応)
rpc ListOrders(ListOrdersRequest) returns (ListOrdersResponse);
// 注文ステータスを更新する
rpc UpdateOrderStatus(UpdateOrderStatusRequest) returns (Order);
// 注文をキャンセルする
rpc CancelOrder(CancelOrderRequest) returns (Order);
// 注文更新をリアルタイムでストリーム
rpc StreamOrderUpdates(StreamOrderUpdatesRequest) returns (stream OrderUpdate);
}
// 注文エンティティ
message Order {
string id = 1;
string user_id = 2;
string restaurant_id = 3;
repeated OrderItem items = 4;
OrderStatus status = 5;
DeliveryAddress delivery_address = 6;
Money total_amount = 7;
google.protobuf.Timestamp created_at = 8;
google.protobuf.Timestamp updated_at = 9;
}
message OrderItem {
string menu_item_id = 1;
string name = 2;
int32 quantity = 3;
Money unit_price = 4;
string special_instructions = 5;
}
enum OrderStatus {
ORDER_STATUS_UNSPECIFIED = 0;
ORDER_STATUS_PENDING = 1;
ORDER_STATUS_CONFIRMED = 2;
ORDER_STATUS_PREPARING = 3;
ORDER_STATUS_READY_FOR_PICKUP = 4;
ORDER_STATUS_IN_DELIVERY = 5;
ORDER_STATUS_DELIVERED = 6;
ORDER_STATUS_CANCELLED = 7;
}
message DeliveryAddress {
string postal_code = 1;
string prefecture = 2;
string city = 3;
string street = 4;
string building = 5;
double latitude = 6;
double longitude = 7;
}
message Money {
string currency = 1; // "JPY"
int64 amount = 2; // 最小単位(円)
}
message CreateOrderRequest {
string user_id = 1;
string restaurant_id = 2;
repeated OrderItem items = 3;
DeliveryAddress delivery_address = 4;
string payment_method_id = 5;
}
message CreateOrderResponse {
Order order = 1;
string payment_intent_id = 2;
}
message GetOrderRequest {
string id = 1;
}
message ListOrdersRequest {
string user_id = 1;
int32 page_size = 2;
string page_token = 3;
OrderStatus status_filter = 4;
}
message ListOrdersResponse {
repeated Order orders = 1;
string next_page_token = 2;
int32 total_count = 3;
}
message UpdateOrderStatusRequest {
string id = 1;
OrderStatus new_status = 2;
string reason = 3;
}
message CancelOrderRequest {
string id = 1;
string cancellation_reason = 2;
}
message StreamOrderUpdatesRequest {
string order_id = 1;
}
message OrderUpdate {
string order_id = 1;
OrderStatus previous_status = 2;
OrderStatus new_status = 3;
string message = 4;
google.protobuf.Timestamp timestamp = 5;
}
REST APIとの併用(BFF パターン)
gemini "Backend for Frontend(BFF)パターンで
モバイルアプリ向けのREST APIゲートウェイを設計してください:
要件:
- 内部サービスはgRPCで通信
- BFFでgRPC → REST変換
- レスポンス集約(複数サービスから1レスポンス)
- 認証・認可の統一処理
- レートリミット
- OpenAPI 3.0 仕様書を出力
Go + gin フレームワークで実装してください"
サービス間通信の実装
同期通信(gRPC)の実装
gemini "Go で OrderService の gRPC サーバーとクライアントを
実装してください:
サーバー側:
- インターセプターでログ出力・認証・メトリクス計測
- グレースフルシャットダウン
- ヘルスチェック対応
クライアント側:
- コネクションプーリング
- サーキットブレーカー
- リトライ(指数バックオフ)
- デッドライン伝播"
非同期通信(イベント駆動)の実装
gemini "Apache Kafka を使ったイベント駆動通信を実装してください:
イベントフロー:
1. OrderService → OrderPlaced イベント発行
2. PaymentService → OrderPlaced を受信 → 決済処理
3. PaymentService → PaymentProcessed イベント発行
4. RestaurantService → PaymentProcessed を受信 → 調理開始
5. NotificationService → 各イベントを受信 → ユーザー通知
要件:
- Exactly-once delivery の保証
- Dead Letter Queue(DLQ)
- イベントスキーマレジストリ
- コンシューマーグループの設計"
// イベント定義
type OrderPlacedEvent struct {
EventID string `json:"event_id"`
EventType string `json:"event_type"`
AggregateID string `json:"aggregate_id"`
Timestamp time.Time `json:"timestamp"`
Version int `json:"version"`
Data struct {
OrderID string `json:"order_id"`
UserID string `json:"user_id"`
RestaurantID string `json:"restaurant_id"`
Items []OrderItem `json:"items"`
TotalAmount int64 `json:"total_amount"`
} `json:"data"`
}
// プロデューサー
type EventPublisher struct {
producer *kafka.Producer
topic string
}
func (p *EventPublisher) Publish(ctx context.Context, event interface{}) error {
data, err := json.Marshal(event)
if err != nil {
return fmt.Errorf("イベントのシリアライズに失敗: %w", err)
}
deliveryChan := make(chan kafka.Event)
err = p.producer.Produce(&kafka.Message{
TopicPartition: kafka.TopicPartition{
Topic: &p.topic,
Partition: kafka.PartitionAny,
},
Key: []byte(event.(OrderPlacedEvent).Data.OrderID),
Value: data,
Headers: []kafka.Header{
{Key: "event_type", Value: []byte("OrderPlaced")},
{Key: "content_type", Value: []byte("application/json")},
},
}, deliveryChan)
if err != nil {
return fmt.Errorf("イベント発行に失敗: %w", err)
}
e := <-deliveryChan
m := e.(*kafka.Message)
if m.TopicPartition.Error != nil {
return fmt.Errorf("配信エラー: %w", m.TopicPartition.Error)
}
return nil
}
可観測性(Observability)の構築
分散トレーシングの実装
gemini "OpenTelemetryを使った分散トレーシングを
全マイクロサービスに導入してください:
要件:
- Go サービスに OTel SDK を組み込み
- gRPC インターセプターでトレースコンテキスト伝播
- Kafka メッセージにトレースコンテキストを注入
- Jaeger バックエンドへエクスポート
- カスタムスパン属性(ユーザーID、注文ID等)
- サンプリング戦略(本番: 10%、ステージング: 100%)"
メトリクスとアラート
gemini "Prometheusメトリクスを各サービスに実装してください:
必須メトリクス:
- リクエストレート(RPS)
- エラーレート(4xx/5xx)
- レイテンシ(p50, p95, p99)
- 同時接続数
- DB接続プール使用率
- Kafkaコンシューマーラグ
Grafanaダッシュボードの構成も提案してください"
Docker Compose / Kubernetes デプロイ
ローカル開発環境(Docker Compose)
gemini "全マイクロサービスのDocker Compose構成を生成してください:
サービス一覧:
- order-service (Go, :8080)
- restaurant-service (Go, :8081)
- delivery-service (Go, :8082)
- payment-service (Go, :8083)
- user-service (Go, :8084)
- api-gateway (Go, :3000)
インフラ:
- PostgreSQL (各サービス専用DB)
- Redis (キャッシュ・セッション)
- Kafka + Zookeeper
- Jaeger (トレーシング)
- Prometheus + Grafana (メトリクス)
ヘルスチェック、依存関係、ボリューム永続化も含めてください"
Kubernetes マニフェスト
gemini "order-service の Kubernetes マニフェストを生成してください:
要件:
- Deployment (replicas: 3, rolling update)
- HPA (CPU 70% → 3-10 pods)
- Service (ClusterIP)
- ConfigMap / Secret
- NetworkPolicy
- PodDisruptionBudget
- Readiness / Liveness probe
- Resource limits"
テスト戦略
コントラクトテスト
gemini "Pact を使ったコントラクトテストを実装してください:
テスト対象:
- API Gateway ↔ Order Service
- Order Service ↔ Payment Service
- Order Service → Kafka(イベントスキーマ)
CI/CDパイプラインでのコントラクト検証フローも含めてください"
カオスエンジニアリング
gemini "Kubernetes環境でのカオスエンジニアリング実験を
設計してください:
実験:
1. サービス障害(Pod kill)→ 自動復旧確認
2. ネットワーク遅延注入(100ms)→ タイムアウト動作確認
3. DB接続断 → サーキットブレーカー動作確認
4. Kafka ブローカー停止 → メッセージの再配信確認
Chaos Mesh を使用してください"
SES案件でのマイクロサービス実績の作り方
スキルシートに書けるアピールポイント
| スキル | 具体的な経験例 | 単価への影響 |
|---|---|---|
| DDD/サービス分割 | 「ECサイトを6サービスに分割設計」 | +10-15万/月 |
| gRPC設計・実装 | 「Protocol Buffers定義から実装まで」 | +5-10万/月 |
| イベント駆動設計 | 「Kafka使用のイベントソーシング」 | +10-15万/月 |
| 可観測性構築 | 「OpenTelemetry + Grafana導入」 | +5-10万/月 |
| Kubernetes運用 | 「HPA/PDB設定、カナリアデプロイ」 | +10-20万/月 |
段階的スキルアップロードマップ
- 1-2ヶ月目: Docker Composeで2-3サービスのマイクロサービス構成を構築
- 3-4ヶ月目: gRPC通信とKafkaイベント駆動を実装
- 5-6ヶ月目: Kubernetes デプロイと可観測性を構築
まとめ:Gemini CLIでマイクロサービス開発を加速
Gemini CLIを活用したマイクロサービス開発は、以下の3つの大きなメリットをもたらします。
- 設計フェーズの効率化: DDDに基づくサービス分割をAIが提案し、設計の属人化を解消
- 実装の高速化: gRPCスキーマ・APIコード・デプロイ構成の自動生成で開発速度3倍
- 品質の担保: コントラクトテスト・カオスエンジニアリングまでAIが設計支援
マイクロサービスのスキルはSES市場で月額10〜20万円の単価アップが見込める領域です。Gemini CLIをパートナーに、実践的なマイクロサービス開発スキルを身につけましょう。