Questo progetto è una dimostrazione di un'architettura di microservizi utilizzando Spring Cloud, con particolare attenzione ai pattern di API Gateway e Circuit Breaker.
Il progetto è composto dai seguenti componenti:
- Eureka Server - Servizio di Service Discovery basato su Netflix Eureka
- API Gateway - Gateway API basato su Spring Cloud Gateway con Circuit Breaker
- Product Service - Microservizio per la gestione dei prodotti
- Order Service - Microservizio per la gestione degli ordini con Circuit Breaker per le chiamate al Product Service
Il pattern API Gateway è implementato utilizzando Spring Cloud Gateway. Le caratteristiche principali includono:
- Routing delle richieste ai microservizi appropriati
- Possibilità di implementare filtri per cross-cutting concerns come autenticazione e logging
- Gestione centralizzata degli errori tramite Circuit Breaker
Il pattern Circuit Breaker è implementato utilizzando Resilience4j. Le caratteristiche principali includono:
- Prevenzione di chiamate a servizi che probabilmente falliranno
- Degradazione graduale delle funzionalità quando i servizi dipendenti falliscono
- Recupero automatico quando i servizi tornano disponibili
- Configurazione fine-tuned per diversi tipi di servizi
microservices-demo/
├── eureka-server/ # Service Discovery
├── api-gateway/ # API Gateway con Circuit Breaker
├── product-service/ # Microservizio per i prodotti
└── order-service/ # Microservizio per gli ordini
- JDK 17
- Maven
- Docker e Docker Compose (opzionale, per l'esecuzione containerizzata)
- Clona il repository
- Compila i progetti con Maven:
mvn clean package- Avvia i servizi nell'ordine corretto:
# Avvia Eureka Server
cd eureka-server
mvn spring-boot:run
# Avvia Product Service
cd ../product-service
mvn spring-boot:run
# Avvia Order Service
cd ../order-service
mvn spring-boot:run
# Avvia API Gateway
cd ../api-gateway
mvn spring-boot:runPer avviare tutti i servizi con Docker Compose:
docker-compose up -dDopo aver avviato tutti i servizi, puoi testare l'API tramite l'API Gateway.
-
Product Service:
GET /api/products- Recupera tutti i prodottiGET /api/products/{id}- Recupera un prodotto specificoPOST /api/products- Crea un nuovo prodottoGET /api/products/test-error?throwError=true- Simula un errore per testare il Circuit Breaker
-
Order Service:
GET /api/orders- Recupera tutti gli ordiniGET /api/orders/{id}- Recupera un ordine specificoPOST /api/orders- Crea un nuovo ordineGET /api/orders/test-error?throwError=true- Simula un errore per testare il Circuit Breaker
curl -X POST http://localhost:8080/api/products \
-H "Content-Type: application/json" \
-d '{
"name": "Smartphone",
"description": "Latest smartphone with great features",
"price": 799.99,
"stock": 100,
"category": "Electronics"
}'curl -X POST http://localhost:8080/api/orders \
-H "Content-Type: application/json" \
-d '{
"customerName": "Mario Rossi",
"customerEmail": "mario.rossi@example.com",
"shippingAddress": "Via Roma 123, Milano",
"orderItems": [
{
"productId": 1,
"quantity": 2
},
{
"productId": 2,
"quantity": 1
}
]
}'Per testare il Circuit Breaker, puoi simulare il fallimento del Product Service:
- Ferma il Product Service (Ctrl+C o
docker-compose stop product-service) - Prova a creare un nuovo ordine tramite l'API Gateway
- Dovresti ricevere una risposta di fallback dal Circuit Breaker
- Eureka Dashboard: http://localhost:8761
- H2 Console per Product Service: http://localhost:8081/h2-console
- H2 Console per Order Service: http://localhost:8082/h2-console
- Actuator Endpoints:
- API Gateway: http://localhost:8080/actuator
- Product Service: http://localhost:8081/actuator
- Order Service: http://localhost:8082/actuator
- Spring Boot 3.2.3
- Spring Cloud 2023.0.0
- Spring Cloud Gateway
- Spring Cloud Netflix Eureka
- Resilience4j
- Spring WebFlux
- Spring Web
- Spring Data JPA
- H2 Database
- Lombok
- Docker
Questo progetto è stato creato per scopi dimostrativi e utilizza database H2 in memoria. In un ambiente di produzione, si consiglia di utilizzare database persistenti e di implementare misure di sicurezza aggiuntive.