Hoy vamos a ver Red Hat Fuse, la solución para realizar integraciones ágiles de Red Hat. Con ella nos adentraremos en el mundo de las micro integraciones y podremos dar un paso más para modernizar nuestra infraestructuras y dejar atrás los sistemas legacy.
Red Hat Fuse: ¿Qué es?
Red Hat Fuse, está basado en un conjunto estable de proyectos Open Source ampliamente utilizados, pero con el respaldo y soporte de una compañía como Red Hat. Teniendo como base Apache Camel para realizar las micro integraciones y la posibilidad de desplegarlo on-premise o en un entorno en la nube a través de Red Hat OpenShift.
Para ver todo ello, vamos a hacer un ejemplo donde obtendremos un mensaje, lo transformaremos para posteriormente mandarlo a otro sistema. Además de ver la simplicidad para crear la integración, también veremos como podemos desplegarlo y tenerlo disponible rápidamente.
Características de Apache Camel
Como hemos indicado anteriormente, Red Hat Fuse está basado en Apache Camel, el cual tiene dos características diferenciadoras en cuanto a arquitectura y despliegue. Por un lado, tiene un amplio catálogo de componentes que permiten la conexión fácilmente con distintos frameworks y servidores. Y por otro lado, Red Hat Fuse nos permite desplegarlo de distintas formas. Permitiendo tener un enfoque más tradicional con los despliegues en JBoss EAP, más dinámicos con Karaf o autocontenidos con Spring Boot. Para nuestro ejemplo, utilizaremos como base el framework Spring Boot, que es una de las opciones más utilizadas a la hora de realizar un microservicio Java.
Si lo prefieres también puedes realizar el proyecto con XML. Además, para este lenguaje, Red Hat te proporcionará una herramienta de desarrollo denominada CodeReady Studio. La cual pone a tu disposición un funciones de autocomplementar, el amplio catálogo de componentes y una vista de diseño que te pueden ser muy útiles a la hora de desarrollar.
Figura 1. Red Hat
Pasos para hacer una micro integración con Red Hat Fuse
Volviendo a nuestro ejemplo con código Java, este se encontrará compuesto de tres componentes principales: La clase que permite el arranque, la clase que contiene las rutas de integración y el fichero de configuración.
1.La clase de arranque, será la que permita indicar que estamos utilizando una aplicación Spring Boot y la que permitirá arrancar el proyecto sin necesidad de desplegarlo en otro servidor.
@SpringBootApplication public class RedHatFuseApplication { public static void main(final String[] args) { SpringApplication.run(RedHatFuseApplication.class, args); } }
2. A continuación, veremos la clase que contiene las distintas integraciones de la que está compuesto el proyecto. Estas integraciones son definidas como ‘rutas’. Para nuestra integración tendremos una ‘ruta’ principal que se expondrá al exterior como una API REST y se podrá invocar a través de un método POST. Esta ‘ruta’ comprobará el contenido del mensaje, y en función del mismo, decidirá realizar una acción u otra.
from("direct:transform").log("body: ${body}").choice() .when().simple("${body.destination} == 'Salesforce'").to("direct:sendToSalesforce") .when().simple("${body.destination} == 'Navision'").to("direct:sendToNavision");
3. Una vez diferenciado el destino, podremos tratar de forma diferenciada el mensaje, realizando las transformaciones y/o redirecciones oportunas. En el ejemplo podemos apreciar cómo hacemos una transformación y es redirigido convenientemente al sistema destino a través de su propia API REST.
from("direct:sendToSalesforce").log("Salesforce") .setHeader("Authorization", simple("Bearer {{salesforce.bearer.token}}")) .process(exchange -> { final Instruction instruction = exchange.getIn().getBody(Instruction.class); exchange.getIn().setBody(instruction.getInformation());}) .marshal().json() .toD("{{salesforce.host}}/services/data/v56.0/sobjects/Instruction?bridgeEndpoint=true") .to("direct:respond");
Por último crearemos una ‘ruta’ que permita devolverle la respuesta estándar al usuario que realizó la operación. En nuestro caso, un código de respuesta 201 y payload vacío.
from("direct:respond").log("responding").setHeader(Exchange.HTTP_RESPONSE_CODE, constant(201)).setBody(constant());
4. Una vez que tengamos nuestra integración, solo nos quedaría desplegarla. Tal y como hemos indicado anteriormente, Red Hat Fuse tiene una clara orientación hacía la nube y agile. Y aunque con la solución adoptada, podríamos desplegar la integración con un simple comando Java. Con la ayuda de plugins adecuados de Red Hat Fuse y fabric8, se puede crear y arrancar la imagen, en dos simples comandos.
mvn clean package -Pfuse7-generate-imagen docker run -p 8080:8080 chakray/redhat-fuse-integration:1.0.0
5. Para terminar solo nos quedaría probar la aplicación, esto podemos comprobarlo con el siguiente comando.
curl --location --request POST 'http://server:8080/fuseIntegration/instruction' \ --header 'Content-Type: application/json' \ --data-raw '{ "serviceId": 1001, "description": "Information", "date": null, "destination": "Salesforce", "information":{ "serial_Number__c" : "1000", "printer_Model__c" : "XZO-5" } }'
Conclusion
Como veis, Red Hat Fuse nos puede permitir realizar una integración entre sistemas, de forma rápida y sencilla. Sin la necesidad de tener un potente servidor y amplios recursos donde desplegarla. Además con la posibilidad de poder desplegarlo en la nube, con toda la versatilidad que ello conlleva.
Si necesitas ayuda, aquí estamos para ayudar a tu empresa, ¡contáctanos hoy mismo!