Brug af Camunda til nem orkestrering baseret på REST og Workflow Engine (ingen Java)

Hej Habr! Jeg præsenterer for din opmærksomhed oversættelsen af ​​artiklen "Brug Camunda som en letanvendelig REST-baseret orkestrerings- og workflow-motor (uden at røre Java)" af Bernd Rücker.

07.07.2020/XNUMX/XNUMX, oversættelse Artikel Bernd Rucker

Brug af Camunda til nem orkestrering baseret på REST og Workflow Engine (ingen Java)

Jeg diskuterer ofte mikroservicearkitektur med ikke-Java-folk: C#-udviklere, Node.JS/JavaScript-udviklere eller Golang-aficionados. Alle står de over for, at de har brug for en orkestreringsmekanisme i en mikroservicearkitektur eller blot et værktøj til at strømline arbejdsgangen og få mulighed for at bestille, håndtere timeouts, Saga og kompenserende transaktioner.

BPM platform med open source fra Camunda fantastisk til sådanne opgaver. Udviklervenlighed er en af ​​produktets nøglefunktioner. Men hvis man ser på dens dokumentation, får man måske indtryk af, at Camundas "venlighed" hovedsageligt er rettet mod Java-udviklere. Platformen giver en masse muligheder for at forbinde dine egne funktioner og udvidelser, men det hele foregår i Java. Er det virkelig?

Ingen! Faktisk kan du nemt køre Camunda uden Java-kendskab og opsætte arkitekturen til kode på et hvilket som helst sprog efter eget valg. I denne artikel vil vi se på:

  • grundlæggende arkitektur;
  • REST API
  • rådgivning om eksisterende klientbiblioteker for andre sprog end Java;
  • eksempel ved hjælp af C# og Node.JS;
  • måder at starte Camunda-serveren på (Docker eller Tomcat).

arkitektur

Camunda er skrevet i Java og har brug for en Java Virtual Machine (JVM) for at køre. Camunda leverer en REST API, der giver dig mulighed for at skrive på ethvert sprog, du kan lide, og bruge REST med Camunda:

Brug af Camunda til nem orkestrering baseret på REST og Workflow Engine (ingen Java)

Arbejdsgange i Camunda er defineret i BPMN, som grundlæggende er en XML-fil. Den kan modelleres med Camunda Modeler.

At køre Camunda gennem et forudbygget Docker-billede

Den nemmeste måde at køre Camunda på er at bruge Docker. Alternative måder at starte Camunda på er beskrevet senere i denne artikel.

Brug af Camunda til nem orkestrering baseret på REST og Workflow Engine (ingen Java)

I dette tilfælde skal du blot køre:

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

Du behøver ikke bekymre dig om Linux, JVM'er eller Tomcats. Dockerfiler og grundlæggende dokumentation (for eksempel instruktioner til at oprette forbindelse til de nødvendige databaser) er tilgængelige på Github.

Hvis du vil køre Camunda Enterprise Edition, kan du nemt ændre Dockerfil.

At køre Camunda med Docker har dog én ulempe: du ender med en version af Tomcat, der ikke altid inkluderer de seneste rettelser. For at omgå dette kan du oprette dit eget Docker-billede baseret på den ønskede Tomcat-distribution, som vist i dette eksempel, eller bruge en af ​​løsningerne beskrevet nedenfor.

Implementering af procesmodel

Lad os se på et eksempel ved at bruge Saga-skabelonen til en klassisk rejsebooking, hvor du vil udløse tre handlinger i træk og elegant kompensere for succesfulde handlinger i tilfælde af en senere fiasko. Repræsenteret i BPMN-form ser det sådan ud:

Brug af Camunda til nem orkestrering baseret på REST og Workflow Engine (ingen Java)

Nu kan du bruge REST API til procesmodelimplementering. Lad os sige, at du gemmer det som trip.bpmn og kører Camunda via Docker, så det er tilgængeligt på 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

Nu kan du løbe nye arbejdsgange ved at bruge REST API og videregive de data, du vil se som workflow-forekomstvariabler:

  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

Det næste interessante spørgsmål er: hvordan kalder Camunda procedurer som at bestille en bil? Camunda kan ikke kun ringe til tjenester med det samme (Push-Principle) ved hjælp af nogle indbyggede stik, men også sætte arbejdsemner i en slags indbygget rækkefølge. Arbejderen kan derefter hente arbejdsemner via REST, udføre arbejdet og bede Camunda om at fuldføre (Pull-Principle).

Brug af Camunda til nem orkestrering baseret på REST og Workflow Engine (ingen Java)

Så først skal du udføre henteAndLock (fordi andre arbejdere kan modtage opgaver på samme tid for at skalere systemet):

  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å sig det til Camunda arbejder udført arbejde (bemærk, at du skal indtaste det eksterne opgave-id, der blev modtaget i den første anmodning):

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

Det var det - du har stadig ikke haft brug for noget Java, vel? Og det er nok til at komme i gang!

Klientbiblioteker

Det er nemt at kalde en REST API i ethvert programmeringssprog. I JavaScript gøres dette bekvemt ved hjælp af JQuery og i C# ved hjælp af System.Net.Http og Newtonsoft.Json. Men det vil tage tid. Så du kan bare bruge et eller andet klientbibliotek.

I øjeblikket er flere færdige klientbiblioteker tilgængelige:

  • JavaScript: link. Støttet af Camunda;
  • Java: link. Støttet af Camunda;
  • C #:link и link. Begge disse projekter er i en mellemtilstand og praktisk talt i dvale, men kan tjene som et godt udgangspunkt;
  • PHP: link - ikke for komplet og inkluderer ikke de seneste API-ændringer, men jeg kender projekter, der bruger det.

Med undtagelse af JavaScript og Java er klientbibliotekerne ikke en del af selve Camunda-produktet. Forvent ikke, at de understøtter alle Camundas REST API-funktioner. Bare fordi et bibliotek ikke tilbyder en bestemt funktion, betyder det ikke, at det ikke er der, tjek altid Camundas REST API. Referenceprojekter bruger biblioteker som udgangspunkt og skabelon.

C# eksempel

Ved at bruge ovenstående klientbibliotek kan vi blot skrive:

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

Den fuldt fungerende kildekode kan findes online: link. Et andet eksempel findes på link.

Eksempel med 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();

Mere information kan findes på hjemmesiden github.com

Alternative måder at lancere Camunda på

Brugerdefineret Docker-billede med "Camunda standalone WAR"

Som et alternativ til et forudbygget Docker-billede fra Camunda kan du selv forberede Tomcat (f.eks. baseret på de officielle Docker Tomcat-billeder) og derefter kopiere Camunda ind i det som en af ​​de såkaldte WAR-filer.

Brug af Camunda til nem orkestrering baseret på REST og Workflow Engine (ingen Java)

Hvis du har mange yderligere krav og kan opsætte et Java-byggemiljø, kan du også opsætte Camunda Standalone war. Opsæt en Maven-bygning som i disse eksempler: build Maven med krigskonfiguration eller montering Maven med Overlay.

Starter Camunda Tomcat-distributionen

En anden mulighed er blot at downloade Camunda Tomcat-distributionen, pakke den ud og køre den. Dette kræver kun Java Runtime Environment (JRE) installeret på din computer. Det kan være nemt download herfra.

Brug af Camunda til nem orkestrering baseret på REST og Workflow Engine (ingen Java)

For at ændre databasen eller gøre noget andet, skal du konfigurere Tomcat som beskrevet i dokumentationen. Jeg ved, at Tomcat kan lyde kompliceret, men det er faktisk meget enkelt. Og Google kender svarene på alt, hvad der kan kræves i processen.

Kører Camunda ved hjælp af Tomcat

Det sidste alternativ er at konfigurere Tomcat selv og installere Camunda i den, efter installationsbeskrivelsen. Dette vil give dig mulighed for at bruge den version af Tomcat, du foretrækker, eller installere den som en Windows-tjeneste, for eksempel.

Lancering af Camunda i produktion

Dette vil normalt kræve en endelig opsætning for at køre Camunda. Der er retningslinjer i Camunda, som beskriver dette meget detaljeret, men jeg vil ikke komme ind på dem i denne artikel – jeg vil kun nævne ét eksempel: distributionens REST API er ikke konfigureret til godkendelse som standard. Du ønsker måske at ændre dette.

Opsummering

Som du kan se, er det meget nemt at komme i gang med Camunda, uanset hvilket sprog du bruger. Nøglepunktet er, at al interaktion sker gennem REST API. Installationen er også ret nem, især når du bruger Docker.

Kilde: www.habr.com

Tilføj en kommentar