Hej, Habr! Jeg præsenterer for jer oversættelsen af artiklen forfatter Bernd Rücker.
07.07.2020, oversættelse Bernd Rücker

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 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:

Arbejdsgange i Camunda defineres i BPMN, som primært er en XML-fil. Den kan modelleres med .
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.

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å .
Hvis du vil køre Camunda Enterprise Edition, kan du nemt ændre .
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:

Nu kan du bruge . 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 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). , 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).

Så først skal du udføre 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 (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: . Camunda understøttes;
- Java: . Camunda understøttes;
- C#: og . Begge disse projekter er i en mellemtilstand og er stort set inaktive, men de kan tjene som et godt udgangspunkt;
- PHP: — 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 ListDen fuldt fungerende kildekode kan findes online: . Et andet eksempel er tilgængeligt på .
Пример с 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
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.

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 eller build .
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 .

For at ændre databasen eller gøre noget andet skal du konfigurere Tomcat, som . 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, . 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
