项目文件夹

文件
Claude 310cee61f9
Run Tests / Unit Tests (push) Has been cancelled
Run Tests / Etcd Integration Tests (push) Has been cancelled
fix: address top 8 developer experience gaps
- Add README for multi-service example explaining modular monolith pattern
- Add pubsub-events example with broker and event streaming demos
- Add grpc-integration example showing gRPC server/client with JSON codec
- Update examples/README.md to replace "Coming Soon" with real examples
- Add tests for core packages: micro.go and service/service.go
- Add micro doctor diagnostic command (Go, registry, ports, NATS, config)
- Fix micro gen templates: replace TODO stubs with real implementation logic
- Add consul and etcd registry support to micro mcp serve/test commands
- Make file watcher configurable: extensions, excludes, go.mod watching
- Add watcher tests

https://claude.ai/code/session_01VwPw7hMaVhFfT69oCE6x1D
2026-03-12 09:16:54 +00:00

1.8 KiB

Multi-Service Example

Run multiple services in a single binary — the modular monolith pattern.

What It Shows

  • Two independent services (users and orders) in one process
  • Each service gets isolated server, client, store, and cache
  • Shared registry and broker for inter-service communication
  • Coordinated lifecycle with micro.NewGroup()

Run It

go run .

This starts both services:

  • Users on :9001 — provides Users.Lookup
  • Orders on :9002 — provides Orders.Create

Call the Services

From another terminal:

# Look up a user
micro call users Users.Lookup '{"id": "1"}'

# Create an order
micro call orders Orders.Create '{"user_id": "1"}'

How It Works

// Create isolated services
users := micro.New("users", micro.Address(":9001"))
orders := micro.New("orders", micro.Address(":9002"))

// Register handlers
users.Handle(new(Users))
orders.Handle(new(Orders))

// Run together — stops all when one exits
g := micro.NewGroup(users, orders)
g.Run()

Each service gets its own server and client, so they can be split into separate binaries later without code changes. The group handles coordinated startup and graceful shutdown.

When to Use This Pattern

  • Early development — run everything locally in one process
  • Testing — integration tests without Docker or networking
  • Small teams — fewer moving parts until you need to scale independently
  • Gradual migration — start monolith, split services one at a time

Splitting Later

When you're ready to run services independently, just move each into its own main.go:

func main() {
    svc := micro.New("users", micro.Address(":9001"))
    svc.Handle(new(Users))
    svc.Run()
}

No handler code changes needed — the registry handles discovery automatically.