Ús de Camunda per a una fàcil orquestració basada en REST i Workflow Engine (sense Java)

Hola Habr! Presento a la vostra atenció la traducció de l'article "Utilitzeu Camunda com a motor d'orquestració i flux de treball basat en REST fàcil d'utilitzar (sense tocar Java)" de Bernd Rücker.

07.07.2020/XNUMX/XNUMX, traducció Article Bernd Rücker

Ús de Camunda per a una fàcil orquestració basada en REST i Workflow Engine (sense Java)

Sovint parlo d'arquitectura de microserveis amb persones que no són de Java: desenvolupadors de C#, Node.JS/JavaScript o entusiastes de Golang. Tots ells s'enfronten al fet que necessiten un motor d'orquestració en una arquitectura de microservei o només una eina per optimitzar el flux de treball i obtenir la capacitat d'ordenar, gestionar temps d'espera, Saga i compensar transaccions.

Plataforma BPM amb codi obert de Camunda genial per a aquestes tasques. La facilitat per als desenvolupadors és una de les característiques clau del producte. Però si mireu la seva documentació, podeu tenir la impressió que l'amabilitat de Camunda està dirigida principalment als desenvolupadors de Java. La plataforma ofereix moltes oportunitats per connectar les vostres pròpies funcions i extensions, però tot es fa en Java. És realment?

No! De fet, podeu executar fàcilment Camunda sense cap coneixement de Java i configurar l'arquitectura per codificar en qualsevol idioma que trieu. En aquest article veurem:

  • arquitectura bàsica;
  • API REST;
  • assessorament sobre biblioteques de clients existents per a idiomes diferents de Java;
  • exemple d'ús de C# i Node.JS;
  • maneres d'executar el servidor Camunda (Docker o Tomcat).

arquitectura

Camunda està escrit en Java i requereix una màquina virtual Java (JVM) per funcionar. Camunda ofereix una API REST que us permet escriure en qualsevol idioma que vulgueu i utilitzar REST amb Camunda:

Ús de Camunda per a una fàcil orquestració basada en REST i Workflow Engine (sense Java)

Els fluxos de treball a Camunda es defineixen a BPMN, que és bàsicament un fitxer XML. Es pot modelar utilitzant Camunda Modeladora.

Execució de Camunda mitjançant una imatge de Docker preconstruïda

La manera més senzilla d'executar Camunda és utilitzar Docker. Més endavant en aquest article es descriuen maneres alternatives d'executar Camunda.

Ús de Camunda per a una fàcil orquestració basada en REST i Workflow Engine (sense Java)

En aquest cas, només cal executar:

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

No us haureu de preocupar per Linux, les màquines virtuals Java o els Tomcats. Dockerfiles i documentació bàsica (per exemple, instruccions per connectar-se a les bases de dades necessàries) estan disponibles a Github.

Si voleu executar Camunda Enterprise Edition, podeu canviar fàcilment Dockerfile.

Tanmateix, hi ha un inconvenient a executar Camunda amb Docker: acabareu amb una versió de Tomcat que no sempre inclou les últimes correccions. Per evitar-ho d'alguna manera, podeu crear vosaltres mateixos una imatge de Docker basada en la distribució de Tomcat desitjada, tal com es mostra en aquest exemple, o utilitzar una de les solucions que es descriuen a continuació.

Implantació d'un model de procés

Vegem un exemple amb la plantilla Saga per a una reserva de viatge clàssica on voleu activar tres accions seguides i compensar amb gràcia les accions reeixides en cas d'un error posterior. Presentat en forma BPMN, té aquest aspecte:

Ús de Camunda per a una fàcil orquestració basada en REST i Workflow Engine (sense Java)

Ara pots utilitzar API REST per al desplegament de models de procés. Suposem que l'has desat com a trip.bpmn i has executat Camunda a través de Docker perquè estigués disponible a 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

Ara pots córrer noves instàncies de flux de treball utilitzant l'API REST i passant les dades que voleu veure com a variables d'instància del flux de treball:

  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 següent pregunta interessant és com activa Camunda procediments com la reserva d'un cotxe? Camunda no només pot trucar immediatament als serveis (principi Push), utilitzant alguns serveis integrats connectors, però també posa els elements de treball en una mena de cua integrada. Aleshores, el treballador pot rebre elements de treball a través de REST, realitzar el treball i informar de la finalització a Camunda (principi de tirada).

Ús de Camunda per a una fàcil orquestració basada en REST i Workflow Engine (sense Java)

Així que primer cal fer-ho fetchAndLock (ja que altres treballadors poden rebre tasques al mateix temps per 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

Aleshores digues-ho a Camunda treballador ha acabat la seva feina (tingueu en compte que heu d'introduir l'ID de la tasca externa rebuda a la primera sol·licitud):

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

Això és tot: no heu necessitat cap Java fins ara, oi? I amb això n'hi ha prou per començar!

Biblioteques client

Trucar a l'API REST és fàcil en qualsevol llenguatge de programació. En JavaScript és convenient fer-ho amb JQuery, i en C# podeu utilitzar System.Net.Http i Newtonsoft.Json. Però això portarà temps. Així que només podeu utilitzar alguna biblioteca client.

Actualment hi ha diverses biblioteques de clients preparades disponibles:

  • JavaScript: enllaç. Amb el suport de Camunda;
  • Java: enllaç. Amb el suport de Camunda;
  • C #:enllaç и enllaç. Tots dos projectes es troben en un estat intermedi i pràcticament no tenen activitat, però poden servir de bon punt de partida;
  • PHP: enllaç no és una biblioteca molt completa i no inclou els darrers canvis de l'API, però conec projectes que l'utilitzen.

Amb l'excepció de JavaScript i Java, les biblioteques de client no formen part del propi producte Camunda. No espereu que admetin totes les funcions de l'API REST de Camunda. El fet que una biblioteca no proporcioni una funció determinada no vol dir que no hi sigui, comproveu sempre l'API REST de Camunda. Els projectes típics utilitzen biblioteques com a punt de partida i plantilla.

Exemple amb C#

Utilitzant la biblioteca client anterior, podem escriure simplement:

  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 codi font de treball complet es pot trobar en línia: enllaç. Un altre exemple està disponible a enllaç.

Exemple amb 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();

Es pot trobar més informació al web Github.com

Maneres alternatives d'iniciar Camunda

Imatge de Docker personalitzada amb "Camunda standalone WAR"

Com a alternativa a la imatge de Docker preconstruïda de Camunda, podeu preparar Tomcat vosaltres mateixos (per exemple, basant-vos en les imatges oficials de Docker Tomcat) i després copiar-hi Camunda com un dels anomenats fitxers WAR.

Ús de Camunda per a una fàcil orquestració basada en REST i Workflow Engine (sense Java)

Si teniu molts requisits addicionals i podeu personalitzar un entorn de compilació Java, també podeu configurar la guerra independent de Camunda. Configureu una compilació Maven com en aquests exemples: build Maven amb configuració de guerra o muntatge Maven amb Overlay.

Llançament de la distribució Camunda Tomcat

Una altra opció és simplement descarregar la distribució Camunda Tomcat, descomprimir-la i executar-la. Per fer-ho, només necessiteu el Java Runtime Environment (JRE) instal·lat al vostre ordinador. Pot ser fàcilment descarregar des d'aquí.

Ús de Camunda per a una fàcil orquestració basada en REST i Workflow Engine (sense Java)

Per canviar la base de dades o fer qualsevol altra cosa, heu de configurar Tomcat com descrit a la documentació. Sé que Tomcat pot semblar complicat, però en realitat és molt senzill. I Google té les respostes a tot el que necessiteu durant el procés.

Execució de Camunda amb Tomcat

L'última alternativa és configurar Tomcat tu mateix i instal·lar-hi Camunda, seguint la descripció de la instal·lació. Això us donarà l'oportunitat d'utilitzar qualsevol versió de Tomcat que preferiu o, per exemple, instal·lar-lo com a servei de Windows.

Llançament de Camunda en producció

Normalment, això requerirà que feu una configuració final per fer funcionar Camunda. Camunda té directrius que ho descriuen amb gran detall, però no les tocaré en aquest article; només posaré un exemple: l'API REST de la distribució no està configurada per a l'autenticació per defecte. És possible que vulgueu canviar això.

Resum

Com haureu notat, començar amb Camunda és molt fàcil, independentment de l'idioma que utilitzeu. El punt clau és que tota la comunicació es fa a través de l'API REST. La instal·lació també és bastant senzilla, especialment quan s'utilitza Docker.

Font: www.habr.com

Afegeix comentari