Usando Camunda para unha fácil orquestración baseada en REST e Workflow Engine (sen Java)

Ola Habr! Presento á súa atención a tradución do artigo "Use Camunda como un motor de fluxo de traballo e orquestración baseado en REST fácil de usar (sen tocar Java)" por Bernd Rücker.

07.07.2020/XNUMX/XNUMX, tradución Artigo Bernd Rucker

Usando Camunda para unha fácil orquestración baseada en REST e Workflow Engine (sen Java)

Adoito falar da arquitectura de microservizos con persoas que non son de Java: desenvolvedores de C#, desenvolvedores de Node.JS/JavaScript ou afeccionados a Golang. Todos eles enfróntanse ao feito de que necesitan un mecanismo de orquestración nunha arquitectura de microservizos, ou só unha ferramenta para axilizar o fluxo de traballo e gañar a capacidade de ordenar, xestionar tempo de espera, Saga e compensar transaccións.

Plataforma BPM con código aberto de Camunda xenial para este tipo de tarefas. A amabilidade dos desenvolvedores é unha das principais características do produto. Pero se miras a súa documentación, podes ter a impresión de que a "amistosa" de Camunda está dirixida principalmente aos desenvolvedores de Java. A plataforma ofrece moitas opcións para conectar as súas propias funcións e extensións, pero todo faise en Java. É realmente?

Non! De feito, pode executar facilmente Camunda sen ningún coñecemento de Java e configurar a arquitectura para o código en calquera idioma que elixa. Neste artigo, veremos:

  • arquitectura básica;
  • API REST
  • asesoramento sobre bibliotecas cliente existentes para linguaxes distintas de Java;
  • exemplo usando C# e Node.JS;
  • formas de iniciar o servidor Camunda (Docker ou Tomcat).

Arquitectura

Camunda está escrito en Java e necesita unha máquina virtual Java (JVM) para executarse. Camunda ofrece unha API REST que che permite escribir en calquera idioma que che guste e usar REST con Camunda:

Usando Camunda para unha fácil orquestración baseada en REST e Workflow Engine (sen Java)

Os fluxos de traballo en Camunda defínense en BPMN, que é basicamente un ficheiro XML. Pódese modelar con Camunda Modeladora.

Execución de Camunda a través dunha imaxe de Docker preconstruída

A forma máis sinxela de executar Camunda é usar Docker. Máis adiante neste artigo descríbense formas alternativas de lanzar Camunda.

Usando Camunda para unha fácil orquestración baseada en REST e Workflow Engine (sen Java)

Neste caso, simplemente executa:

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

Non tes que preocuparte por Linux, JVM ou Tomcats. Os ficheiros Docker e a documentación básica (por exemplo, instrucións para conectarse ás bases de datos necesarias) están dispoñibles en Github.

Se queres executar Camunda Enterprise Edition, podes cambiar facilmente dockerfile.

Non obstante, executar Camunda con Docker ten unha desvantaxe: acabarás cunha versión de Tomcat que non sempre inclúe as últimas correccións. Para solucionar isto, pode crear a súa propia imaxe de Docker baseada na distribución de Tomcat desexada, como se mostra neste exemplo, ou utilizar unha das solucións descritas a continuación.

Implementación do modelo de proceso

Vexamos un exemplo de uso do modelo de Saga para unha reserva de viaxe clásica onde quere activar tres accións seguidas e compensar con gracia as accións completadas con éxito en caso de fallo posterior. Representado en forma BPMN, ten o seguinte aspecto:

Usando Camunda para unha fácil orquestración baseada en REST e Workflow Engine (sen Java)

Agora podes usar API REST para a implantación de modelos de proceso. Digamos que o gardas como trip.bpmn e executas Camunda a través de Docker para que estea dispoñible 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

Agora podes correr novas instancias de fluxo de traballo usando a API REST e pasa os datos que queres ver como variables de instancia de fluxo de traballo:

  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

A seguinte pregunta interesante é: como chama Camunda a procedementos como reservar un coche? Camunda non só pode chamar aos servizos inmediatamente (principio Push) usando algúns integrados conectores, pero tamén poñer os elementos de traballo nunha especie de orde incorporada. A continuación, o traballador pode buscar elementos de traballo a través de REST, realizar o traballo e dicirlle a Camunda que o complete (principio de extracción).

Usando Camunda para unha fácil orquestración baseada en REST e Workflow Engine (sen Java)

Entón, primeiro cómpre executar fetchAndLock (porque outros traballadores poden recibir tarefas ao mesmo tempo para escalar o 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

Entón dille iso a Camunda traballador rematou o traballo (ten en conta que debe introducir o ID da tarefa externa recibida na primeira solicitude):

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

Iso é todo: aínda non necesitaches Java, non? E xa abonda para comezar!

Bibliotecas Cliente

Chamar unha API REST é fácil en calquera linguaxe de programación. En JavaScript, isto faise convenientemente usando JQuery, e en C#, usando System.Net.Http e Newtonsoft.Json. Pero isto levará tempo. Entón podes usar algunha biblioteca cliente.

Neste momento, hai dispoñibles varias bibliotecas de clientes preparadas:

  • javascript: Ligazón. Apoiado por Camunda;
  • Java: Ligazón. Apoiado por Camunda;
  • C #:Ligazón и Ligazón. Ambos proxectos atópanse nun estado intermedio e practicamente inactivo, pero poden servir de bo punto de partida;
  • PHP: Ligazón - non moi completo e non inclúe os últimos cambios na API, pero coñezo proxectos que o usan.

Con excepción de JavaScript e Java, as bibliotecas cliente non forman parte do propio produto Camunda. Non esperes que admitan todas as funcións da API REST de Camunda. O feito de que unha biblioteca non ofreza unha determinada función non significa que non estea, comprobe sempre a API REST de Camunda. Os proxectos de referencia utilizan as bibliotecas como punto de partida e modelo.

Exemplo C#

Usando a biblioteca cliente anterior, podemos simplemente 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", "..." }
    });

O código fonte que funciona completamente pódese atopar en liña: Ligazón. Outro exemplo está dispoñible en Ligazón.

Exemplo 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();

Pódese atopar máis información na páxina web github.com

Formas alternativas de lanzar Camunda

Imaxe de Docker personalizada con "Camunda standalone WAR"

Como alternativa a unha imaxe de Docker preconstruída de Camunda, pode preparar Tomcat vostede mesmo (por exemplo, baseándose nas imaxes oficiais de Docker Tomcat) e despois copiar Camunda nel como un dos chamados ficheiros WAR.

Usando Camunda para unha fácil orquestración baseada en REST e Workflow Engine (sen Java)

Se tes moitos requisitos adicionais e podes configurar un ambiente de compilación Java, tamén podes configurar a guerra independente de Camunda. Configura unha compilación de Maven como nestes exemplos: build Maven con configuración de guerra ou montaxe Maven con superposición.

Iniciando a distribución de Camunda Tomcat

Outra opción é simplemente descargar a distribución Camunda Tomcat, descomprimila e executala. Isto só require o Java Runtime Environment (JRE) instalado no teu ordenador. Pode ser facilmente descarga desde aquí.

Usando Camunda para unha fácil orquestración baseada en REST e Workflow Engine (sen Java)

Para cambiar a base de datos ou facer calquera outra cousa, debes configurar Tomcat como descrito na documentación. Sei que Tomcat pode parecer complicado, pero en realidade é moi sinxelo. E Google coñece as respostas a todo o que pode ser necesario no proceso.

Executar Camunda usando Tomcat

A última alternativa é configurar Tomcat ti mesmo e instalar Camunda nel, seguindo a descrición da instalación. Isto darache a opción de usar a versión de Tomcat que prefires ou instalalo como un servizo de Windows, por exemplo.

Lanzamento de Camunda en produción

Isto xeralmente requirirá algunha configuración final para executar Camunda. Existen pautas en Camunda que describen isto con moito detalle, pero non entrarei nelas neste artigo: só poñerei un exemplo: a API REST da distribución non está configurada para a autenticación por defecto. Quizais queiras cambiar isto.

Sumando a

Como podes ver, é moi sinxelo comezar con Camunda, independentemente do idioma que esteas a usar. O punto clave é que toda a interacción realízase a través da API REST. A instalación tamén é bastante sinxela, especialmente cando se usa Docker.

Fonte: www.habr.com

Engadir un comentario