Microservicio responsable de la gestión de cuentas bancarias y saldos dentro del Sistema de Transferencias Bancarias. Este servicio es la fuente de verdad del balance de las cuentas y participa de manera asíncrona en el flujo de transferencias mediante eventos Kafka.
- Java: 21
- Framework: Quarkus 3.27.1
- Persistencia: Hibernate ORM + Panache
- Migraciones: Flyway
- Base de datos: PostgreSQL
- Mensajería: Apache Kafka (Reactive Messaging)
- API REST: RESTEasy Reactive + Jackson
- Observabilidad: SmallRye Health, Micrometer + Prometheus
- Logging: JSON Logging
- Build: Maven
-
- Docker Compose: PostgreSQL + RedPanda (Kafka)en Raspberrypi 5
* docker-compose.yaml *
services:
postgres_db:
image: postgres:16
container_name: postgres_db
restart: always
environment:
POSTGRES_USER: gstroke
POSTGRES_PASSWORD: gstroke24
POSTGRES_DB: dev_gstroke_db
volumes:
- postgres_data:/var/lib/postgresql/data
ports:
- "5432:5432"
healthcheck:
test: ["CMD-SHELL", "pg_isready -U gstroke"]
interval: 10s
timeout: 5s
retries: 5
redpanda:
image: redpandadata/redpanda:v24.1.3
container_name: redpanda
command:
- redpanda
- start
- --smp
- "1"
- --memory
- "1G"
- --overprovisioned
- --node-id
- "0"
- --check=false
- --kafka-addr
- PLAINTEXT://0.0.0.0:9092
- --advertise-kafka-addr
- PLAINTEXT://192.168.18.31:9092
ports:
- "9092:9092"
- "9644:9644"
- Ejecutar sudo nano docker compose up -d
- Verificar con docker ps
- Puerto:
8081
quarkus.http.port=8081- Motor: PostgreSQL
- Host:
192.168.18.31 - Base de datos:
dev_gstroke_db - Schema:
customer_db
quarkus.datasource.db-kind=postgresql
quarkus.datasource.username=gstroke
quarkus.datasource.password=gstroke24
quarkus.datasource.jdbc.url=jdbc:postgresql://192.168.18.31:5432/dev_gstroke_db
⚠️ Nota: Las credenciales están configuradas para entorno de desarrollo. En producción deben externalizarse mediante variables de entorno o un gestor de secretos.
- Schema por defecto:
customer_db - Estrategia de gestión:
validate - SQL logging: habilitado
quarkus.hibernate-orm.database.default-schema=customer_db
quarkus.hibernate-orm.schema-management.strategy=validate
quarkus.hibernate-orm.log.sql=true📌 Esto garantiza que:
- El esquema no se modifica automáticamente
- La estructura se valida contra las entidades
- Las migraciones están controladas por Flyway
Las migraciones se ejecutan automáticamente al iniciar la aplicación.
quarkus.flyway.migrate-at-start=true
quarkus.flyway.schemas=customer_db
quarkus.flyway.default-schema=customer_db
quarkus.flyway.baseline-on-migrate=truesrc/main/resources/db/migration
Ejemplo:
V1__init.sql
- Administrar cuentas bancarias
- Consultar información de cuentas y saldos
- Validar disponibilidad de fondos
- Consumir eventos de transacciones desde Kafka
- Actualizar saldos de forma asíncrona
- Registrar información de auditoría
GET /accounts/{accountNumber}
Respuestas:
200 OK→ cuenta encontrada404 Not Found→ cuenta no existe
GET /accounts/customer/{customerId}
GET /accounts/{accountNumber}/has-funds?amount=100
Respuestas:
200 OK→ fondos suficientes400 Bad Request→ fondos insuficientes404 Not Found→ cuenta no existe
Este servicio consume eventos publicados por transaction-service.
transactions.completedtransactions.failed
- transactions.completed → débito/crédito de cuentas
- transactions.failed → registro de auditoría
GET /q/health
GET /q/metrics
Incluye métricas de:
- Procesamiento de eventos Kafka
- Operaciones sobre cuentas
- Estado del datasource
El servicio utiliza logging estructurado en formato JSON, ideal para integración con sistemas de observabilidad.
quarkus.log.console.format=%d{yyyy-MM-dd HH:mm:ss} %-5p [%X{correlationId}] %c - %m%nIncluye soporte para Correlation ID.
- Java 21
- Maven 3.9+
- PostgreSQL
- Apache Kafka
./mvnw quarkus:dev- JUnit 5
- RestAssured
./mvnw test- Arquitectura orientada a eventos para actualización de saldos
- Consistencia eventual mediante Kafka
- Aislamiento por schema
- Flyway + validate para control estricto del modelo
- Sin operaciones de débito/crédito por REST
- Este servicio no inicia transferencias
- El saldo solo se modifica a partir de eventos confiables
- Diseñado para escalar de forma independiente