Integración de servicios y sistemas con Apache Camel
Escrito por
el .
java
planeta-codigo
Enlace permanente
Comentarios
Apache Camel es una librería específica para realizar tareas de integración que ya proporciona e implementa múltiples protocolos de comunicación, formatos de datos, componentes y patrones de integración. Ya tiene implementada toda esta funcionalidad que no hay que implementar en el caso de una aplicación con código propio. Al ser una librería es posible integrarlo en cualquier tipo de aplicación, en el artículo se muestra cómo utilizarlo en una aplicación de Spring Boot en un ejemplo.
Las empresas y organizaciones con cierta cantidad de años de vida con mucha probabilidad tiene una gran cantidad de servicios y sistemas con diferentes tecnologías, protocolos de comunicación y formatos de datos. Algunos de esos servicios y sistemas también tendrán varios años de vida, de entre ellos habrá alguno que ya puede ser considerado como obsoleto por la tecnología que utiliza, que ya no recibe soporte de nuevas características y solo es modificado en caso tareas de mantenimiento o en caso de un problema grave de seguridad. Estos servicios heredados aún con su antigüedad siguen siendo importantes por el servicio que prestan.
Sustituir esos servicios o sistemas heredados por otros nuevos a veces no es lo más adecuado ya que intervienen otros factores como el coste de tiempo requerido para desarrollar los nuevos sistemas que reemplacen a los antiguos, el coste económico, la disponibilidad de trabajadores que lo hagan y también por fiabilidad, cambiar un sistema con sus defectos y limitaciones pero que funciona por uno nuevo que no estará exento de sus propios problemas y defectos es un riesgo para el servicio prestado.
En vez de sustituir servicios y sistemas por unos nuevos una opción que se suele utilizar es proporcionar una integración. Apache Camel es una herramienta específica para realizar tareas de integración, que también se puede utilizar aún cuando no sea para un servicio o sistema heredado.
Contenido del artículo
La librería Apache Camel
Apache Camel es una librería ligera destinada a realizar tareas de integración entre servicios y sistemas. La de utilizar esta librería sobre realizar una integración con código propio específico para cada integración es que Apache Camel ya proporciona una buena cantidad de funcionalidades sin necesidad de tener que implementarlas.
A diferencia de las herramientas Enterprise Service Bus o ESB que también sin utilizadas para realizar tareas de integración entre sistemas heterogéneos y que suelen ser herramientas grandes y pesadas, Apache Camel es simplemente una librería muy ligera que es posible utilizarla embebida dentro de otras aplicaciones, por ejemplo dentro de una aplicación de Spring Boot.
Apache Camel soporta multitud de protocolos de comunicación como HTTP, FTP o JMS, formatos de datos como JSON, XML o CSV e integración con servicios como AWS, Consul o Twitter entre muchos otros. También ya tiene implementados multitud de patrones de integración como choice, filter, muticast, circuit breaker o bulkhead. Otra de sus funcionalidades es que soporta realizar pruebas unitarias.
Conceptos de Apache Camel
Apache Camel utiliza varios conceptos. La integración o funcionalidades desarrolladas se modelan como un flujo, ruta o route que comienza a partir de un origen o consumer y se envía a un destino o producer. En este flujo se tratan mensajes o Exchange que contiene además de los datos del mensaje o payload metadatos como cabeceras asociadas. En los diferentes pasos del flujo el Exchange puede sufrir transformaciones con los procesadores o processor y en el que se aplican los diferentes patrones de integración o integration patterns.
Una parte importante de Apache Camel que lo hacen fácil de utilizar son los endpoints que son URLs compuestas de un esquema, contexto y opciones. Un ejemplo de endpoint es el siguiente del componente RabbitMQ rabbitmq:exchange para tomar como fuente o destino colas de mensajes o del componente File file:misc/ para el sistema de archivos.
Los flujos se modelan con un lenguaje de dominio específico o DSL ya sea definiéndolo con código Java o en un archivo con formato XML. Al utilizar código Java se gana el soporte del entorno integrado de desarrollo, asistencia de código y detección de errores de compilación.
Al igual que en una aplicación de Spring existe el ApplicationContext, Apache Camel posee un contexto a modo de registro con todos los objetos de la instancia de Camel.
La colección de componentes de Apache Camel es muy numerosa.
- Componentes de Apache Camel
- Otros componentes de Apache Camel
- Lenguajes de expresiones de Apache Camel
Los formatos de datos que soporta también son muy numerosos.
También soporta los patrones de integración identificados en el libro Enterprise Integration Patterns que ya han demostrado su utilidad para solventar y simplificar los problemas a los que están dirigidos.
Patrones de integración
Algunos de los patrones básicos que soporta Apache Camel son choice para elegir rutas alternativas a las que dirigir los mensajes, filter para descartar los mensajes que no cumplan alguna condición, multicast para enviar un mensaje a varios destinos, recipient list para enviar a varios destinos de forma dinámica o wire tap para inspeccionar los mensajes sin alterar su flujo normal. Esos son solo unos pocos patrones de integración soportados.
Ejemplo básico con Apache Camel
Apache Camel al ser una librería es muy fácil de integrarlo en cualquier tipo de aplicación, en este ejemplo se utiliza Spring Boot. El ejemplo consiste en dos rutas, una que simplemente muestra en la salida los mensajes que se envía, la otra ruta lee los archivos CSV de un directorio que contienen listas de productos en diferentes columnas, filtra los productos que no tienen un importe superior a una cantidad, los transforma y les añade el IVA y finalmente los muestra en la salida, cada vez que en el directorio se añade un CSV se procesa.
Esta es la definición de varias rutas con su DSL en código Java que se definen en las clases que implementan la interfaz RouteBuilder, utilizando Spring definiéndose como un componente son añadidos de forma automática al contexto de Apache Camel. En la ruta HelloWorldRoute simplemente tomo como fuente lo que llega al endpoint de nombre direct:helloworld y lo dirige a la salida del sistema con stream:out sin ningún procesamiento adicional entre el origen y el destino.
|
|
Al inicio del programa se envía al consumidor de la ruta helloworld diez UUID.
|
|
La siguiente ruta es algo más compleja y muestra varias de las capacidades de Apache Camel. Monitoriza un directorio con un archivo en formato CSV, cuando este se crea o está presente al iniciar la aplicación la ruta lo toma como fuente de datos e inicia su procesamiento en el flujo.
Primeramente se procesan los datos transformándolos en objetos Java de tipo Book que son simplemente objetos POJO con una propiedad por cada columna del CSV. Al procesar los datos se obtiene una lista de objetos de tipo Book, con la operación split, la lista de divide en objetos individuales en el flujo.
Posteriormente, se aplica una condición sobre los objetos, según si el objeto cumple la condición o no se envían a un destino u otro. Según el destino al que están dirigidos se establece un con una cabecera que se transmiten como metadato al mismo tiempo que los datos.
Finalmente, los mensajes llegan al destino direct:books-stream-out, se aplica un filtro sobre la cabecera anterior, si la cumple se aplica un procesamiento al mensaje para aplicar el IVA sobre el precio del libro y una transformación que cambia el tipo del mensaje de Book a una cadena String, para terminar la cadena se envía a stream:out para imprimirlo en la salida de la aplicación.
Una vez procesado el CSV con éxito Apache Camel lo mueve a una carpeta oculta .camel, si el mismo archivo es vuelto a copiar en la capeta se procesa de nuevo.
|
|
|
|
|
|
Esta es la salida del programa.
|
|
Para su ejecución se utiliza la herramienta de construcción Gradle con el siguiente archivo donde se definen las dependencias del proyecto. La librería de Apache Camel para Spring Boot proporciona la funcionalidad de la que la aplicación se mantenga en funcionamiento tal como ocurre cuando se utiliza la dependencia de Spring para desarrollar aplicaciones web.
|
|
El código fuente completo del ejemplo puedes descargarlo del repositorio de ejemplos de Blog Bitix alojado en GitHub y probarlo en tu equipo ejecutando siguiente comando:./gradlew run