¡Hola, Habr! Les presento la traducción del artículo autor Bernd Rücker.
07.07.2020, traducción Bernd Rücker

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 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:

Los flujos de trabajo en Camunda se definen en BPMN, que es principalmente un archivo XML. Se puede modelar usando .
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.

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 .
Si deseas ejecutar Camunda Enterprise Edition, puedes cambiar fácilmente .
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í:

Ahora puede usar . 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 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, Entonces, primero necesita ejecutar

fetchAndLock 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 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: . Compatible con Camunda;
- Java: . Compatible con Camunda;
- C#: y . Ambos proyectos están en un estado intermedio y están prácticamente inactivos, pero pueden servir como un buen punto de partida;
- PHP: — 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 ListPuedes encontrar el código fuente completamente funcional en Internet: . Otro ejemplo está disponible en .
Пример с 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
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.

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 o construcción .
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 .

Para cambiar la base de datos o hacer algo más, deberá configurar Tomcat como se . 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, . 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
