# Story 3.5: Service Registry and Discovery

## Metadata
- **Story ID**: 3.5
- **Title**: Service Registry and Discovery
- **Epic**: 3 - Module Framework
- **Status**: Pending
- **Priority**: High
- **Estimated Time**: 5-6 hours
- **Dependencies**: 1.7, 3.1

## Goal
Implement a service registry that enables service discovery for microservices, allowing services to locate and communicate with each other.

## Description
This story creates a service registry system supporting Consul and Kubernetes service discovery. The registry enables service discovery, health checking, and automatic service registration.

## Deliverables

### 1. Service Registry Interface (`pkg/services/registry.go`)
- `ServiceRegistry` interface with:
  - `Register(service ServiceInfo) error` - Register a service
  - `Deregister(serviceID string) error` - Deregister a service
  - `Discover(serviceName string) ([]ServiceInfo, error)` - Discover services
  - `GetService(serviceName string) (ServiceInfo, error)` - Get specific service
  - `ListServices() ([]ServiceInfo, error)` - List all services
  - `HealthCheck(serviceID string) error` - Check service health

### 2. Service Info Structure
- `ServiceInfo` struct with:
  - ID, Name, Version
  - Address (host:port)
  - Protocol (local, grpc, http)
  - Health status
  - Metadata

### 3. Consul Registry (`internal/services/registry/consul.go`)
- Consul integration (primary for production)
- Service registration and discovery
- Health checking
- Automatic service registration

### 4. Kubernetes Service Discovery (`internal/services/registry/kubernetes.go`)
- Kubernetes service discovery
- Service health checking
- Automatic service registration via K8s services

### 5. Service Registration
- Auto-register services on startup
- Health check endpoints
- Graceful deregistration on shutdown

### 6. Configuration
- Registry configuration in `config/default.yaml`:
  ```yaml
  service_registry:
    type: consul  # consul, kubernetes, etcd
    consul:
      address: localhost:8500
    kubernetes:
      namespace: default
    etcd:
      endpoints:
        - localhost:2379
  ```

### 7. Integration
- Integrate with service factory
- Auto-register core services
- Support module service registration

## Implementation Steps

1. **Create Service Registry Interface**
   - Create `pkg/services/registry.go`
   - Define ServiceRegistry interface
   - Define ServiceInfo struct

2. **Implement Consul Registry**
   - Create `internal/services/registry/consul.go`
   - Implement Consul integration
   - Add health checking

3. **Implement Kubernetes Registry**
   - Create `internal/services/registry/kubernetes.go`
   - Implement K8s service discovery
   - Add health checking

4. **Add Service Registration**
   - Auto-register services on startup
   - Add health check endpoints
   - Handle graceful shutdown

5. **Add Configuration**
   - Add registry configuration
   - Support multiple registry types

6. **Integrate with Service Factory**
   - Use registry for service discovery
   - Resolve services via registry

## Acceptance Criteria
- [ ] Service registry interface is defined
- [ ] Consul registry works correctly
- [ ] Kubernetes registry works correctly
- [ ] Services are auto-registered on startup
- [ ] Service discovery works
- [ ] Health checking works
- [ ] Registry is configurable
- [ ] Graceful deregistration works

## Related ADRs
- [ADR-0029: Microservices Architecture](../../adr/0029-microservices-architecture.md)
- [ADR-0030: Service Communication Strategy](../../adr/0030-service-communication-strategy.md)

## Implementation Notes
- Consul is the primary registry for production
- Kubernetes service discovery for K8s deployments
- Health checks should be lightweight
- Support service versioning

## Testing
```bash
# Test service registry
go test ./internal/services/registry/...

# Test service discovery
go test ./internal/services/registry/... -run TestDiscovery
```

## Files to Create/Modify
- `pkg/services/registry.go` - Service registry interface
- `internal/services/registry/consul.go` - Consul registry
- `internal/services/registry/kubernetes.go` - Kubernetes registry
- `internal/services/factory.go` - Integrate with registry
- `internal/di/providers.go` - Add registry provider
- `config/default.yaml` - Add registry configuration

