M30Gif es una Prueba de Concepto (en otras palabras, una excusa) para utilizar en un proyecto funcional los siguientes componentes:

(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

Arquitectura

diag 5380c1e530095de0ac7f7c0561c568ed

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
  1. 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