Disclaimer: This project was built for learning purposes to explore event-driven microservices architecture using modern Java technologies. It is not intended for production use.
An event-driven microservices system where placing an order triggers asynchronous notifications to both a stock service and an email service via Apache Kafka. Orders are persisted to a PostgreSQL database.
POST /api/v1/orders
│
├──► PostgreSQL (persist order)
│
└──► Kafka "order_topics"
│
┌─────────┴─────────┐
▼ ▼
stock-service email-service
(updates stock) (sends email)
| Service | Description | Port |
|---|---|---|
order-service |
REST API that accepts orders, saves to DB, and publishes to Kafka | 8080 |
stock-service |
Kafka consumer that processes stock updates | - |
email-service |
Kafka consumer that processes email notifications | - |
order-base-domains |
Shared library containing the OrderEvent class |
- |
- Java 17 + Spring Boot 4
- Apache Kafka — event streaming between services
- PostgreSQL — order persistence
- Spring Data JPA — database access
- Docker + Docker Compose — containerized local development
- k6 — load testing
- JUnit 5 + Mockito — unit testing
Prerequisites: Docker Desktop
# Build all services
cd order-base-domains && ./mvnw install -DskipTests
cd ../order-service && ./mvnw package -DskipTests
cd ../stock-service && ./mvnw package -DskipTests
cd ../email-service && ./mvnw package -DskipTests
# Start everything
cd ..
docker compose up --buildcurl -X POST http://localhost:8080/api/v1/orders \
-H "Content-Type: application/json" \
-d '{"name": "iPhone 15", "status": "PENDING"}'docker exec postgres psql -U postgres -d ordersdb -c "SELECT * FROM orders;"Unit tests run without any infrastructure (no Docker, no database, no Kafka needed):
cd order-service
./mvnw testTests cover OrderController:
placeOrderreturns success messageplaceOrdersaves order to databaseplaceOrdersends message to Kafka
Tested with k6 on local Docker environment:
| Metric | Result |
|---|---|
| Concurrent users | 200 |
| Throughput | 1,867 req/s |
| p95 latency | 20ms |
| Error rate | 0.1% |
| Total requests | 56,198 |
k6 run load-tests/order-load-test.js