139 lines
4.2 KiB
Markdown
139 lines
4.2 KiB
Markdown
# 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
|
|
|