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:
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.
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í:
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:
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).
Entonces primero necesitas ejecutar buscar y bloquear (porque otros trabajadores pueden recibir tareas al mismo tiempo para escalar el sistema):
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):
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:
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.
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.
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í.
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.