System Architecture
SGIVU is built on a modern cloud-native microservices architecture leveraging Spring Cloud, service discovery, centralized configuration, and OAuth 2.1/OIDC for security. The platform is designed for horizontal scalability, resilience, and observability.Architecture Overview
The following diagram illustrates the complete system architecture. You can find detailed diagrams in the source repository at
docs/diagrams/img/.Architectural Layers
1. Public Layer
Nginx Reverse Proxy Nginx serves as the single public entry point, routing traffic based on URL patterns:- Auth Server (port 9000):
/login,/oauth2/*,/.well-known/*— OIDC flows - API Gateway (port 8080):
/v1/*,/docs/*,/auth/session— Business APIs and BFF - Frontend: S3 catch-all for Angular SPA
This separation allows independent scaling of Auth and Gateway services and simplifies firewall rules (only ports 80/443 exposed).
2. Edge Layer
API Gateway (sgivu-gateway)
Port: 8080 | Technology: Spring Cloud Gateway (WebFlux) The gateway implements the BFF (Backend for Frontend) pattern and serves multiple roles:Authentication Proxy
- OAuth2 client for PKCE flow
- Session management via Redis
- Token relay to backend services
/auth/sessionendpoint for UI
API Gateway
- Route proxying to microservices
- Circuit breakers (Resilience4j)
- Global filters (tracing, user ID)
- Fallback handling
- Redis Session Storage: Enables horizontal scaling without session loss
- Token Relay Filter: Automatically forwards OAuth2 tokens to downstream services
- Circuit Breaker: Prevents cascading failures with fallback routes
- Global Filters:
ZipkinTracingGlobalFilter: AddsX-Trace-Idheaders for distributed tracingAddUserIdHeaderGlobalFilter: InjectsX-User-IDfrom JWT claims
Authorization Server (sgivu-auth)
Port: 9000 | Technology: Spring Authorization Server Implements OAuth 2.1 / OpenID Connect with JWT token issuance:- Token Types: Access tokens (JWT), Refresh tokens
- Flows: Authorization Code with PKCE
- Token Signing: JKS keystore with RS256
- Storage: PostgreSQL for clients, authorizations, consents, and sessions
- User Validation: Delegates to
sgivu-uservia internal API
Client Registration
Default clients registered at startup:
sgivu-gateway(main application)postman-client(testing)oauth2-debugger-client(debugging)
JWT Claims
Tokens include custom claims:
sub: User IDusername: User login namerolesAndPermissions: Array of permissionsisAdmin: Boolean flag
3. Platform Layer
Configuration Server (sgivu-config)
Port: 8888 | Technology: Spring Cloud Config Server Centralized configuration management supporting two modes: Git Mode (Production)Service Discovery (sgivu-discovery)
Port: 8761 | Technology: Netflix Eureka Server Provides service registration and discovery:- Health Checks: Periodic heartbeats from registered services
- Load Balancing: Client-side load balancing via
LoadBalancerClient - Service Resolution: Services referenced by
lb://service-nameURIs - Dashboard: Web UI at
http://localhost:8761for monitoring
4. Business Services Layer
User Service (sgivu-user)
Technology: Spring Boot 4.0.1, Spring Data JPA, PostgreSQL Responsibilities:- User CRUD with password strength validation
- Role and permission management
- Person entity management
- Internal API for Auth Server (
/internal/users/username/{username})
users— User credentials and statuspersons— Personal informationroles— Role definitionspermissions— Granular permissionsusers_roles,roles_permissions— Many-to-many relationships
Vehicle Service (sgivu-vehicle)
Technology: Spring Boot 4.0.1, AWS SDK S3 Responsibilities:- Vehicle catalog management (cars, motorcycles)
- Advanced search with multiple criteria
- Status management (available/unavailable)
- Image management via AWS S3 with presigned URLs
Image Management Features:
- Supported formats: JPEG, PNG, WebP
- Primary image designation
- Automatic CORS configuration for allowed origins
- Metadata tracking in PostgreSQL
Client Service (sgivu-client)
Technology: Spring Boot 4.0.1, Spring Data JPA Responsibilities:- Client management (persons and companies)
- Address management with geographical data
- Advanced search and filtering
- Client counters and statistics
Purchase/Sale Service (sgivu-purchase-sale)
Technology: Spring Boot 4.0.1, OpenPDF, Apache POI Responsibilities:- Contract lifecycle management
- Purchase and sale transactions
- Contract status tracking
- Report generation (PDF, Excel, CSV)
- Integration with User, Client, and Vehicle services
- Contract creation with client, user, and vehicle references
- Status transitions (draft → active → completed/cancelled)
- Document generation
- Reporting and analytics
5. Machine Learning Layer
ML Service (sgivu-ml)
Port: 8000 | Technology: FastAPI, scikit-learn, Python 3.12 Responsibilities:- Demand forecasting and prediction
- Model training and retraining
- Feature engineering
- Model versioning and persistence
| Endpoint | Method | Description |
|---|---|---|
/v1/ml/predict | POST | Request prediction with features |
/v1/ml/predict-with-history | POST | Prediction with historical data for visualization |
/v1/ml/retrain | POST | Trigger model retraining |
/v1/ml/models/latest | GET | Get latest model metadata |
/health | GET | Health check |
- Artifacts stored via
joblib - Optional PostgreSQL storage for model versions
- Training features snapshots
- Prediction logging for monitoring
- JWT validation via OIDC discovery
- Internal service key support (
X-Internal-Service-Key) - Token propagation from Gateway
6. Data Layer
PostgreSQL Databases
Each service has its own database following the database-per-service pattern:- Flyway for versioned schema migrations
- Migrations in
src/main/resources/db/migration/V{version}__{description}.sql - Seed data in
R__seed_data.sql(repeatable)
Redis
Purpose: HTTP session persistence forsgivu-gateway
Configuration:
- Name:
SESSION - Attributes:
HttpOnly,SameSite=Lax,Path=/ - Enables horizontal scaling without session loss
Redis is used exclusively for session storage, not for caching or rate limiting.
AWS S3
Purpose: Vehicle image storage Features:- Presigned URLs for direct client upload/download
- CORS configuration for allowed origins
- Bucket policies for minimum access
- Image type validation (JPEG, PNG, WebP)
Communication Patterns
Synchronous Communication
REST APIs with OAuth2 Token Relay: Service-to-Service (Internal):Service Discovery
Services communicate using logical names resolved via Eureka:Circuit Breaking
Resilience4j provides circuit breaker patterns in the Gateway:Observability & Monitoring
Distributed Tracing
Zipkin Integration:- Trace ID propagation via
X-Trace-Idheader - Span creation at Gateway and service levels
- Trace correlation across service boundaries
- Zipkin UI:
http://localhost:9411
Health Checks
Spring Boot Actuator:Metrics
Micrometer metrics exposed for Prometheus scraping:- JVM metrics (memory, threads, GC)
- HTTP request metrics (duration, status codes)
- Custom business metrics
Deployment Architecture
Local Development
Production (AWS)
Network
- VPC with private subnets
- Application Load Balancer (public)
- NAT Gateway for outbound
Compute
- ECS Fargate / EKS for services
- Auto-scaling groups
- EC2 for Nginx (optional)
Data
- RDS PostgreSQL (Multi-AZ)
- ElastiCache Redis (cluster mode)
- S3 for static assets & images
Security
- Security groups (least privilege)
- Secrets Manager for credentials
- WAF on ALB
Build Pipeline
Detailed build pipeline diagram available at
docs/diagrams/img/02-build-pipeline.pngSecurity Considerations
Authentication Flow (BFF Pattern)
Detailed BFF and refresh token flow diagram:
docs/diagrams/img/03-bff-refresh-token-flow.png- User initiates login from Angular app
- Gateway redirects to Auth Server with PKCE challenge
- User authenticates
- Auth Server issues tokens (access + refresh)
- Gateway stores tokens in Redis-backed session
- Gateway issues session cookie to client
- Client includes cookie in subsequent requests
- Gateway retrieves tokens from session and relays to services
Service-to-Service Authentication
Internal Service Key:Data Protection
- Encryption in transit: HTTPS/TLS for all external communication
- Encryption at rest: RDS encryption, S3 server-side encryption
- Secrets management: AWS Secrets Manager or HashiCorp Vault
- Database credentials: Never in code or Git repository
Troubleshooting
Common Issues
| Issue | Diagnosis | Solution |
|---|---|---|
| 401/403 errors | Token validation failure | Verify issuer URL, JWKS endpoint, token claims |
| Service not registered in Eureka | Config Server unreachable | Check eureka.client.service-url.defaultZone |
| Session loss after restart | Redis not configured | Verify Redis connection and session config |
| Circuit breaker opens | Downstream service failing | Check service health, logs, and fallback routes |
| Config not loading | Config Server unavailable | Ensure SPRING_CLOUD_CONFIG_URI is correct |
Health Check Commands
Version Validation
Ensure consistency across service versions:Next Steps
Features
Explore detailed feature documentation
API Reference
Browse API endpoints and schemas