M30Gif es una Prueba de Concepto (en otras palabras, una excusa) para utilizar en un proyecto funcional los siguientes componentes:
-
Micronaut framework, http://micronaut.io
-
RxJava2
-
Docker https://www.docker.com/
(Principalmente los dos primeros)
Puedes ver la aplicación desplegada en https://m30-gif.puravida-software.com/
Puedes acceder al código en https://gitlab.com/jorge-aguilera/m30gif/pages
- WARNING
-
Este es un proyecto personal y sin ningún ánimo académico. La elección de frameworks y/o herramientas NO implica que sean las más adecuadas para el problema a resolver. Simplemente es un caso de uso como toma de contacto con las mismas
Objetivo
M30Gif irá recogiendo las imágenes de las cámaras de tráfico de la M-30 de Madrid cada cierto período y compondrá un Gif animado con las mismas que el usuario podrá consultar vía web.
Requisitos
-
mostrar todas las cámaras que se encuentran disponibles en http://www.mc30.es/components/com_hotspots/datos/camaras.xml
-
las imágenes se actualizan cada cierto tiempo (minutos, horas, etc) y debemos detectar cambios en las mismas
-
queremos un sistema desacoplado en la medida de lo posible
Arquitectura

Como se puede ver en la arquitectura propuesta dispondremos de un servicio, Extractor, que de forma periódica recuperará las fotos publicadas por las cámaras y las enviará a un BUS (kafka).
Por otra parte dispondremos de un servicio ImageBuilder que escuchará cuando hay fotos nuevas y las recuperará del BUS. Mediante un sistema de ficheros propio irá guardando las imágenes de interés (cambios respecto de la última almacenada) y cuando exista una nueva foto de interés lo publicará en el BUS
Por último dispondremos de un servicio que escuchará al topic de nueva imagen y solicitará vía REST al servicio de imagenes el gif animado. Este gif lo guardará en su sistema de ficheros para usarlo cuando un usuario desee ver la imagen de una cámara en particular.
Estructura proyecto
El proyecto se divide en varios módulos. NINGUNO de ellos tiene test, ni unitarios ni de integración porque no es mi interés en este proyecto.
simple-cqrs
simple-cqrs es una librería destinada a proporcionar un framework donde se pueda aplicar el patrón CQRS.
Básicamente maneja los conceptos de:
-
bus
-
commands
-
events
-
model
De tal forma registremos CommandHandlers en el Bus capaces de resolver Commands y generar Events
Particularmente tengo que usar este patrón en más casos porque aunque entiendo su finalidad me cuesta aplicarlo.
m30-xml-extractor
Aplicativo micronaut sin exposición web, que enviará eventos a Kafka mediante las funcionalidades de este.
Utiliza un Job que se ejecuta de forma periódica cada pocos minutos para parsear el xml y recuperar las imágenes.
Utiliza RxJava para descargar y enviar cada imágen de forma independiente.
Utiliza el modelo CQRS para crear un NewPictureCommand y que se envíe por el Bus hacia Kafka
image-builder
Aplicativo micronaut que lee de Kafka las imágenes y las envía a su Bus interno como un Command. Así mismo dispone de un interface REST para consultar los Gifs almacenados
El ComandHandler asociado utiliza los servicios de FileStorage e ImageStorage para guardar la imágen si es necesiario así como componer el Gif. Sólo cuando se ha actualizado el Gif se envía mediante un Event el id del Gif a Kafa
m30-rest
Aplicativo micronaut HttpServer que aloja el interface web (un único index.html) y escucha el topic de nuevo gif de Kafka
Ante la llegada de un mensaje de gif actualizado, este servicio lo recupera vía REST del servicio de imágenes y lo almacena en su disco para servirlo vía web
Build
Para construir los artecfactos basta disponer de Java8 instalado y ejecutar desde el directorio raiz:
./gradlew build
Deploy
Para poder desplegar el proyecto de una forma "fácil" necesitarás Docker y DockerCompose. En el directorio principal se proporciona un fichero docker-compose.yml con todos los elementos necesarios ya configurados (para un entorno de pruebas)
Para construir las imágenes de cada servicio deberás ejecutar:
./gradlew buildDocker
Si todo ha ido bien levantaremos los servicios de forma ordenada para ir comprobando que todo funciona correctamente:
docker-compose up -d zookeeper-server
docker-compose up -d kafka-server
docker-compose up -d m30-rest //(1)
docker-compose up -d image-builder
docker-compose up -d xml-extractor
-
Entre cada comando puedes ejecutar docker-compose logs -f para ver si todo va bien
Una vez levantados todos los servicios, xml-extractor empezará a recuperar imágenes y se irán ejecutando el resto de servicios.
Para ver las imágenes abre un navegador a http://localhost:8080