- productos (puerto 5001): CRUD de productos (nombre, precio).
- inventario (puerto 5002): stock + reservas (reservar/liberar).
- pagos (puerto 5003): simula cobro (éxito o fallo controlado).
- pedidos (puerto 5004): crea pedidos hablando con los demás (usa retry + circuit breaker).
Cada servicio:
- expone endpoints REST,
- valida
Authorization: Bearer <SERVICE_TOKEN>, - usa SQLite propio (archivos
.dbdistintos), - tiene logs a consola y a
logs.log.
Requisitos: Python 3.10+
En cuatro terminales (una por servicio), dentro de cada carpeta /services/<nombre>:
# 1) Crear venv y activar (Linux/Mac)
python -m venv venv
source venv/bin/activate
# En Windows PowerShell
# python -m venv venv
# .\venv\Scripts\Activate.ps1
# 2) Instalar dependencias
pip install -r requirements.txt
# 3) Copiar .env.example a .env
cp .env.example .env
# (en Windows PowerShell: copy .env.example .env)
# 4) Ejecutar
python app.pyTodos comparten SERVICE_TOKEN (mismo valor en los 4). Por defecto: penguin-secret.
-
productos/.env.examplePORT=5001 SERVICE_TOKEN=penguin-secret DB_PATH=productos.db
-
inventario/.env.examplePORT=5002 SERVICE_TOKEN=penguin-secret DB_PATH=inventario.db
-
pagos/.env.examplePORT=5003 SERVICE_TOKEN=penguin-secret DB_PATH=pagos.db
-
pedidos/.env.examplePORT=5004 SERVICE_TOKEN=penguin-secret PRODUCTS_URL=http://127.0.0.1:5001 INVENTORY_URL=http://127.0.0.1:5002 PAYMENTS_URL=http://127.0.0.1:5003 DB_PATH=pedidos.db
Asegurate de que los 4 servicios estén corriendo.
curl -X POST http://127.0.0.1:5001/productos -H "Authorization: Bearer penguin-secret" -H "Content-Type: application/json" -d '{"nombre": "Hielo Premium", "precio": 10000}'curl -X POST http://127.0.0.1:5002/stock -H "Authorization: Bearer penguin-secret" -H "Content-Type: application/json" -d '{"producto_id": 1, "cantidad": 50}'curl -X POST http://127.0.0.1:5004/pedidos -H "Authorization: Bearer penguin-secret" -H "Content-Type: application/json" -d '{"items":[{"producto_id":1,"cantidad":3}], "pago":{"medio":"tarjeta","moneda":"PYG"}}'curl -X POST http://127.0.0.1:5004/pedidos -H "Authorization: Bearer penguin-secret" -H "Content-Type: application/json" -d '{"items":[{"producto_id":1,"cantidad":2}], "pago":{"medio":"tarjeta","moneda":"PYG","fail":true}}'POST /productos— crea (body:{"nombre","precio"})GET /productos— listaGET /productos/<id>— detallePUT /productos/<id>— editaDELETE /productos/<id>— borra
POST /stock— upsert de stock{producto_id, cantidad}GET /stock/<producto_id>— consultaPOST /reservar— reserva{producto_id, cantidad}→{reserva_id}POST /liberar— libera{reserva_id}
POST /pagar—{monto, moneda, medio, referencia?, fail?}→{estado: aprobado|rechazado}
POST /pedidos— crea pedido, orquestando a inventario, productos, pagosGET /pedidos— listaGET /pedidos/<id>— detalle
- Header obligatorio:
Authorization: Bearer <SERVICE_TOKEN> - Si no coincide, 401 Unauthorized.
- Reintentos con backoff simple (2 intentos).
- Circuit breaker por servicio llamado (se abre a los 3 fallos y se cierra tras 30s).
Fácil de ver en
services/pedidos/http_client.py.
Cada servicio crea sus propias tablas SQLite en su carpeta. No se comparten.
Cada servicio escribe a consola y a un archivo logs.log en su carpeta.
- Tokens compartidos en headers (sin infraestructura OAuth).
- SQLite por servicio (cero Docker obligatorio).
- Flask mínimo +
requestspara hablar por HTTP. - Circuit breaker 👇 y retry suficientes para el challenge.
¡Listo! Copiá este proyecto, ajustá a tu gusto y… 🎉 chau Mamut.