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

Hej, Habr! Jeg præsenterer for jer oversættelsen af artiklen «Brug Camunda som en brugervenlig REST-baseret orkestrering og workflow-motor (uden at røre ved Java)» forfatter Bernd Rücker.

07.07.2020, oversættelse artikler Bernd Rücker

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

Jeg diskuterer ofte mikrotjenestearkitektur med folk, der ikke har meget kendskab til Java: udviklere af C#, Node.JS/JavaScript eller tilhængere af Golang. De står alle over for behovet for en orkestreringsmekanisme i mikrotjenestearkitektur eller blot et værktøj til at optimere workflow og skabe muligheder for sekvensering, timeoutbehandling, Saga og kompenserende transaktioner.

BPM-platform med åben kildekode fra Camunda er perfekt til sådanne opgaver. Udviklervenlighed er en af produktets nøglefunktioner. Men hvis man ser på dokumentationen, kan det give indtryk af, at Camundas primære 'venlighed' er rettet mod Java-udviklere. Platformen tilbyder mange muligheder for at tilslutte egne funktioner og udvidelser, men alt dette gøres i Java. Er det virkelig tilfældet?

Nej! Faktisk kan man nemt køre Camunda uden nogen Java-viden og justere arkitekturen til kode i ethvert sprog, man vælger. I denne artikel vil vi kigge på:

  • grundlæggende arkitektur;
  • REST API;
  • tips om eksisterende klientbiblioteker til sprog, der er forskellige fra Java;
  • eksempel på brug af C# og Node.JS;
  • metoder til at starte Camunda-serveren (Docker eller Tomcat).

Arkitektur

Camunda er skrevet i Java og kræver en Java Virtual Machine (JVM) for at køre. Camunda tilbyder et REST API, der giver dig mulighed for at skrive på ethvert sprog, du ønsker, og bruge REST med Camunda:

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

Arbejdsgange i Camunda defineres i BPMN, som primært er en XML-fil. Den kan modelleres med Camunda Modeler.

Kørsel af Camunda via et forudoprettet Docker-image

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

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

I dette tilfælde er det tilstrækkeligt blot at køre:

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

Du skal ikke bekymre dig om Linux, Java-virtuelle maskiner eller Tomcats. Dockerfiler og den grundlæggende dokumentation (for eksempel vejledningen 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 Dockerfile.

Dog ved, at der er en ulempe ved at køre Camunda med Docker: du får en version af Tomcat, som ikke altid inkluderer de nyeste rettelser. For at omgå dette kan du selv bygge et Docker-billede baseret på den ønskede Tomcat-distribution, som vist i dette eksempel, eller benytte en af de løsninger, der er beskrevet nedenfor.

Udrulning af procesmodel

Lad os se på et eksempel ved at bruge Saga-skabelonen til klassisk rejsebooking, hvor du ønsker at kalde tre handlinger i rækkefølge og korrekt kompensere de handlinger, der er udført med succes i tilfælde af en senere fejl. Præsenteret i BPMN-form ser det således ud:

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

Nu kan du bruge REST API til udrulning af procesmodel. Antag, at du har gemt den med navnet trip.bpmn og har kørt Camunda via Docker, så den er tilgængelig 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 "trip.bpmn=@trip.bpmn" 
http://localhost:8080/engine-rest/deployment/create

Nu kan du starte nye instanser af arbejdsprocessen ved hjælp af REST API og sende data, som du ønsker at se som variabler for arbejdsprocesinstansen:

  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: hvordan kalder Camunda procedurer som bilreservation? Camunda kan ikke kun straks kalde tjenester (Push-Princip), men også placere arbejdsopgaver i en slags indbygget rækkefølge. Derefter kan en worker hente arbejdsopgaver via REST, udføre arbejdet og rapportere til Camunda om afslutningen (Pull-Princip). connectors, men også placere arbejdsopgaver i en indbygget rækkefølge. Derefter kan en worker få arbejdsopgaver via REST, udføre arbejdet og informere Camunda om afslutningen (Pull-Princip).

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

Så først skal du udføre fetchAndLock da andre workers kan hente opgaver samtidigt 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

Derefter skal du informere Camunda om, at worker har afsluttet arbejdet (bemærk, at du skal indtaste ID'et for external task, som du modtog i den første forespørgsel):

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

Og det er det — du har stadig ikke haft brug for nogen Java, vel? Og det er nok til at komme i gang!

Klientbiblioteker

Det er let at kalde REST API'en i ethvert programmeringssprog. I JavaScript er det praktisk at bruge JQuery, mens du i C# kan anvende System.Net.Http og Newtonsoft.Json. Men dette kræver tid. Så du kan blot bruge et klientbibliotek.

På nuværende tidspunkt er der nogle tilgængelige klientbiblioteker:

  • JavaScript: link. Camunda understøttes;
  • Java: link. Camunda understøttes;
  • C#:link og link. Begge disse projekter er i en mellemtilstand og er stort set inaktive, men de kan tjene som et godt udgangspunkt;
  • PHP: link — et ikke helt fuldstændigt bibliotek, der ikke inkluderer de seneste ændringer i API'et, men jeg kender projekter, der bruger det.

Bortset fra JavaScript og Java er klientbiblioteker ikke en del af selve Camunda produktet. Forvent ikke, at de understøtter alle funktioner i Camunda REST API. Hvis et bibliotek ikke tilbyder en bestemt funktion, betyder det ikke, at den ikke findes, så tjek altid Camunda REST API. Typiske projekter bruger biblioteker som udgangspunkt og skabelon.

Eksempel med C#

Ved at bruge det ovennævnte klientbibliotek kan vi ganske enkelt skrive:

  var camunda = new CamundaEngineClient("http://localhost:8080/engine-rest/engine/default/", null, null);
  	// Udrul BPMN XML-filen fra ressourcerne
  camunda.RepositoryService.Deploy("trip-booking", new List {
        FileParameter.FromManifestResource(Assembly.GetExecutingAssembly(), "FlowingTripBookingSaga.Models.FlowingTripBookingSaga.bpmn")
     });
  
  	// Registrer arbejdere
  registerWorker("reserve-car", externalTask => {
    	// her kan du gøre den rigtige ting! Som en 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);
  });
  	// Registrer flere arbejdere...
  
  StartPolling();
  
  string processInstanceId = camunda.BpmnWorkflowService.StartProcessInstance("FlowingTripBookingSaga", new Dictionary()
    {
      {"someBookingData", "..." }
    });

Den fuldt fungerende kildekode kan findes online: link. Et andet eksempel er tilgængeligt på link.

Пример с 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 køre Camunda på

Brugerdefineret Docker-billede med 'Camunda standalone WAR'

Som alternativ til det færdige Docker-billede fra Camunda kan du selv forberede Tomcat (for eksempel baseret på de officielle Docker-billeder af Tomcat) og derefter kopiere Camunda ind som en af de såkaldte WAR-filer.

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

Hvis du har mange ekstra krav, og du kan tilpasse Java build-miljøet, kan du også opsætte Camunda Standalone WAR. Konfigurer Maven build, som i disse eksempler: build Maven med WAR-konfiguration eller build Maven med Overlay.

Kørsel af Camunda Tomcat distributionen

En anden mulighed er bare at downloade Camunda Tomcat distributionen, pakke den ud og køre den. Du skal kun have Java Runtime Environment (JRE) installeret på din computer. Det kan nemt downloades herfra.

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

For at ændre databasen eller gøre noget andet skal du konfigurere Tomcat, som beskrevet i dokumentationen. Jeg ved, at Tomcat kan virke komplekst, men det er faktisk meget enkelt. Og Google har svarene på alt, hvad du måtte have brug for undervejs.

Kørsel af Camunda ved hjælp af Tomcat

Den sidste alternative mulighed er selv at opsætte Tomcat og installere Camunda i den, ved at følge installationsbeskrivelsen. Det vil give dig mulighed for at bruge enhver version af Tomcat, du ønsker, eller for eksempel at installere den som en Windows-tjeneste.

Kørsel af Camunda i produktion

Normalt vil det være nødvendigt at foretage nogle endelige justeringer for at køre Camunda. Camunda har anbefalinger, der beskriver dette grundigt, men jeg vil ikke berøre dem i denne artikel — jeg vil kun nævne et eksempel: REST API'et i distributionen er som standard ikke konfigureret til godkendelse. Du ønsker muligvis at ændre dette.

Sammenfatning

Som du måske har bemærket, er det meget nemt at komme i gang med Camunda, uanset hvilket sprog du bruger. Det vigtigste punkt er, at al interaktion sker via REST API. Installation er også ret enkel, især når du bruger Docker.

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster