Simple order flow to demo some concepts:
- Microservices using
Spring Boot
,Spring Cloud
,Spring Cloud Stream
- Database per service using
Postgresql
- Saga Pattern (Saga Orchestration): Distributed transaction span multiple services.
- Outbox Pattern: Avoid dual-writes, no 2PC required using
Kafka
,Kafka Connect
,Debezium
,Outbox Event Router
Java 21
Docker
Docker-compose
export PLATFORM=linux/amd64 && docker-compose up -d
export PLATFORM=linux/arm64 && docker-compose up -d
./mvnw clean package -DskipTests=true
Run services api-gateway
, order-service
, customer-service
, inventory-service
./mvnw -f api-gateway/pom.xml spring-boot:run
./mvnw -f order-service/pom.xml spring-boot:run
./mvnw -f customer-service/pom.xml spring-boot:run
./mvnw -f inventory-service/pom.xml spring-boot:run
Service's name | Endpoint |
---|---|
Api Gateway | localhost:8080 |
Order service | localhost:9090 |
Customer service | localhost:9091 |
Inventory service | localhost:9093 |
Create outbox connectors
sh register-connectors.sh
Delete all connectors
sh delete-connectors.sh
Create new customer
curl --location 'localhost:8080/customer-service/customers' \
--header 'Content-Type: application/json' \
--data '{
"username": "usertest",
"fullName": "Test user 1",
"balance": 100
}'
Create new product
curl --location 'localhost:8080/inventory-service/products' \
--header 'Content-Type: application/json' \
--data '{
"name": "Test product 1",
"stocks": 10
}'
Create new order
curl --location 'localhost:8080/order-service/orders' \
--header 'Content-Type: application/json' \
--data '{
"customerId": "f0a000ad-ea44-4fa1-853b-207f9d9abe2c",
"productId": "d212c9d6-da3b-4fe2-b016-a852c8a8d32f",
"quantity": 1,
"price": 2
}'
Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.
Please make sure to update tests as appropriate.