Proyecto de la asignatura Cloud Computing para el curso 2018/2019 del Máster en Ingeniería Informática, realizado por Gema Correa Fernández. Pincha aquí para acceder al enlace de la documentación.
Tabla de Contenidos
- Novedades
- Descripción del proyecto
- Descripción de arquitecturas software
- Descripción de los microservicios a desarrollar
- Descipción de los tests en Python (código sin test código roto)
- Descripción del despliegue
- Orquestación de máquinas virtuales
- Enlaces de Interés
- Licencia
Despliegue Vagrant: 20.188.32.253
- Pincha aquí para acceder a los avances realizados en el hito 5. En dicho documento explico el proceso seguido para la conexión entre máquinas y como creo la BD e inserto.
- Pincha aquí para ver la orquestación de máquinas virtuales.
- Pincha aquí para ver las comprobaciones realizadas en el hito 5.
Twitter junto con Instagram son dos de las plataformas sociales más usadas actualmente, por eso mismo, miles de usuarios comparten todo tipo de información en ellas. Este tipo de comportamientos benefician a las empresas dándoles potestad en la obtención de información muy valiosa, cómo por ejemplo ver qué tendencias o trending topics son los más comentados o qué ciudades son las más comentadas en la red. En este caso, yo me voy a centrar en la obtención de datos geolocalizados, es decir, en la extracción de trending topics o tendencias de los usuarios en Twitter para una región determinada. Para así, poder clasificar las tendencias y establecer la tendencia mayoritaria para una region determinada.
Actualmente, las arquitecturas software modernas buscan la consistencia en la velocidad de respuesta al usuario. Sin embargo, en el mercado existen muchos tipos de arquitecturas, es por ello que a veces se hace difícil concretar qué arquitectura se va a utilizar [2]:
- Arquitectura en capas.
- Arquitectura dirigida por eventos.
- Arquitectura microkernel.
- Arquitectura basada en microservicios.
- Arquitectura basada en espacios.
Pincha aquí para saber más acerca de las arquitecturas anteriores.
Entonces, resulta bastante claro que de todas las arquitecturas comentadas anteriormente vayamos a hacer uso de la arquitectura basada en microservicios, ya que es la que más actual y la que menos problemas presenta, además de que nos permite tener diferentes servicios trabajando de forma totalmente independiente unos de otros.
Para realizar la arquitectura se va a hacer uso del lenguaje Python, y para el desarrollo de los microservicios se puede usar cualquier microframework web para Python, en este caso existe la posibilidad de usar Django (más complejo o pensado para un proyecto de grandes dimensiones o que crezca) o Flask (más sencillo). Es por ello, que tras haber buscado documentación, hablado con usuarios de ambos microframework y ser la primera vez que uso este tipo de tecnología/herramienta, me he decantado por Flask. Los microservicios previstos a desarrollar son los siguientes:
- Consultar API de Twitter: en este microservicio solo nos vamos a centrar en acceder, consultar y bajarnos información de la API, información obtenida en un JSON.
- Procesar información: en este microservicio vamos a quedarnos con los datos referentes a las tendencias según su localización, en un JSON:
API.trends_place(id[, exclude])
. - Almacenar información: en este microservicio nos vamos a centrar en crear una estructura para los datos que hemos realizado, usando principalmente una BD como MYSQL.
- Mostrar información: en este microservicio solo nos interesa mostrar la información relevante de alguna manera específica.
- Además, necesitamos un sistema de centralización de logs, al cual todos deben comunicarse.
Actualmente, la API de Twitter nos permite acceder a todo tipo de información de forma más simple que la de Instagram, es por eso que me he decantado por esta red social. A continuación, se muestran algunos datos a los que podemos acceder [1]:
- Tweets: búsqueda, publicación, filtrado, etc.
- Anuncios: gestión de campañas, análisis, etc.
- Contenido multimedia: subir y acceder a fotos, vídeos, GIF animados, etc.
- Tendencias: trending topics.
- Geo: información sobre lugares conocidos, lugares cerca de una ubicación, etc.
Python cuenta muchas bibliotecas desarrolladas para la API de Twitter. Sin embargo, al no haber usado nunca ninguna me es dífil elegir que biblioteca es la mejor. Es por ello, que voy hacer uso de tweepy ya que he oído hablar de ella bastante bien y tiene bastante documetación en la web. De todas maneras, existen otras librerías cómo twython, python-twitter o TwitterAPI.
Pincha aquí, para más información acerca de la extracción de datos de Twitter realizada para el proyecto
Para testear en Python [3], puedo usar algunas de las librerías que me permiten implementar pruebas unitarias en dicho lenguaje como unittest, doctest o pytest [4]. En este caso yo voy hacer uso de la biblioteca unittest, ya que nos ofrece toda la potencia del lenguaje para probar nuestros programas, lo que significa que ayuda a determinar rápidamente el impacto de cualquier modificación en el resto del código.
Para realizar la configuración de los tests correctamente, voy hacer uso de Travis CL, que es un sistema distribuido de generación e integración continua libre, que me permite conectar mi repositorio de Github y testear después de cada push que haga [5] [6].
Pincha aquí, para saber más información sobre los tests.
Cuando se quiere desplegar una aplicación sobre una infraestructura ya definida y que no va a cambiar se necesita un Platform as a Service o PaaS. Entre los posibles servicios que hay Heroku o OpenShift, vamos a escoger Heroku, ya que es un servicio fiable, gratuito, ofrece muchas opciones a la hora de elegir el lenguaje y permite integrar Github con Travis.
Pincha aquí, para saber más información sobre el despliegue en PaaS.
Para el despliegue de la aplicación en una máquina virtual local, se ha hecho uso de Ansible junto con Vagrant. Previamente a la realización de un clone
a mi repositorio, se debe instalar Ansible, Vagrant y VirtualBox, herramientas necesarias para ejecutar la aplicación. Una vez realizados estos procesos, debemos dirigirnos al directorio provision > vagrant_ubuntu
y ejecutar la sentencia vagrant up
, la cual creará una máquina virtual en VirtualBox y ejecutará el playbook con lo indispensable para el despliegue.
Se usa Vagrant
para provisionar una o preferiblemente varias máquinas virtuales usando un proveedor de servicios cloud, en este caso se ha usado Azure. En el directorio orquestacion se encuentran los archivos necesarios para llevar a cabo la creación y provisión de las máquinas virtuales y la documentación se encuentra aquí. La documentación donde se explica el proceso para la creación y uso de la base de datos, se puede encontrar aquí.
- Clonar mi repositorio.
- Acceder a la carpeta orquestación (
cd orquestacion/
) y ejecutarvagrant up --no-parallel —provider=azure
. - Cuando se terminen de crear y provisiona ambas máquinas, abrir las dos con SSH:
# Para la máquina principal
$ ssh [email protected]
# Para la máquina con la base de datos
$ ssh [email protected]
-
Dentro de la máquina principal, se accede a la carpeta proyecto (
cd proyecto/
) y se lanza la aplicación en el puerto 80 con (sudo gunicorn -b :80 main:app
). -
Accedemos al navegador con la IP pública de la máquina principal (http://ip_publica_maquina_principal:80/status) y obtenemos el status ok (mirar IP en Azure).
-
Accedemos al navegador con la IP pública de la máquina principal (http://ip_publica_maquina_principal:80/BD) y visualizamos la interfaz web, la cual esta conectada con la base de datos.
-
Comprobación de @jmv74211 al aprovisionamiento de @gecofer disponible en este enlace.
-
Comprobación de @gecofer al aprovisionamiento de @jmv74211 disponible en este enlace.
-
Comprobación de @luiisgallego al aprovisionamiento de @gecofer disponible en este enlace.
-
Comprobación de @gecofer al aprovisionamiento de @luiisgallego disponible en este enlace.
Proyecto bajo licencia GNU GLP V3.
Nota: Se debe tener en cuenta que la realización de un proceso de desarrollo conlleva modificaciones en el futuro, pudiendo modificar la documentación o añadiendo nuevas funcionalidades.