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 17
Docker
Docker-run
Docker-compose
├── pom.xml
├── src
│ ├── main
│ │ ├── java
│ │ │ └── com
│ │ │ └── hoangtien2k3
│ │ │ └── orderservice
│ │ │ ├── OrderServiceApplication.java
│ │ │ ├── api
│ │ │ │ └── OrderController.java
│ │ │ ├── domain
│ │ │ │ ├── OrderRequest.java
│ │ │ │ ├── OrderUseCase.java
│ │ │ │ ├── PlacedOrderEvent.java
│ │ │ │ ├── entity
│ │ │ │ │ ├── Order.java
│ │ │ │ │ └── OrderStatus.java
│ │ │ │ └── port
│ │ │ │ ├── EventHandlerPort.java
│ │ │ │ ├── OrderRepositoryPort.java
│ │ │ │ └── OrderUseCasePort.java
│ │ │ └── infrastructure
│ │ │ ├── config
│ │ │ │ └── JacksonMapperConfig.java
│ │ │ ├── message
│ │ │ │ ├── EventHandlerAdapter.java
│ │ │ │ ├── log
│ │ │ │ │ ├── MessageLog.java
│ │ │ │ │ └── MessageLogRepository.java
│ │ │ │ └── outbox
│ │ │ │ ├── OutBox.java
│ │ │ │ └── OutBoxRepository.java
│ │ │ └── repository
│ │ │ ├── OrderEntity.java
│ │ │ ├── OrderJpaRepository.java
│ │ │ └── OrderRepositoryAdapter.java
│ │ └── resources
│ │ └── application.yml
## docker run
docker run --name postgres -p 5434:5432 -e POSTGRES_PASSWORD=12042003 -d postgres:16
## docker compose
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.
This project is licensed under the MIT License
MIT License
Copyright (c) 2024 Hoàng Anh Tiến
Hoàng Anh Tiến 💻 🚧 🤔 🎨 🐛 |