Soy un gran fan de las plataformas de aprendizaje en línea, como Udemy. Por el precio de una botella de vino, podías aprender prácticamente cualquier cosa, desde psicología y cocina tailandesa hasta lenguajes de programación, sistemas operativos y certificaciones informáticas. Hace poco, decidí tomar una clase con un título largo: "Kubernetes Hands-On - Implementación de microservicios en la nube de AWS". Es un gran curso y si quieres aprender más sobre nitty-gritty de Kubernetes, Microservicios, despliegues en la nube y mucho más lo recomiendo encarecidamente.

Como proyecto práctico de clase para el despliegue de microservicios en Kubernetes, el autor del curso proporcionó una pequeña aplicación llamada Fleetman. La aplicación permite monitorizar una flota de camiones (o lorries en términos británicos) que se mueven por la gran ciudad de Sheffield UK (aunque un camión circula por el corazón de Londres). La aplicación genera datos de geoposicionamiento para cada camión, los almacena en la memoria o en la base de datos e introduce los datos de localización en una cómoda interfaz web basada en mapas. En la interfaz podemos ver la última posición de cada camión, su velocidad y el recorrido actual. A continuación se muestra una captura de pantalla del front-end web de la aplicación.

Informes de posición de varios camiones

Mientras que los internos del código de la aplicación no era el foco principal del curso Udemy, (que era un Kubernetes y no una clase de desarrollo de software de todos modos), he encontrado la arquitectura de aplicaciones bastante fascinante, gracias al hecho de que el código fuente se abre al público en general. Como capa de base de datos de persistencia, la aplicación Fleetman original utiliza MongoDB, que podría decirse que es una opción popular para almacenar y consultar datos de telemetría sencillos procedentes de camiones en formato JSON.

¿Pero qué pasa con Couchbase? La plataforma de base de datos Couchbase ofrece un montón de características y capacidades como el lenguaje N1QL, Analytics, Eventing y Full-Text search. Estas características pueden hacer que una simple aplicación de recopilación de telemetría sea más potente. Pero, ¿qué tan difícil sería reconfigurar la aplicación Fleetman para usar Couchbase en lugar de Mongo? Así que pasé bastante tiempo sumergiéndome en el código fuente y refrescando mis conocimientos de programación Java. Empecemos por ver la arquitectura de Fleetman con más detalle.

Arquitectura Fleetman

La aplicación Fleetman está diseñada como un conjunto de módulos (o microservicios) que se comunican entre sí utilizando diversos métodos y protocolos. Tres microservicios: Position Simulator, Position Tracker y Gateway API están escritos utilizando el framework de aplicaciones Java Spring Boot. El módulo front-end está escrito en Angular, un popular marco de desarrollo Javascript. También hay un sistema de mensajería y una capa de base de datos. Como habrás adivinado, cada uno de estos microservicios se ejecutaría en un pod independiente en caso de despliegue en Kubernetes.

Depiction of Fleetman Microservices Architecture

Arquitectura Fleetman

 

  • Simulador de posición - genera telemetría de vehículos para cada uno de los 40 camiones de la flota leyendo archivos de configuración con coordenadas de posición. Estos informes de posición se escriben en la cola de mensajes en formato JSON, como se muestra a continuación.

 

  • Rastreador de posiciones - consume las posiciones de los vehículos de la cola y las almacena en Couchbase. También calcula la velocidad de cada camión, basándose en los informes de posición nuevos y anteriores. Este microservicio proporciona un conjunto de métodos para obtener la última posición de un camión específico, de todos los camiones, así como para obtener un historial de todas las posiciones de un camión. Estos métodos están disponibles a través de la interfaz REST. Obtener el historial podría ser útil, si uno de los pods K8s se reinicia.
  • Pasarela API - es una simple puerta de enlace para el front-end Angular. Lee las últimas posiciones del vehículo desde Position Tracker y las introduce en la aplicación web.
  • Aplicación web - es una aplicación basada en Angular que permite monitorizar las posiciones de los camiones en el mapa y saltar a una ubicación específica del camión mientras muestra su ruta recorrida. En el siguiente mapa puedes ver el recorrido del camión "London Riverside".

"Viaje en camión "London Riverside

Migración a Couchbase

Gracias al enfoque modular de la arquitectura de microservicios, la mayor parte de mis esfuerzos de migración se dedicaron al módulo Position Tracker, que se ocupa de la capa de base de datos. El código original de Fleetman se escribió hace un par de años, así que mi primer objetivo fue recompilar todos los microservicios Java con la versión más reciente de las bibliotecas de Spring Boot. Spring framework proporciona a los desarrolladores una forma rápida y sencilla de configurar y desarrollar aplicaciones web y regulares. Spring Boot es una extensión de Spring framework que viene con servidor HTTP embebido (Tomcat) y no requiere configuración vía XML. Es importante destacar que Couchbase es un ciudadano de primera clase en lo que a integración con Spring se refiere. En junio de este año se ha publicado la última versión 4.x de las librerías Spring de Couchbase y la documentación completa está disponible aquí.

Como parte de la migración, una de las primeras cosas que tuve que implementar fue añadir la generación de claves en el código para guardar documentos en la base de datos. Cada documento en Couchbase debe tener una clave. Spring Boot genera la clave usando la anotación @GeneratedValue ya sea con la combinación de atributos del documento o con un generador aleatorio UUID. Yo he utilizado este último. El mapeo de entidades para la posición del vehículo se muestra a continuación.

También fue necesario añadir una clase de configuración de Couchbase con un nombre de host, un nombre de usuario, una contraseña y un par de conversores para tratar el almacenamiento de valores BigDecimal para las coordenadas. Por defecto, Couchbase almacena las coordenadas como un objeto con escala y precisiones. Esto causó algunos problemas con la aplicación.

Utilizando convertidores pude almacenar los datos de las posiciones de los camiones en el siguiente formato:

 

La clase de configuración de Couchbase se indica a continuación.

 

Para configurar Couchbase creé un bucket de prueba, añadí un usuario RBAC con el mismo nombre que el bucket y concedí permisos de acceso a la aplicación a este usuario. También he añadido índices en el nombre y la fecha y hora, ya que estos dos atributos se utilizan como patrones de acceso por los métodos de repositorio. La interfaz de PositionRepository tiene tres métodos para buscar camiones por nombre, timestamp y una combinación de ambos.

Resumen

En general, la migración a Couchbase fue bastante suave. Probé todo el código localmente pero puede ser contenedorizado y desplegado en K8s en la nube usando Couchbase Autonomous Operator para Kubernetes. Tal ejemplo se presenta aquí. Desde el punto de vista empresarial, utilizando otras funciones de Couchbase podríamos ampliar las capacidades de la aplicación Fleetman. Por ejemplo, usando N1QL o Analytics los desarrolladores podrían construir una consulta que encontrara los 5 mejores camiones basándose en la distancia máxima recorrida en un determinado periodo de tiempo. La función Eventing podría utilizarse para enviar alertas si un determinado camión supera un límite de velocidad. Otra oportunidad de mejora sería utilizar consultas geoespaciales de Couchbase. El código fuente de mi versión de la aplicación Fleetman se encuentra en GitHub a la derecha aquí.

Autor

Publicado por Pavel Novokshonov, Ingeniero de soluciones sénior, Couchbase

Pavel es Ingeniero de Soluciones Senior en Couchbase. Anteriormente, trabajó en Teradata Corporation, Harrahs Entertainment y NCR en diferentes puestos, incluyendo gestión de bases de datos, consultoría, ingeniería de rendimiento y preventa técnica.

Dejar una respuesta