Sistema bancario en microservicios basado en el scaffold de Bancolombia (co.com.bancolombia.cleanArchitecture),
con Clean Architecture, DDD y todos los protocolos requeridos para el assessment de seniority.
banking-core-platform/
├── ms-api-gateway/ ← Gateway JWT + CircuitBreaker + RateLimit
├── ms-account-service/ ← Cuentas bancarias (WebFlux + R2DBC + Redis + MongoDB)
├── ms-transaction-service/ ← Transferencias (JPA + SOAP servidor + SOAP cliente)
├── ms-loan-service/ ← Créditos (DDD Aggregate Root + RSocket + Kafka)
├── ms-fraud-service/ ← Fraude (Kafka + RSocket + LIFO/FIFO queues)
├── ms-notification-service/ ← Notificaciones (RabbitMQ + WebSocket STOMP)
├── terraform/ ← IaC AWS (ECS Fargate, RDS, MSK, ElastiCache, DocumentDB)
├── scripts/
│ └── init-databases.sql ← Creación automática de BDs
├── docker-compose.yml ← Infraestructura local completa
├── .gitlab-ci.yml ← Pipeline CI/CD (test→sonar→build→docker→security→deploy)
├── Dockerfile.template ← Multi-stage build (copiar en cada servicio)
└── setup-all-services.sh ← Script que genera todos los proyectos con el plugin
# Requisitos: Java 21, Gradle 9.2.1+
chmod +x setup-all-services.sh
bash setup-all-services.shEsto ejecuta el plugin de Bancolombia en cada microservicio:
# Ejemplo de lo que hace internamente para ms-loan-service:
./gradlew ca --package=co.com.banking.loan --type=reactive --name=Loan --lombok=true --java-version=21
./gradlew gep --type=webflux --authorization=true
./gradlew gep --type=rsocket
./gradlew gda --type=r2dbc
./gradlew gda --type=asynceventbus --eda=true --tech=kafka
./gradlew gm --name=Loan
./gradlew gm --name=LoanAmount
./gradlew guc --name=RequestLoan
./gradlew gat # BDD acceptance tests| Servicio | Competencia | Qué demuestra |
|---|---|---|
ms-transaction-service |
Protocolos | SOAP como servidor (@Endpoint) + cliente (WebServiceGatewaySupport) |
ms-notification-service |
Protocolos | WebSocket STOMP (CONNECT → SUBSCRIBE → MESSAGE → DISCONNECT) |
ms-fraud-service |
Protocolos | RSocket con streaming reactivo (LIFO/FIFO de colas de prioridad) |
ms-transaction-service |
SQL TCL | SAVEPOINT, ROLLBACK TO SAVEPOINT, stored procedures, índices, vistas, triggers |
ms-account-service |
Caché Redis | Cache-Aside, Write-Through, Read-Through, Write-Behind — comparativa |
ms-loan-service |
Pruebas BDD | Cucumber con ./gradlew gat, escenarios Given/When/Then |
ms-fraud-service |
NoSQL CAP | MongoDB (AP) vs PostgreSQL (CP) — justificación con ejemplos bancarios |
ms-account-service |
Concurrencia | ExecutorService, Callable, Runnable, CompletableFuture, Virtual Threads |
| Servicio | Competencia | Qué demuestra |
|---|---|---|
ms-loan-service |
DDD | Loan (Aggregate Root), LoanAmount / InterestRate (Value Objects), CreditPolicy (Domain Service) |
| Todos | Clean Architecture | Estructura domain/model → domain/usecase → infrastructure/entry-points → infrastructure/driven-adapters |
ms-loan-service |
Patrones GoF | Factory Method, Builder, Strategy (políticas crédito), State (estados préstamo), Observer (Kafka) |
ms-api-gateway |
Patrones tolerancia | CircuitBreaker, Retry, RateLimit, Bulkhead, Fallback con Resilience4j |
ms-fraud-service |
EDA | Kafka (eventos de dominio, FIFO por partición) + RabbitMQ (DLQ, TTL) |
terraform/ |
DevSecOps + IaC | Terraform → ECS Fargate, RDS, MSK, ElastiCache, DocumentDB, ALB/TLS, Secrets Manager |
ms-api-gateway |
Seguridad OWASP | A01 JWT, A02 BCrypt+TLS, A03 queries parametrizadas, A05 Actuator restringido, A06 Trivy |
ms-transaction-service expone un endpoint SOAP para bancos legacy que consultan
disponibilidad de fondos. Al mismo tiempo actúa como cliente SOAP hacia un banco externo
para confirmar transferencias interbancarias.
// infrastructure/entry-points/soap-endpoint/
@Endpoint
public class FundsVerificationEndpoint {
private static final String NAMESPACE = "http://banking.co.com/ws/funds";
@PayloadRoot(namespace = NAMESPACE, localPart = "CheckFundsRequest")
@ResponsePayload
public CheckFundsResponse checkFunds(@RequestPayload CheckFundsRequest request) {
// Llama al UseCase del dominio — sin romper Clean Architecture
return fundsUseCase.check(request.getAccountId(), request.getAmount());
}
}// infrastructure/driven-adapters/soap-client/
public class InterBankSoapClient extends WebServiceGatewaySupport {
public ConfirmTransferResponse confirmTransfer(String bankCode, BigDecimal amount) {
ConfirmTransferRequest request = new ConfirmTransferRequest();
request.setBankCode(bankCode);
request.setAmount(amount);
return (ConfirmTransferResponse) getWebServiceTemplate()
.marshalSendAndReceive("http://legacy-bank:8090/ws", request);
}
}Con Spring-WS, el WSDL se genera desde el XSD:
GET http://localhost:8082/ws/funds.wsdl
// FIFO: Revisión normal de transacciones sospechosas (orden de llegada)
private final Queue<FraudAlert> normalQueue = new LinkedList<>();
// LIFO: Fraude crítico — lo más reciente primero (más urgente)
private final Deque<FraudAlert> criticalStack = new ArrayDeque<>();
public void enqueue(FraudAlert alert) {
if (alert.getSeverity() == Severity.CRITICAL) {
criticalStack.push(alert); // LIFO — push al tope
} else {
normalQueue.offer(alert); // FIFO — al final de la cola
}
}
public FraudAlert dequeue() {
// Prioridad: primero críticos (LIFO), luego normales (FIFO)
if (!criticalStack.isEmpty()) return criticalStack.pop();
return normalQueue.poll();
}-- SAVEPOINT en transferencia bancaria
BEGIN;
UPDATE accounts SET balance = balance - 500 WHERE id = 'ACC-001';
SAVEPOINT after_debit;
UPDATE accounts SET balance = balance + 500 WHERE id = 'ACC-002';
-- Si el acreditamiento falla, solo revertimos hasta el SAVEPOINT
-- ROLLBACK TO SAVEPOINT after_debit;
COMMIT;
-- Stored Procedure para cálculo de comisión
CREATE OR REPLACE PROCEDURE calculate_transfer_fee(
p_amount NUMERIC, p_account_type VARCHAR, OUT p_fee NUMERIC
) LANGUAGE plpgsql AS $$
BEGIN
p_fee := CASE
WHEN p_account_type = 'PREMIUM' THEN 0
WHEN p_amount > 1000000 THEN p_amount * 0.001
ELSE 2500
END;
END;
$$;# 1. Levantar infraestructura
docker-compose up -d postgres mongodb redis kafka rabbitmq
# 2. Generar proyectos (primera vez)
bash setup-all-services.sh
# 3. Correr un servicio
cd ms-loan-service && ./gradlew bootRun
# 4. Validar arquitectura (ArchUnit)
./gradlew validateStructure
# 5. Tests BDD
./gradlew testCrear un .env en la raíz (no subir al repositorio):
JWT_SECRET=banking-jwt-secret-key-very-long-for-hs256-algorithm-min-32chars
DB_PASSWORD=banking123
SONAR_HOST_URL=http://localhost:9000
SONAR_TOKEN=your-sonar-token