Repositorio con código base para el desarrollo de sidecars, adaptadores y embajadores. En este repositorio se presenta como crear un adaptador gRPC para que sistemas externos se puedan comunicar con un sistema legado usando un API REST. Para conocer más acerca de gRPC en Python puede consultar el siguiente link.
Este repositorio está basado en el repositorio de arquitectura hexagonal visto en el tutorial 3 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, hay un par de adiciones importantes a mencionar:
- src/sidecar: En este directorio encuentra el código para el adaptador gRPC de AeroAlpes. En el, podrá encontrar el módulo
aeroalpes
, el cual cuenta con la definición de los servicios gRPC y mensajes Protobuf en el directorioprotos
. Por otra parte, el móduloservicios
implementa las interfaces definidas en los archivos proto anteriomente descritos. Finalmente el módulopb2py
aloja los archivos compilados.proto
en Python (para ver como compilarlos lea la siguientes secciones). El archivomain.py
corre el servidor ycliente.py
un cliente que crea una reserva usando un mensaje en JSON definido en el directoriomensajes
. - .Dockerfile: Cada servicio cuenta con un Dockerfile para la creación de la imagen y futura ejecución de la misma. El archivo
adaptador.Dockerfile
es el encargado de instalar las dependencias de nuestro servicio en gRPC y los comandos de ejecución. Mientras que el archivoaeroalpes.Dockerfile
es el encargado de definir nuestro backend. - docker-compose.yml: Este archivo nos define la forma de componer nuestros servicios. En este caso usted puede ver como creamos el Sidecar/adaptador por medio del uso de una red común para la comunicación entre contenedoras. En el caso de desplegar esta topología en un orquestador de contenedoras, el concepto va a ser similar.
- sidecar-aeroalpes.yml: Este es un archivo template para el despliegue de las contenedoras en mismo Pod en Kubernetes. Podrá observar que solo se expone el puerto del servicio gRPC, el cual sirve como adaptador con la contenedora del backend de AeroAlpes. Puede modificar y extender este template para desplegarlo en su cluster personal.
Desde el directorio principal ejecute el siguiente comando.
flask --app src/aeroalpes/api run
Siempre puede ejecutarlo en modo DEBUG:
flask --app src/aeroalpes/api --debug run
coverage run -m pytest
coverage report
Desde el directorio principal ejecute el siguiente comando.
docker build . -f aeroalpes.Dockerfile -t aeroalpes/flask
Desde el directorio principal ejecute el siguiente comando.
docker run -p 5000:5000 aeroalpes/flask
En 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.txt
Desde 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.proto
Desde el directorio principal ejecute el siguiente comando.
docker build . -f adaptador.Dockerfile -t aeroalpes/adaptador
Desde el directorio principal ejecute el siguiente comando.
docker run -p 50051:50051 aeroalpes/adaptador
Para desplegar toda la arquitectura en un solo comando, usamos docker-compose
. Para ello, desde el directorio principal, ejecute el siguiente comando:
docker-compose up
Si desea detener el ambiente ejecute:
docker-compose stop
En caso de querer desplegar dicha topología en el background puede usar el parametro -d
.
docker-compose up -d
docker ps
docker ps -a
docker stop <id_contenedora>
docker rm <id_contenedora>
docker images
docker images rm <id_imagen>
docker exec -it <id_contenedora> sh