Repositorio con código base para la implementación del patrón Saga usando orquestación como mecanismo de orquestación.
Este repositorio está basado en el repositorio de Event Sourcing visto en el tutorial 7 del curso. Por tal motivo, puede usar ese mismo repositorio para entender algunos detalles que este README no cubre.
Este repositorio sigue en general la misma estructura del repositorio de origen. Sin embargo, la estructura de nuestro proyecto de AeroAlpes ha cambiado considerablemente, puesto que se ha desmantelado el monolito en multiples microservicios. A continuación puede ver la nueva estructura:
- El directorio src/cliente/ ahora incluye todas las clases y archivos que constituyen el contexto del manejo de usuarios.
- El directorio src/integracion_gds/ ahora incluye todas las clases y archivos que constituyen el contexto con la integración con GDS.
- El directorio src/pagos/ ahora incluye todas las clases y archivos que constituyen el contexto de pagos.
- El proyecto
aeroalpesahora cuenta con un nuevo módulo para el manejo de sagas src/aeroalpes/modulos/sagas/. Este módulo sigue los mismos estándares de los demás módulos.- Módulo
aplicacionque cuenta con código de loscomandospara múltiples contextos fuera del de reservas e itinerarios. - Módulo
coordinadoresque cuenta con la saga de reservas usando orquestación.
- Módulo
- Los archivos src/aeroalpes/seedwork/aplicacion/sagas.py provee las interfaces y definiciones genéricas para la coordinación de sagas.
Desde el directorio principal ejecute el siguiente comando.
docker-compose --profile db upEste comando descarga las imágenes e instala las dependencias de la base datos.
Desde el directorio principal ejecute el siguiente comando.
flask --app src/aeroalpes/api runSiempre puede ejecutarlo en modo DEBUG:
flask --app src/aeroalpes/api --debug runcoverage run -m pytestcoverage reportDesde el directorio principal ejecute el siguiente comando.
docker build . -f aeroalpes.Dockerfile -t aeroalpes/flaskDesde el directorio principal ejecute el siguiente comando.
docker run -p 5000:5000 aeroalpes/flaskEn el mundo real es probable que ambos proyectos estén en repositorios separados, pero por motivos pedagógicos y de simpleza,
estamos dejando ambos proyectos en un mismo repositorio. Sin embargo, usted puede encontrar un archivo sidecar-requirements.txt,
el cual puede usar para instalar las dependencias de Python para el servidor y cliente gRPC.
pip install -r sidecar-requirements.txtDesde el directorio principal ejecute el siguiente comando.
python src/sidecar/main.py Desde el directorio principal ejecute el siguiente comando.
python src/sidecar/cliente.py Desde el directorio src/sidecar ejecute el siguiente comando.
python -m grpc_tools.protoc -Iprotos --python_out=./pb2py --pyi_out=./pb2py --grpc_python_out=./pb2py protos/vuelos.protoDesde el directorio principal ejecute el siguiente comando.
docker build . -f adaptador.Dockerfile -t aeroalpes/adaptadorDesde el directorio principal ejecute el siguiente comando.
docker run -p 50051:50051 aeroalpes/adaptadorDesde el directorio principal ejecute el siguiente comando.
python src/notificaciones/main.pyDesde el directorio principal ejecute el siguiente comando.
docker build . -f notificacion.Dockerfile -t aeroalpes/notificacionDesde el directorio principal ejecute el siguiente comando.
docker run aeroalpes/notificacionDesde el directorio principal ejecute el siguiente comando.
python src/ui/main.pyDesde el directorio principal ejecute el siguiente comando.
docker build . -f ui.Dockerfile -t aeroalpes/uiDesde el directorio principal ejecute el siguiente comando.
docker run aeroalpes/uiDesde el directorio src ejecute el siguiente comando
uvicorn cliente.main:app --host localhost --port 8000 --reloadDesde el directorio src ejecute el siguiente comando
uvicorn pagos.main:app --host localhost --port 8001 --reloadDesde el directorio src ejecute el siguiente comando
uvicorn integracion_gds.main:app --host localhost --port 8002 --reloadNota: Antes de poder ejectuar todos los siguientes comandos DEBE tener la base de datos MySQL corriendo.
wget https://archive.apache.org/dist/pulsar/pulsar-2.10.1/connectors/pulsar-io-debezium-mysql-2.10.1.nar
Abrir en una terminal:
docker exec -it broker bashYa dentro de la contenedora ejecute:
./bin/pulsar-admin source localrun --source-config-file /pulsar/connectors/debezium-mysql-source-config.yaml --destination-topic-name debezium-mysql-topicAbrir en una terminal:
docker exec -it broker bashYa dentro de la contenedora ejecute:
./bin/pulsar-client consume -s "sub-datos" public/default/aeroalpesdb.reservas.usuarios_legado -n 0Abrir en una terminal:
docker exec -it broker bashYa dentro de la contenedora ejecute:
./bin/pulsar-admin topics list public/defaultAbrir en una terminal:
docker exec -it broker bashYa dentro de la contenedora ejecute:
./bin/pulsar-admin namespaces set-retention public/default --size -1 --time -1Para poder ver que los cambios fueron efectivos ejecute el siguiente comando:
./bin/pulsar-admin namespaces get-retention public/defaultNota: Esto nos dejará con una retención infinita. Sin embargo, usted puede cambiar la propiedad de size para poder usar Tiered Storage
Para seguir la guía oficial de instalación y uso de Debezium en Apache Pulsar puede usar el siguiente link
Para desplegar toda la arquitectura en un solo comando, usamos docker-compose. Para ello, desde el directorio principal, ejecute el siguiente comando:
docker-compose upSi desea detener el ambiente ejecute:
docker-compose stopEn caso de querer desplegar dicha topología en el background puede usar el parametro -d.
docker-compose up -ddocker psdocker ps -adocker stop <id_contenedora>docker rm <id_contenedora>docker imagesdocker images rm <id_imagen>docker exec -it <id_contenedora> shfuser -k <puerto>/tcpdocker-compose --profile <pulsar|aeroalpes|ui|notificacion> up