This content originally appeared on DEV Community and was authored by Ximena Soto
Como dev entusiasta por Java y Domain-Driven Design (DDD), quiero compartir mi proyecto DddEcommerceOrders, un sistema de gestión de pedidos para e-commerce que refleja mi entusiasmo por Java, Spring Boot y arquitectura de microservicios. Este proyecto muestra mi compromiso con escribir código limpio y mi entusiasmo por el aprendizaje continuo en áreas como DevOps y AWS. En este artículo, te guiaré a través del proyecto, su diseño basado en DDD, y cómo refleja mi objetivo de atraer reclutadores internacionales con habilidades técnicas y un enfoque en crecimiento continuo.
¿Por qué DddEcommerceOrders?
Como dev, creo que construir proyectos reales es la mejor manera de demostrar competencia técnica y habilidades de resolución de problemas. DddEcommerceOrders (disponible en https://github.com/xsoto-developer/DddEcommerceOrders) es un sistema basado en microservicios que gestiona pedidos e inventario para una plataforma de e-commerce. Utiliza principios de DDD para crear una arquitectura limpia y escalable, ideal para destacar mi experiencia en Java y Spring Boot, así como mis primeros pasos en prácticas DevOps como CI/CD con GitHub Actions.
El proyecto tiene dos propósitos:
- Excelencia Técnica: Demuestra conceptos avanzados de DDD como Bounded Contexts, Agregados y Eventos de Dominio, implementados en una arquitectura de microservicios.
- Crecimiento Profesional: Refleja mi camino de aprendizaje y aplicación de prácticas modernas de ingeniería de software, incluyendo mi interés en DevOps y mi preparación para certificaciones AWS.
Visión General del Proyecto
DddEcommerceOrders se divide en dos microservicios:
- orders-service: Gestiona el Bounded Context de Gestión de Pedidos, manejando la creación, procesamiento de pagos y cancelación de pedidos.
- inventory-service: Gestiona el Bounded Context de Gestión de Inventario, manejando la reserva y liberación de stock.
Cada microservicio sigue una arquitectura limpia con tres capas:
-
Dominio: Modelos DDD (ej.
Pedido
yProducto
) con lógica de negocio. -
Aplicación: Servicios que orquestan casos de uso (ej.
OrderService
,InventoryService
). - Infraestructura: APIs REST, listeners de eventos y persistencia con Spring Data JPA y H2.
Características Clave
- Procesamiento de Pedidos: Crear pedidos, confirmar pagos y cancelarlos vía APIs REST.
- Gestión de Inventario: Reservar stock al confirmar un pedido, usando eventos de dominio.
-
Documentación de APIs: Swagger UI para pruebas interactivas (
/swagger-ui.html
). - Pruebas: Tests unitarios con JUnit 5 para validar reglas de negocio.
- CI/CD: Pipeline de GitHub Actions para compilación y pruebas automatizadas.
DDD en Acción
El proyecto se basa en dos Bounded Contexts:
-
Gestión de Pedidos:
-
Agregado:
Pedido
(raíz) conLineaDePedido
(value object) yDireccion
(value object). - Lenguaje Ubicuo: Términos como “confirmar pedido” y “cancelar pedido” son consistentes en código y documentación.
-
Evento de Dominio:
OrderConfirmedEvent
activa la reserva de stock en el servicio de inventario.
-
Agregado:
-
Gestión de Inventario:
-
Agregado:
Producto
(raíz) conStock
(value object). - Lenguaje Ubicuo: Términos como “reservar stock” y “liberar stock”.
-
Manejo de Eventos: Escucha
OrderConfirmedEvent
para actualizar el stock.
-
Agregado:
Aquí tienes un diagrama UML del Bounded Context de Gestión de Pedidos, creado con Mermaid:
classDiagram
class Pedido {
-UUID id
-List~LineaDePedido~ lineas
-Direccion direccionEnvio
-EstadoPedido estado
-Double montoPago
+confirmarPago(monto: double)
+cancelar()
+getId(): UUID
}
class LineaDePedido {
-UUID productoId
-int cantidad
-double precioUnitario
}
class Direccion {
-String calle
-String ciudad
-String codigoPostal
}
class EstadoPedido {
<<enumeration>>
PENDIENTE
CONFIRMADO
ENVIADO
CANCELADO
}
Pedido o--> "many" LineaDePedido
Pedido --> "1" Direccion
Pedido --> "1" EstadoPedido
Aspectos Técnicos Destacados
Java y Spring Boot
El proyecto usa Java 17 y Spring Boot 3.2.0 para implementar una arquitectura de microservicios robusta. Decisiones técnicas clave incluyen:
- Arquitectura Limpia: Separar la lógica de dominio de la infraestructura asegura mantenibilidad.
- Spring Data JPA: Para persistencia con una base de datos H2 en memoria, ideal para desarrollo rápido.
- Integración con Swagger: Documentación interactiva de APIs mejora la usabilidad.
-
Eventos de Dominio: Simulados con
ApplicationEventPublisher
de Spring para un acoplamiento bajo.
Prácticas DevOps
Como parte de mi incursión en DevOps, implementé un pipeline de GitHub Actions (.github/workflows/ci.yml
) para automatizar compilaciones, pruebas y verificación de cobertura de código. Esto asegura calidad y fiabilidad, alineándose con prácticas modernas de desarrollo.
Preparación para AWS
Aunque el proyecto corre localmente con H2, su arquitectura de microservicios está lista para la nube. Estoy preparándome para certificaciones AWS, y planeo desplegar DddEcommerceOrders en AWS (ej. con ECS o EKS) para demostrar mis habilidades en la nube.
Lecciones Aprendidas
Construir DddEcommerceOrders me enseñó valiosas lecciones:
- Desafíos de DDD: Definir Bounded Contexts claros y mantener un Lenguaje Ubicuo consistente requirió un modelado cuidadoso.
- Comunicación entre Microservicios: Usar eventos de dominio para consistencia eventual fue una forma práctica de desacoplar servicios.
- Depuración de Swagger: Inicialmente, Swagger mostraba “No operations defined in spec!” debido a problemas de escaneo de componentes. Añadir configuración explícita de OpenAPI y logging resolvió esto.
-
Acceso a la Base de Datos: Habilitar la consola H2 (
/h2-console
) e inicializar datos condata.sql
facilitó la depuración.
Estas experiencias reforzaron mi compromiso con el aprendizaje continuo, motivándome a explorar herramientas DevOps y plataformas como AWS.
¡Pruébalo!
El código fuente está disponible en https://github.com/xsoto-developer/DddEcommerceOrders. Para ejecutar el proyecto:
- Clona el repositorio:
git clone https://github.com/xsoto-developer/DddEcommerceOrders.git
- Compila y ejecuta cada microservicio:
cd orders-service
mvn clean install
mvn spring-boot:run
cd ../inventory-service
mvn clean install
mvn spring-boot:run
- Accede a Swagger UI:
- Pedidos:
http://localhost:8080/swagger-ui.html
- Inventario:
http://localhost:8081/swagger-ui.html
- Pedidos:
- Verifica datos en H2:
- Navega a
http://localhost:8080/h2-console
(JDBC URL:jdbc:h2:mem:inventorydb
, User:sa
, Password: vacío). - Ejecuta
SELECT * FROM PRODUCTO;
para ver productos.
- Navega a
¿Qué Sigue?
Estoy entusiasmado por seguir creciendo como desarrollador. Mis próximos pasos incluyen:
- Desplegar DddEcommerceOrders en AWS para mostrar experiencia en la nube.
- Profundizar en DevOps con herramientas como Docker y Kubernetes.
- Contribuir a proyectos open-source para colaborar con la comunidad global de desarrolladores.
Llamado a la Acción
¡Me encantaría recibir tu feedback sobre DddEcommerceOrders! Explora el proyecto en GitHub, pruébalo y comparte tus ideas. Si eres un reclutador o desarrollador interesado en Java, DDD o DevOps, ¡conectemos para discutir oportunidades de construir software impactante juntos!
This content originally appeared on DEV Community and was authored by Ximena Soto