Uso de Camunda para la orquestación conveniente basada en REST y Workflow Engine (sin Java)

¡Hola, Habr! Les presento la traducción del artículo «Utiliza Camunda como un motor de orquestación y flujo de trabajo basado en REST fácil de usar (sin tocar Java)» autor Bernd Rücker.

07.07.2020, traducción artículo Bernd Rücker

Uso de Camunda para la orquestación conveniente basada en REST y Workflow Engine (sin Java)

A menudo discuto la arquitectura de microservicios con personas que no están familiarizadas con Java: desarrolladores de C#, Node.JS/JavaScript o seguidores de Golang. Todos ellos se enfrentan a la necesidad de un mecanismo de orquestación en la arquitectura de microservicios o simplemente a una herramienta para optimizar el flujo de trabajo y obtener capacidades de ordenamiento, manejo de tiempos de espera, Saga y transacciones compensatorias.

La plataforma BPM de código abierto de Camunda es ideal para estas tareas. La amabilidad hacia el desarrollador es una de las características clave del producto. Sin embargo, al mirar su documentación, puede parecer que la mayoría de la 'amabilidad' de Camunda está dirigida a desarrolladores de Java. La plataforma ofrece muchas posibilidades para conectar funciones y extensiones personalizadas, pero todo se realiza en Java. ¿Es esto realmente así?

¡No! En realidad, es fácil poner en marcha Camunda sin conocimientos de Java y configurar la arquitectura para código en cualquier lenguaje de tu elección. En este artículo, revisaremos:

  • la arquitectura base;
  • REST API;
  • consejos sobre bibliotecas cliente existentes para lenguajes diferentes a Java;
  • un ejemplo de uso de C# y Node.JS;
  • métodos para ejecutar el servidor Camunda (Docker o Tomcat).

Arquitectura

Camunda está escrita en Java y necesita una máquina virtual de Java (JVM) para ejecutarse. Camunda proporciona una API REST que te permite escribir en cualquier lenguaje que desees y utilizar REST con Camunda:

Uso de Camunda para la orquestación conveniente basada en REST y Workflow Engine (sin Java)

Los flujos de trabajo en Camunda se definen en BPMN, que es principalmente un archivo XML. Se puede modelar usando Camunda Modeler.

Ejecutar Camunda a través de una imagen Docker preconstruida

La manera más sencilla de poner en marcha Camunda es usar Docker. Los métodos alternativos para ejecutar Camunda se describen más adelante en este artículo.

Uso de Camunda para la orquestación conveniente basada en REST y Workflow Engine (sin Java)

En este caso, solo necesitas ejecutar:

  docker run -d -p 8080:8080 camunda/camunda-bpm-platform:latest

No tienes que preocuparte por Linux, máquinas virtuales de Java o Tomcats. Los Dockerfiles y la documentación básica (por ejemplo, instrucciones para conectarse a las bases de datos necesarias) están disponibles en Github.

Si deseas ejecutar Camunda Enterprise Edition, puedes cambiar fácilmente Dockerfile.

Sin embargo, al iniciar Camunda con Docker, hay una desventaja: obtendrá una versión de Tomcat que no siempre incluye los últimos parches. Para sortear esto, puede crear una imagen de Docker basada en la distribución de Tomcat que necesite, como se muestra en este ejemplo, o utilizar una de las soluciones descritas a continuación.

Despliegue del modelo de proceso

Analicemos un ejemplo utilizando la plantilla Saga para una reserva de viajes clásica, donde desea invocar tres acciones de forma consecutiva y compensar correctamente las acciones que se han completado con éxito en caso de un fallo posterior. Presentado en forma de BPMN, se ve así:

Uso de Camunda para la orquestación conveniente basada en REST y Workflow Engine (sin Java)

Ahora puede usar API REST para desplegar el modelo de proceso. Supongamos que lo ha guardado con el nombre trip.bpmn y ha iniciado Camunda a través de Docker, de modo que esté disponible en localhost: 8080:

  curl -w "n" 
-H "Accept: application/json" 
-F "deployment-name=trip" 
-F "enable-duplicate-filtering=true" 
-F "deploy-changed-only=true" 
-F "trip.bpmn=@trip.bpmn" 
http://localhost:8080/engine-rest/deployment/creat

Ahora puede iniciar nuevos instancias de proceso utilizando la API REST y pasar los datos que desea ver como variables de la instancia de proceso:

  curl 
-H "Content-Type: application/json" 
-X POST 
-d '{"variables":{"someData" : {"value" : "someValue", "type": "String"}},"businessKey" : "12345"}}' 
http://localhost:8080/engine-rest/process-definition/key/FlowingTripBookingSaga/start

La siguiente pregunta interesante es: ¿cómo invoca Camunda procedimientos como la reserva de un coche? Camunda no solo puede invocar servicios de inmediato (Principio Push), utilizando algunos conectores integrados, sino que también puede colocar elementos de trabajo en una especie de secuencia incorporada. Después, el trabajador puede obtener elementos de trabajo a través de REST, realizar la tarea y notificar a Camunda sobre su finalización (Principio Pull).Entonces, primero necesita ejecutar

Uso de Camunda para la orquestación conveniente basada en REST y Workflow Engine (sin Java)

fetchAndLock (ya que otros trabajadores pueden obtener tareas simultáneamente para escalar el sistema): curl -H "Content-Type: application/json" -X POST -d '{"workerId":"worker123","maxTasks":1,"usePriority":true,"topics":[{"topicName": "reserve-car"}, "lockDuration": 10000, "variables": ["someData"]}]}'<!-- --> http://localhost:8080/engine-rest/external-task/fetchAndLock

  Luego, notifique a Camunda que

el trabajador ha completado el trabajo (tenga en cuenta que debe ingresar el identificador de la tarea externa que recibió en la primera solicitud): curl -H "Content-Type: application/json" -X POST -d '{"workerId":"worker123", "variables": {}}'<!-- --> http://localhost:8080/engine-rest/external-task/EXTERNAL_TASK_ID/complete

  curl 
-H "Content-Type: application/json" 
-X POST 
-d '{"workerId":"worker123", "variables": {}}' 
http://localhost:8080/engine-rest/external-task/EXTERNAL_TASK_ID/complete

Eso es todo: todavía no has necesitado Java, ¿verdad? ¡Y eso es suficiente para comenzar a trabajar!

Bibliotecas del cliente

Llamar a la API REST es fácil en cualquier lenguaje de programación. En JavaScript se puede hacer cómodamente utilizando JQuery, y en C# se usa System.Net.Http y Newtonsoft.Json. Pero esto tomará tiempo. Así que puedes simplemente utilizar alguna biblioteca del cliente.

Actualmente hay varias bibliotecas del cliente listas para usar:

  • JavaScript: enlace. Compatible con Camunda;
  • Java: enlace. Compatible con Camunda;
  • C#:enlace y enlace. Ambos proyectos están en un estado intermedio y están prácticamente inactivos, pero pueden servir como un buen punto de partida;
  • PHP: enlace — una biblioteca que no es muy completa y no incluye los últimos cambios de la API, pero conozco proyectos que la utilizan.

A excepción de JavaScript y Java, las bibliotecas del cliente no son parte del mismo producto Camunda. No esperes que soporten todas las capacidades de la API REST de Camunda. Si una biblioteca no proporciona una función específica, eso no significa que no exista, siempre verifica la API REST de Camunda. Los proyectos típicos utilizan las bibliotecas como punto de partida y plantilla.

Ejemplo con C#

Utilizando la biblioteca del cliente mencionada anteriormente, solo tenemos que escribir:

  var camunda = new CamundaEngineClient("http://localhost:8080/engine-rest/engine/default/", null, null);
  // Desplegar el archivo BPMN XML desde los recursos
  camunda.RepositoryService.Deploy("trip-booking", new List {
        FileParameter.FromManifestResource(Assembly.GetExecutingAssembly(), "FlowingTripBookingSaga.Models.FlowingTripBookingSaga.bpmn")
     });
  
  // Registrar trabajadores
  registerWorker("reserve-car", externalTask => {
    // ¡aquí puedes hacer lo real! Como un sysout :-)
    Console.WriteLine("Reservando coche...");
    camunda.ExternalTaskService.Complete(workerId, externalTask.Id);
  });
  registerWorker("cancel-car", externalTask => {
    Console.WriteLine("Cancelando coche...");
    camunda.ExternalTaskService.Complete(workerId, externalTask.Id);
  });
  registerWorker("book-hotel", externalTask => {
    Console.WriteLine("Reservando hotel...");
    camunda.ExternalTaskService.Complete(workerId, externalTask.Id);
  });
  // Registrar más trabajadores...
  
  StartPolling();
  
  string processInstanceId = camunda.BpmnWorkflowService.StartProcessInstance("FlowingTripBookingSaga", new Dictionary()
    {
      {"someBookingData", "..." }
    });

Puedes encontrar el código fuente completamente funcional en Internet: enlace. Otro ejemplo está disponible en enlace.

Пример с Node.js

  var Workers = require('camunda-worker-node');
  var workers = Workers('http://localhost:8080/engine-rest', {
    workerId: 'some-worker-id'
  });
  
  workers.registerWorker('reserve-car', [ 'someData' ], function(context, callback) {
    var someNewData = context.variables.someData + " - se agregó algo";
    callback(null, {
      variables: {
        someNewData: someNewData
      }
    });
  });
  
  workers.shutdown();

Puede encontrar más información en el sitio web github.com

Métodos alternativos para ejecutar Camunda

Imagen de Docker personalizada con "Camunda standalone WAR"

Como alternativa a la imagen de Docker lista de Camunda, puede configurar Tomcat por su cuenta (por ejemplo, basándose en las imágenes de Docker oficiales de Tomcat), y luego copiar Camunda en él como uno de los llamados archivos WAR.

Uso de Camunda para la orquestación conveniente basada en REST y Workflow Engine (sin Java)

Si tiene muchos requisitos adicionales y puede configurar el entorno de construcción de Java, también puede configurar Camunda Standalone war. Configure la construcción de Maven como en estos ejemplos: construcción Maven con configuración war o construcción Maven con Overlay.

Ejecutar la distribución de Camunda Tomcat

Otra opción es simplemente descargar la distribución de Camunda Tomcat, descomprimirla y ejecutarla. Para ello, solo necesitará el entorno de ejecución de Java (JRE), que debe estar instalado en su computadora. Puede descargarlo fácilmente desde aquí.

Uso de Camunda para la orquestación conveniente basada en REST y Workflow Engine (sin Java)

Para cambiar la base de datos o hacer algo más, deberá configurar Tomcat como se describe en la documentación. Sé que Tomcat puede parecer complicado, pero en realidad es muy sencillo. Y Google tiene respuestas a todo lo que pueda necesitar en el proceso.

Ejecutar Camunda utilizando Tomcat

La última alternativa es configurar Tomcat por su cuenta e instalar Camunda en él, siguiendo las instrucciones de instalación. Esto permitirá usar cualquier versión de Tomcat que prefiera, o, por ejemplo, instalarlo como un servicio de Windows.

Ejecutar Camunda en producción

Por lo general, será necesario realizar algunos ajustes finales para poner en marcha Camunda. En Camunda hay recomendaciones que lo explican con mucho detalle, pero no entraré en ellas en este artículo: solo mencionaré un ejemplo: la API REST de la distribución por defecto no está configurada para autenticación. Puede que desee cambiar esto.

Conclusiones

Como puede haber notado, comenzar a trabajar con Camunda es muy fácil, independientemente del lenguaje que use. El punto clave es que toda la interacción se lleva a cabo a través de la API REST. La instalación también es bastante simple, especialmente al usar Docker.

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster