Plataforma backend distribuida para la gestión de una cadena de librerías con sucursales y bodegas conectadas. Proyecto desarrollado para la asignatura DSY1103 - Desarrollo Fullstack I (Duoc UC).
Cada microservicio es un módulo Maven independiente construido sobre Spring Boot 4.1, Java 21 y su propia base de datos en un servidor MySQL compartido (puerto 3306, una base por servicio). La comunicación entre servicios es síncrona vía REST (Feign), con descubrimiento de servicios (Eureka) y un API Gateway como punto de entrada único.
| Microservicio | Carpeta | Puerto | Base de datos |
|---|---|---|---|
| Servidor de Descubrimiento (Eureka) | eureka-server |
8761 | N/A |
| API Gateway | gateway |
8080 | N/A |
| Catálogo de Libros | catalogo |
8081 | bookpoint_catalogo_db |
| Inventario y Stock | inventario |
8082 | bookpoint_inventario_db |
| Ventas y Pedidos | pedidos |
8083 | bookpoint_pedidos_db |
| Gestión de Clientes | clientes |
8084 | bookpoint_clientes_db |
| Gestión de Sucursales | sucursales |
8085 | bookpoint_sucursales_db |
| Carrito de Compras | carrito |
8086 | bookpoint_carrito_db |
| Pasarela de Pagos | pagos |
8087 | bookpoint_pagos_db |
| Envíos y Logística | envios |
8088 | bookpoint_envios_db |
| Notificaciones y Alertas | notificaciones |
8089 | bookpoint_notificaciones_db |
| Reseñas y Calificaciones | resenas |
8090 | bookpoint_resenas_db |
Todas las bases de datos viven en el mismo servidor MySQL (una base por servicio, no compartida), corriendo en localhost:3306 tanto en modo local como en Docker.
- Java 21 y Maven (o usar el wrapper si el equipo lo tiene configurado).
- Docker y Docker Compose (para levantar todo el stack de una vez, o solo MySQL).
- Un cliente para hacer requests HTTP: Postman (hay una colección lista en
postman/) o el navegador (Swagger UI).
Hay dos formas de correrlo. Para probar el flujo completo (varios servicios hablando entre sí), Docker es más simple. Para trabajar/debuggear un solo servicio, es más rápido correrlo local con Maven.
# 1. Compilar los jars de los servicios (salta los tests para que sea rápido)
./rebuild-jars.sh
# 2. Levantar todo el stack
docker compose up --build -dImportante: al modificar el código, es necesario volver a ejecutar ./rebuild-jars.sh y no omitir el flag --build al hacer docker compose up — sin él, Docker reutiliza la imagen anterior y el código nuevo nunca llega a ejecutarse (no se produce ningún error, simplemente corre el jar anterior).
Para levantar solo algunos servicios (más rápido si no se necesitan todos):
docker compose up --build -d catalogo pedidos inventario sucursales carrito clientes envios notificaciones pagos resenas eureka-serverPara ver los logs de un servicio mientras arranca:
docker logs -f catalogo-msPara apagar todo (dejando la data en el volumen de MySQL intacta):
docker compose stopSe recomienda considerar el tiempo de propagación de Eureka al levantar todo junto: los servicios pueden tardar entre 30 y 90 segundos en verse entre sí después de mostrar "Started" — es el tiempo normal que tarda Eureka en propagar el registro. Si una llamada entre microservicios (vía Gateway o Feign) falla con 503 justo después de levantar el stack, no se trata de un error: basta con esperar un poco y reintentar. Las llamadas directas a un servicio (sin pasar por otro) funcionan casi de inmediato.
- Levantar solo MySQL (no hace falta Docker para los servicios):
docker compose up -d bookpoint-mysql
- Levantar Eureka (varios servicios lo necesitan para registrarse, aunque igual arrancan sin él):
cd eureka-server mvn spring-boot:run - En otra terminal, levantar el servicio que se desee probar, por ejemplo:
cd catalogo mvn spring-boot:run
Cada servicio usa localhost:3306 por defecto en su application.yml/.yaml, así que no hace falta ninguna configuración extra para conectarse a la MySQL de Docker.
Todos los servicios generan datos de ejemplo realistas automáticamente la primera vez que arrancan con su tabla vacía (usando Datafaker): libros, clientes, pedidos, pagos, envíos, etc., ya relacionados entre sí de forma consistente (un pedido con un libro y stock real, un pago con el monto correcto, etc.). No hay que cargar nada a mano para empezar a probar la API.
Si una tabla ya tiene datos (de una corrida anterior), el servicio no vuelve a sembrar — esto ocurre automáticamente, sin intervención necesaria. Para partir de cero, es necesario vaciar las tablas correspondientes en MySQL antes de levantar el servicio de nuevo.
En postman/ hay una colección lista para importar (BookPoint.postman_collection.json) con requests para los 10 servicios, ordenados para poder correrlos de arriba hacia abajo (cada creación guarda el ID resultante y el siguiente request lo reutiliza). Instrucciones detalladas en postman/README.md.
Con cualquier servicio arriba, se puede abrir su documentación interactiva en el navegador:
http://localhost:<puerto-del-servicio>/swagger-ui.html
Por ejemplo, para catálogo: http://localhost:8081/swagger-ui.html.
Para correr toda la suite de pruebas unitarias (JUnit + Mockito) de los 10 servicios:
mvn testEsto no requiere Docker ni MySQL corriendo para la mayoría de las pruebas (los mocks reemplazan la base de datos), aunque cada servicio también tiene un test de contexto (XApplicationTests) que sí necesita la conexión real a MySQL para poder levantar el contexto de Spring completo.
Para ver el reporte de cobertura de un servicio después de correr los tests:
<servicio>/target/site/jacoco/index.html
bookpoint/
├── eureka-server/ # Servidor de descubrimiento
├── gateway/ # API Gateway (punto de entrada único, puerto 8080)
├── catalogo/ # Uno de estos por cada microservicio de negocio...
├── clientes/
├── inventario/
├── pedidos/
├── sucursales/
├── carrito/
├── pagos/
├── envios/
├── notificaciones/
├── resenas/
├── postman/ # Colección Postman + instrucciones de uso
├── docker-compose.yml # Orquesta los 12 contenedores + MySQL
├── rebuild-jars.sh # Recompila solo los jars que cambiaron (para Docker)
└── pom.xml # POM padre (dependencias y versiones compartidas)
Cada microservicio de negocio sigue la misma estructura interna: controller → service (con su interfaz + impl) → repository, más model/dto, client (Feign, si consume otro servicio), exception (manejo de errores) y config (incluye el DataSeeder de Datafaker).
- Puerto 3306 ocupado: si existe una instancia de MySQL corriendo aparte (fuera de este proyecto), entrará en conflicto con el contenedor
bookpoint-mysql. Es necesario detener la otra instancia antes de levantar Docker, o cambiar el mapeo de puerto endocker-compose.yml. docker compose upsin--build: reutiliza la imagen anterior aunque se haya recompilado el jar. Se debe usar--buildsiempre después de modificar el código.- Error 503 / "Load balancer does not contain an instance": es necesario esperar 30-90 segundos después de levantar el stack completo — es la propagación normal de Eureka, no un error de configuración.