Uso de Camunda para una fácil orquestación basada en REST y Workflow Engine (sin Java)

¡Hola, Habr! Presento a su atención la traducción del artículo. "Utilice Camunda como un motor de flujo de trabajo y orquestación basado en REST fácil de usar (sin tocar Java)" por Bernd Rücker.

07.07.2020/XNUMX/XNUMX, traducción Artículo Bernd Rucker

Uso de Camunda para una fácil orquestación basada en REST y Workflow Engine (sin Java)

A menudo hablo de arquitectura de microservicios con personas que no son Java: desarrolladores de C#, desarrolladores de Node.JS/JavaScript o aficionados a Golang. Todos ellos se enfrentan al hecho de que necesitan un mecanismo de orquestación en una arquitectura de microservicio, o simplemente una herramienta para optimizar el flujo de trabajo y obtener la capacidad de realizar pedidos, manejar tiempos de espera, Saga y transacciones de compensación.

plataforma BPM con código abierto de Camunda Genial para este tipo de tareas. La facilidad de uso para los desarrolladores es una de las características clave del producto. Pero si miras su documentación, puedes tener la impresión de que la "amabilidad" de Camunda está dirigida principalmente a los desarrolladores de Java. La plataforma ofrece muchas opciones para conectar sus propias funciones y extensiones, pero todo se hace en Java. ¿Es realmente?

¡No! De hecho, puedes ejecutar Camunda fácilmente sin ningún conocimiento de Java y configurar la arquitectura para el código en cualquier idioma que elijas. En este artículo, veremos:

  • arquitectura básica;
  • API DESCANSO
  • asesoramiento sobre bibliotecas cliente existentes para lenguajes distintos de Java;
  • ejemplo usando C# y Node.JS;
  • formas de iniciar el servidor Camunda (Docker o Tomcat).

Arquitectura

Camunda está escrito en Java y necesita una máquina virtual Java (JVM) para ejecutarse. Camunda proporciona una API REST que le permite escribir en cualquier idioma que desee y usar REST con Camunda:

Uso de Camunda para una fácil orquestación basada en REST y Workflow Engine (sin Java)

Los flujos de trabajo en Camunda se definen en BPMN, que es básicamente un archivo XML. Se puede modelar con Modelador de Camunda.

Ejecutar Camunda a través de una imagen de Docker prediseñada

La forma más sencilla de ejecutar Camunda es utilizar Docker. Más adelante en este artículo se describen formas alternativas de iniciar Camunda.

Uso de Camunda para una fácil orquestación basada en REST y Workflow Engine (sin Java)

En este caso simplemente ejecute:

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

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

Si desea ejecutar Camunda Enterprise Edition, puede cambiar fácilmente Dockerfile.

Sin embargo, ejecutar Camunda con Docker tiene una desventaja: terminará con una versión de Tomcat que no siempre incluye las últimas correcciones. Para solucionar este problema, puede crear su propia imagen de Docker basada en la distribución de Tomcat deseada, como se muestra en este ejemplo, o utilizar una de las soluciones que se describen a continuación.

Implementación del modelo de proceso

Veamos un ejemplo que utiliza la plantilla Saga para una reserva de viaje clásica en la que desea activar tres acciones seguidas y compensar con elegancia las acciones completadas con éxito en caso de un error posterior. Representado en formato BPMN, se ve así:

Uso de Camunda para una fácil orquestación basada en REST y Workflow Engine (sin Java)

Ahora puedes usar API REST para implementación de modelos de procesos. Digamos que lo guarda como trip.bpmn y ejecuta Camunda a través de Docker para 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 "[email protected]" 
http://localhost:8080/engine-rest/deployment/creat

Ahora puedes correr nuevas instancias de flujo de trabajo usando la API REST y pase los datos que desea ver como variables de instancia de flujo de trabajo:

  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 llama Camunda a procedimientos como reservar un coche? Camunda no sólo puede llamar a servicios inmediatamente (Push-Principle) usando algunos incorporados conectores, pero también coloca los elementos de trabajo en una especie de orden integrado. Luego, el trabajador puede buscar elementos de trabajo a través de REST, realizar el trabajo y decirle a Camunda que lo complete (Pull-Principle).

Uso de Camunda para una fácil orquestación basada en REST y Workflow Engine (sin Java)

Entonces primero necesitas ejecutar buscar y bloquear (porque otros trabajadores pueden recibir tareas al mismo tiempo 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

Entonces dile a Camunda que trabajador completó el trabajo (tenga en cuenta que debe ingresar la identificación de la tarea externa recibida 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

Eso es todo, todavía no necesitas Java, ¿verdad? ¡Y eso es suficiente para empezar!

Bibliotecas de clientes

Llamar a una API REST es fácil en cualquier lenguaje de programación. En JavaScript, esto se hace cómodamente usando JQuery, y en C#, usando System.Net.Http y Newtonsoft.Json. Pero esto llevará tiempo. Entonces puedes usar alguna biblioteca cliente.

Por el momento, se encuentran disponibles varias bibliotecas cliente listas para usar:

  • JavaScript: enlace. Con el apoyo de Camunda;
  • Java: enlace. Con el apoyo de Camunda;
  • C #:enlace и enlace. Ambos proyectos se encuentran en un estado intermedio y prácticamente inactivos, pero pueden servir como un buen punto de partida;
  • PHP: enlace - no es demasiado completo y no incluye los últimos cambios de API, pero conozco proyectos que lo utilizan.

Con la excepción de JavaScript y Java, las bibliotecas cliente no forman parte del producto Camunda en sí. No espere que admitan todas las funciones de la API REST de Camunda. El hecho de que una biblioteca no proporcione una determinada función no significa que no esté allí; consulte siempre la API REST de Camunda. Los proyectos de referencia utilizan bibliotecas como punto de partida y plantilla.

Ejemplo de C#

Usando la biblioteca cliente anterior, simplemente podemos escribir:

  var camunda = new CamundaEngineClient("http://localhost:8080/engine-rest/engine/default/", null, null);
  // Deploy the BPMN XML file from the resources
  camunda.RepositoryService.Deploy("trip-booking", new List<object> {
        FileParameter.FromManifestResource(Assembly.GetExecutingAssembly(), "FlowingTripBookingSaga.Models.FlowingTripBookingSaga.bpmn")
     });
  
  // Register workers
  registerWorker("reserve-car", externalTask => {
    // here you can do the real thing! Like a sysout :-)
    Console.WriteLine("Reserving car now...");
    camunda.ExternalTaskService.Complete(workerId, externalTask.Id);
  });
  registerWorker("cancel-car", externalTask => {
    Console.WriteLine("Cancelling car now...");
    camunda.ExternalTaskService.Complete(workerId, externalTask.Id);
  });
  registerWorker("book-hotel", externalTask => {
    Console.WriteLine("Reserving hotel now...");
    camunda.ExternalTaskService.Complete(workerId, externalTask.Id);
  });
  // Register more workers...
  
  StartPolling();
  
  string processInstanceId = camunda.BpmnWorkflowService.StartProcessInstance("FlowingTripBookingSaga", new Dictionary<string, object>()
    {
      {"someBookingData", "..." }
    });

El código fuente completamente funcional se puede encontrar en línea: enlace. Otro ejemplo está disponible en enlace.

Ejemplo con 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 + " - added something";
    callback(null, {
      variables: {
        someNewData: someNewData
      }
    });
  });
  
  workers.shutdown();

Más información se puede encontrar en el sitio web. Github.com

Formas alternativas de iniciar Camunda

Imagen de Docker personalizada con "WAR independiente de Camunda"

Como alternativa a una imagen Docker prediseñada de Camunda, puede preparar Tomcat usted mismo (por ejemplo, basándose en las imágenes oficiales de Docker Tomcat) y luego copiar Camunda en él como uno de los llamados archivos WAR.

Uso de Camunda para una fácil orquestación basada en REST y Workflow Engine (sin Java)

Si tiene muchos requisitos adicionales y puede configurar un entorno de compilación Java, también puede configurar Camunda Standalone war. Configure una compilación de Maven como en estos ejemplos: Maven con configuración de guerra o montaje Maven con superposición.

Iniciando la distribución de Camunda Tomcat

Otra opción es simplemente descargar la distribución Camunda Tomcat, descomprimirla y ejecutarla. Esto sólo requiere que Java Runtime Environment (JRE) esté instalado en su computadora. puede ser facilmente descargar desde aquí.

Uso de Camunda para una fácil orquestación basada en REST y Workflow Engine (sin Java)

Para cambiar la base de datos o hacer cualquier otra cosa, necesita configurar Tomcat como descrito en la documentación. Sé que Tomcat puede parecer complicado, pero en realidad es muy simple. Y Google conoce las respuestas a todo lo que pueda ser necesario en el proceso.

Ejecutando Camunda usando Tomcat

La última alternativa es configurar Tomcat usted mismo e instalar Camunda en él. siguiendo la descripción de instalación. Esto le dará la opción de utilizar la versión de Tomcat que prefiera o instalarla como un servicio de Windows, por ejemplo.

Lanzamiento de Camunda a producción

Por lo general, esto requerirá una configuración final para ejecutar Camunda. Hay pautas en Camunda que describen esto con gran detalle, pero no las abordaré en este artículo; solo nombraré un ejemplo: la API REST de la distribución no está configurada para la autenticación de forma predeterminada. Quizás quieras cambiar esto.

Resumen

Como puedes ver, es muy fácil comenzar con Camunda, independientemente del idioma que estés usando. El punto clave es que toda la interacción se realiza a través de la API REST. La instalación también es bastante sencilla, especialmente cuando se utiliza Docker.

Fuente: habr.com

Añadir un comentario