Gebruik Camunda vir maklike orkestrasie gebaseer op REST en Workflow Engine (geen Java)

Haai Habr! Ek bied die vertaling van die artikel aan u aandag "Gebruik Camunda as 'n maklik-om-te gebruik REST-gebaseerde orkestrasie- en werkvloei-enjin (sonder om Java aan te raak)" deur Bernd Rücker.

07.07.2020/XNUMX/XNUMX, vertaling Artikel Bernd Rucker

Gebruik Camunda vir maklike orkestrasie gebaseer op REST en Workflow Engine (geen Java)

Ek bespreek dikwels mikrodiensargitektuur met nie-Java-mense: C#-ontwikkelaars, Node.JS/JavaScript-ontwikkelaars of Golang-liefhebbers. Almal van hulle word gekonfronteer met die feit dat hulle 'n orkestrasiemeganisme in 'n mikrodiensargitektuur nodig het, of net 'n instrument om die werkvloei te stroomlyn en die vermoë te verkry om te bestel, uitteltyd, Saga en kompenserende transaksies te hanteer.

BPM platform met oopbron van Camunda ideaal vir sulke take. Ontwikkelaarvriendelikheid is een van die belangrikste kenmerke van die produk. Maar as jy na die dokumentasie daarvan kyk, kry jy dalk die indruk dat Camunda se “vriendelikheid” hoofsaaklik op Java-ontwikkelaars gemik is. Die platform bied baie opsies om jou eie funksies en uitbreidings te koppel, maar dit word alles in Java gedoen. Is dit regtig?

Geen! Trouens, jy kan Camunda maklik hardloop sonder enige Java-kennis en die argitektuur vir kode in enige taal van jou keuse opstel. In hierdie artikel sal ons kyk na:

  • basiese argitektuur;
  • REST API
  • advies oor bestaande kliëntbiblioteke vir ander tale as Java;
  • voorbeeld deur C# en Node.JS te gebruik;
  • maniere om die Camunda-bediener (Docker of Tomcat) te begin.

Argitektuur

Camunda is in Java geskryf en benodig 'n Java Virtual Machine (JVM) om te loop. Camunda bied 'n REST API wat jou toelaat om te skryf in enige taal wat jy wil en REST met Camunda te gebruik:

Gebruik Camunda vir maklike orkestrasie gebaseer op REST en Workflow Engine (geen Java)

Werkstrome in Camunda word gedefinieer in BPMN, wat basies 'n XML-lêer is. Dit kan gemodelleer word met Camunda Modeler.

Om Camunda deur 'n voorafgeboude Docker-beeld te laat loop

Die maklikste manier om Camunda te bestuur, is om Docker te gebruik. Alternatiewe maniere om Camunda te begin word later in hierdie artikel beskryf.

Gebruik Camunda vir maklike orkestrasie gebaseer op REST en Workflow Engine (geen Java)

In hierdie geval, hardloop eenvoudig:

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

Jy hoef nie bekommerd te wees oor Linux, JVM's of Tomcats nie. Dockerfiles en basiese dokumentasie (byvoorbeeld instruksies om aan die vereiste databasisse te koppel) is beskikbaar by GitHub.

As jy Camunda Enterprise Edition wil gebruik, kan jy maklik verander dockerfile.

Om Camunda met Docker te bestuur het egter een nadeel: jy sal eindig met 'n weergawe van Tomcat wat nie altyd die nuutste regstellings insluit nie. Om dit te omseil, kan jy jou eie Docker-prent skep op grond van die verlangde Tomcat-verspreiding, soos in hierdie voorbeeld getoon, of gebruik een van die oplossings wat hieronder beskryf word.

Prosesmodel-ontplooiing

Kom ons kyk na 'n voorbeeld wat die Saga-sjabloon gebruik vir 'n klassieke reisbespreking waar jy drie aksies in 'n ry wil aktiveer en grasieus wil vergoed vir suksesvol voltooide aksies in geval van 'n latere mislukking. Verteenwoordig in BPMN-vorm, lyk dit soos volg:

Gebruik Camunda vir maklike orkestrasie gebaseer op REST en Workflow Engine (geen Java)

Nou kan jy gebruik REST API vir prosesmodel-ontplooiing. Kom ons sê jy stoor dit as trip.bpmn en hardloop Camunda via Docker sodat dit beskikbaar is op 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

Nou kan jy hardloop nuwe werkvloeigevalle gebruik die REST API en gee die data wat jy wil sien as werkvloei instansie veranderlikes deur:

  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

Die volgende interessante vraag is: hoe noem Camunda prosedures soos om 'n motor te bespreek? Camunda kan nie net dienste onmiddellik bel (Push-Principle) met behulp van 'n paar ingeboude nie koppelaars, maar plaas ook werkitems in 'n soort ingeboude volgorde. Die werker kan dan werkitems via REST gaan haal, die werk uitvoer en Camunda sê om te voltooi (Pull-Beginsel).

Gebruik Camunda vir maklike orkestrasie gebaseer op REST en Workflow Engine (geen Java)

So eers moet jy uitvoer haalEnLock (omdat ander werkers op dieselfde tyd take kan ontvang om die stelsel te skaal):

  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

Sê dit dan vir Camunda werker het werk voltooi (let daarop dat jy die eksterne taak-ID moet invoer wat in die eerste versoek ontvang is):

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

Dit is dit - jy het nog steeds geen Java nodig nie, reg? En dit is genoeg om te begin!

Kliëntbiblioteke

Om 'n REST API te bel is maklik in enige programmeertaal. In JavaScript word dit gerieflik gedoen met behulp van JQuery, en in C#, met System.Net.Http en Newtonsoft.Json. Maar dit sal tyd neem. So jy kan net een of ander kliënt biblioteek gebruik.

Op die oomblik is verskeie klaargemaakte kliëntbiblioteke beskikbaar:

  • javascript: skakel. Ondersteun deur Camunda;
  • Java: skakel. Ondersteun deur Camunda;
  • C #:skakel и skakel. Beide hierdie projekte is in 'n intermediêre toestand en feitlik dormant, maar kan as 'n goeie beginpunt dien;
  • PHP: skakel - nie te volledig nie en sluit nie die nuutste API-veranderinge in nie, maar ek ken projekte wat dit gebruik.

Met die uitsondering van JavaScript en Java, is die kliëntbiblioteke nie deel van die Camunda-produk self nie. Moenie verwag dat hulle al Camunda se REST API-kenmerke sal ondersteun nie. Net omdat 'n biblioteek nie 'n sekere funksie verskaf nie, beteken dit nie dat dit nie daar is nie, kyk altyd na Camunda se REST API. Verwysingsprojekte gebruik biblioteke as 'n beginpunt en sjabloon.

C# voorbeeld

Deur die bogenoemde kliëntbiblioteek te gebruik, kan ons eenvoudig skryf:

  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", "..." }
    });

Die volledig werkende bronkode kan aanlyn gevind word: skakel. Nog 'n voorbeeld is beskikbaar by skakel.

Voorbeeld met 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();

Meer inligting kan op die webwerf gevind word github.com

Alternatiewe maniere om Camunda te begin

Pasgemaakte Docker-beeld met "Camunda selfstandige WAR"

As alternatief vir 'n voorafgeboude Docker-prent van Camunda, kan jy Tomcat self voorberei (byvoorbeeld, gebaseer op die amptelike Docker Tomcat-beelde) en dan Camunda daarin kopieer as een van die sogenaamde WAR-lêers.

Gebruik Camunda vir maklike orkestrasie gebaseer op REST en Workflow Engine (geen Java)

As jy baie bykomende vereistes het en 'n Java-bou-omgewing kan opstel, kan jy ook Camunda Standalone-oorlog opstel. Stel 'n Maven-gebou op soos in hierdie voorbeelde: bou Maven met oorlog konfig of samestelling Maven met Overlay.

Begin die Camunda Tomcat-verspreiding

Nog 'n opsie is om eenvoudig die Camunda Tomcat-verspreiding af te laai, dit uit te pak en dit uit te voer. Dit vereis slegs die Java Runtime Environment (JRE) wat op jou rekenaar geïnstalleer is. Dit kan maklik wees laai van hier af.

Gebruik Camunda vir maklike orkestrasie gebaseer op REST en Workflow Engine (geen Java)

Om die databasis te verander of enigiets anders te doen, moet jy Tomcat instel soos beskryf in dokumentasie. Ek weet Tomcat mag dalk ingewikkeld klink, maar dit is eintlik baie eenvoudig. En Google ken die antwoorde op alles wat in die proses vereis mag word.

Hardloop Camunda met Tomcat

Die laaste alternatief is om Tomcat self op te stel en Camunda daarin te installeer, na aanleiding van die installasiebeskrywing. Dit sal jou die opsie gee om watter weergawe van Tomcat jy ook al verkies te gebruik, of dit byvoorbeeld as 'n Windows-diens te installeer.

Bekendstelling van Camunda in produksie

Dit sal gewoonlik 'n finale opstelling verg om Camunda te laat loop. Daar is riglyne in Camunda wat dit in groot besonderhede beskryf, maar ek gaan nie in hierdie artikel daarop in nie – ek noem net een voorbeeld: die verspreiding se REST API is nie by verstek opgestel vir verifikasie nie. Jy sal dit dalk wil verander.

Resume

Soos u kan sien, is dit baie maklik om met Camunda te begin, ongeag die taal wat u gebruik. Die sleutelpunt is dat alle interaksie deur die REST API gedoen word. Installasie is ook redelik maklik, veral as u Docker gebruik.

Bron: will.com

Voeg 'n opmerking