FinStream is a reference implementation of a resilient, event-driven core banking microservices backend and administrative control panel. It demonstrates production-ready enterprise integration patterns (EIP), workflow orchestration, and fault-tolerant telemetry.
graph TD
UI[Compliance Control Tower React Client :5173]
GW[Spring Cloud Gateway Edge Router :8080]
AC[Account-Management-Service :8083]
LW[Loan-Workflow-Service :8081]
NA[Notification-Audit-Service :8082]
K[(Apache Kafka Broker)]
Z[(Camunda Zeebe Engine)]
UI -->|Injects Applications| GW
GW -->|Routes /api/v1/accounts| AC
GW -->|Routes /api/v1/loans| LW
LW -->|Verifies Balances /verify-balance| AC
LW -->|Orchestrates Tasks| Z
LW -->|Publishes Audits| K
K -->|Consumes Logs| NA
NA -->|Routes Failures| DLT[(DLT Queue Topic)]
api-gateway: Exposes port8080, routing external requests down to backing modules.account-management-service: Exposes port8083, managing account balances and KYC status (PostgreSQL).loan-workflow-service: Exposes port8081, embedding Camunda 8 (Zeebe), executing credit Bureau calls protected by Resilience4j Circuit Breakers, and publishing transaction events to Kafka.notification-audit-service: Exposes port8082, consuming transactional streams from Kafka and routing exceptions to a Dead Letter Queue (DLQ).compliance-control-tower: Vite + React + TypeScript + Tailwind CSS v4 administrative dashboard client.
- Backend: Java 21, Spring Boot 3.3.x (Spring Web, Spring Data JPA, Spring AOP), Camunda 8 Zeebe, Spring Kafka, Resilience4j, Maven
- Frontend: React.js, TypeScript, Tailwind CSS v4, Vite, Lucide React
- Databases & Infrastructure: PostgreSQL 16, Apache Kafka, Elasticsearch, Zookeeper, Docker Compose
- Java JDK 21
- Maven 3.9+
- Node.js 18+ & npm
- Docker Desktop
Standing up PostgreSQL, Kafka brokers, and Zeebe containers from root:
docker compose up -dBuild all submodules simultaneously from the parent directory:
# Compile and run unit tests
mvn clean test
# Package JARs
mvn clean package -DskipTestsExecute each Spring Boot microservice module locally:
# Terminal 1: Account Service
cd account-management-service && mvn spring-boot:run
# Terminal 2: Loan Service
cd loan-workflow-service && mvn spring-boot:run
# Terminal 3: Audit Service
cd notification-audit-service && mvn spring-boot:run
# Terminal 4: API Gateway Router
cd api-gateway && mvn spring-boot:runcd compliance-control-tower
npm install
npm run devNavigate to http://localhost:5173/ (or port 5174 if 5173 is occupied) in your browser.
- Open the dashboard. Observe the Circuit Breaker telemetry indicator is
CLOSED(healthy). - Inject a new transaction. The system queries the external Bureau API and completes successfully.
- Toggle the "Simulate Circuit Failover" switch on the dashboard to degrade downstream service health.
- The Circuit Breaker badge will trip to
OPEN - FAILOVER ACTIVE. - Submit a new application. The service immediately intercepts the call and runs the fallback scorer, defaulting the applicant's rating safely to
600to prevent risk leakage.
- In the simulator panel, input the customer Account ID value as
"poison-pill". - Submit the transaction.
- The serializer aspect intercepts this value and throws parsing exceptions.
- Instead of blocking the processing threads, the
notification-audit-serviceKafka handler isolates the payload and routes it directly to the"loan-audit-stream.DLT"topic, committing the offset safely.