Hej, Habr! Jag presenterar översĂ€ttningen av artikeln författare Bernd RĂŒcker.
07.07.2020, översĂ€ttning Bernd RĂŒcker

Jag diskuterar ofta mikroservicarkitektur med personer som Àr lÄngt ifrÄn Java: utvecklare av C#, Node.JS/JavaScript eller anhÀngare av Golang. De konfronteras alla med behovet av en orkestreringsmekanism i mikroservicarkitekturen eller helt enkelt ett verktyg för att optimera arbetsflödet och hantera ordningar, tidouts, Saga och kompensations-transaktioner.
BPM-plattform med passar utmĂ€rkt för sĂ„dana uppgifter. UtvecklarvĂ€nlighet Ă€r en av produktens nyckelfunktioner. Men om man tittar pĂ„ dokumentationen kan det verka som att Camundas «vĂ€nlighet» frĂ€mst riktar sig till Java-utvecklare. Plattformen erbjuder mĂ„nga möjligheter att koppla egna funktioner och tillĂ€gg, men allt detta görs pĂ„ Java. Ăr det verkligen sĂ„?
Nej! Faktum Àr att man enkelt kan köra Camunda utan nÄgra kunskaper om Java och stÀlla in arkitekturen för kod pÄ vilket sprÄk man vill. I den hÀr artikeln kommer vi att gÄ igenom:
- grundlÀggande arkitektur;
- REST API;
- tips om befintliga klientbibliotek för sprÄk som inte Àr Java;
- exempel pÄ anvÀndning av C# och Node.JS;
- sÀtt att köra Camunda-servern (Docker eller Tomcat).
Arkitektur
Camunda Àr skriven i Java och krÀver en Java Virtual Machine (JVM) för att köras. Camunda tillhandahÄller ett REST API, vilket gör att du kan anvÀnda vilket sprÄk du vill och anvÀnda REST med Camunda:

Arbetsflöden i Camunda definieras i BPMN, vilket huvudsakligen Àr en XML-fil. Det kan modelleras med hjÀlp av .
Köra Camunda via en förkonstruerad Docker-bild
Det enklaste sÀttet att köra Camunda Àr att anvÀnda Docker. Alternativa sÀtt att köra Camunda beskrivs lÀngre fram i denna artikel.

I det hÀr fallet rÀcker det att helt enkelt köra:
docker run -d -p 8080:8080 camunda/camunda-bpm-platform:latest
Du behöver inte oroa dig för Linux, Java Virtual Machines eller Tomcats. Dockerfiler och grundlÀggande dokumentation (till exempel hur man kopplar till lÀmpliga databaser) finns tillgÀngliga pÄ .
Om du vill köra Camunda Enterprise Edition kan du enkelt Àndra .
Det finns dock en nackdel med att köra Camunda med Docker: du fÄr en version av Tomcat som inte alltid innehÄller de senaste patcharna. För att kringgÄ detta kan du skapa en Docker-image baserad pÄ den version av Tomcat du behöver, som visas i det hÀr exemplet, eller anvÀnda nÄgon av de lösningar som beskrivs nedan.
Distribution av processmodell
LÄt oss övervÀga ett exempel, dÀr vi anvÀnder Saga-mallen för klassisk resebokning, dÀr vi vill kalla tre ÄtgÀrder i följd och korrekt kompensera för de framgÄngsrikt genomförda ÄtgÀrderna vid senare fel. NÀr den presenteras i BPMN-form ser den ut sÄ hÀr:

Nu kan du anvÀnda . Anta att du har sparat den med namnet trip.bpmn och kört Camunda via Docker sÄ att den Àr tillgÀnglig 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 starta via REST API och skicka in de data du vill se som instansvariabler:
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
NÀsta intressanta frÄga: hur anropar Camunda procedurer som bilbokningar? Camunda kan inte bara omedelbart anropa tjÀnster (Push-Princip), utan ocksÄ placera arbetsobjekt i en slags inbyggd kö. DÀrefter kan en worker hÀmta arbetsobjekten via REST, utföra jobbet och rapportera tillbaka till Camunda nÀr det Àr klart (Pull-Princip). , utan ocksÄ placera arbetsuppgifter i en sorts inbyggd kö. Efter detta kan en worker hÀmta arbetsuppgifterna via REST, utföra arbetet och informera Camunda om att arbetet Àr slutfört (Pull-Princip).

SÄ först mÄste du utföra (eftersom andra workers kan fÄ uppgifter samtidigt för att skala 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
BerÀtta sedan för Camunda att (notera att du mÄste ange ID:t för den externa uppgiften som erhölls i den första förfrÄgan):
curl
-H "Content-Type: application/json"
-X POST
-d '{"workerId":"worker123", "variables": {}}'
http://localhost:8080/engine-rest/external-task/EXTERNAL_TASK_ID/complete
Detta Ă€r allt â du har fortfarande inte behövt nĂ„gon Java, eller hur? Och det Ă€r tillrĂ€ckligt för att komma igĂ„ng!
Klientbibliotek
Att anropa REST API Àr enkelt pÄ vilket programmeringssprÄk som helst. I JavaScript görs det lÀtt med JQuery, medan i C# anvÀnds System.Net.Http och Newtonsoft.Json. Men det tar lite tid. DÀrför kan du istÀllet anvÀnda nÄgot klientbibliotek.
För nÀrvarande finns det flera fÀrdiga klientbibliotek:
- JavaScript: . Camunda stöds;
- Java: . Camunda stöds;
- C#: och . BÄda dessa projekt Àr i ett mellanlÀge och Àr nÀstan inaktiva, men kan fungera som en bra utgÄngspunkt;
- PHP: â ett inte heltĂ€ckande och inte uppdaterat bibliotek, men jag kĂ€nner till projekt som anvĂ€nder det.
Förutom JavaScript och Java ingÄr klientbibliotek inte i sjÀlva Camunda-produkt. FörvÀnta dig inte att de kommer att stödja alla funktioner i Camunda REST API. Om biblioteket inte tillhandahÄller en viss funktion betyder det inte att den inte finns, kontrollera alltid Camunda REST API. Typiska projekt anvÀnder bibliotek som utgÄngspunkt och mall.
Exempel med C#
Genom att anvÀnda det ovan nÀmnda klientbiblioteket kan vi enkelt skriva:
var camunda = new CamundaEngineClient("http://localhost:8080/engine-rest/engine/default/", null, null);
// Ladda upp BPMN XML-filen frÄn resurserna
camunda.RepositoryService.Deploy("trip-booking", new ListDen fullstÀndiga kÀllkoden kan hittas online: . Ett annat exempel finns pÄ adressen .
ĐŃĐžĐŒĐ”Ń Ń 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 + " - tillagt nÄgot";
callback(null, {
variables: {
someNewData: someNewData
}
});
});
workers.shutdown();
Mer information finns pÄ webbplatsen
Alternativa sÀtt att starta Camunda
Anpassad Docker-bild med "Camunda standalone WAR"
Som ett alternativ till den fÀrdiga Docker-bilden frÄn Camunda kan du sjÀlv förbereda Tomcat (till exempel baserat pÄ de officiella Docker Tomcat-bilderna) och sedan kopiera in Camunda som en av de sÄ kallade WAR-filerna.

Om du har mÄnga ytterligare krav och kan konfigurera Java-byggmiljön, kan du Àven konfigurera Camunda Standalone WAR. Konfigurera Maven-bygg som i dessa exempel: bygg eller bygg .
Kör Camunda-distributionen med Tomcat
Ett annat alternativ Àr att helt enkelt ladda ner Camunda Tomcat-distributionen, packa upp den och köra den. För detta behövs endast Java Runtime Environment (JRE), installerat pÄ din dator. Det gÄr enkelt att .

För att Àndra databasen eller göra nÄgot annat mÄste du konfigurera Tomcat, som . Jag vet att Tomcat kan verka komplicerat, men det Àr faktiskt vÀldigt enkelt. Och Google kÀnner till svaren pÄ allt som kan behövas under processen.
Kör Camunda med Tomcat
Det sista alternativet Àr att sjÀlv konfigurera Tomcat och installera Camunda i den, . Det ger möjlighet att anvÀnda vilken version av Tomcat du vill, eller till exempel installera den som en Windows-tjÀnst.
Kör Camunda i produktion
I allmĂ€nhet kommer det att vara nödvĂ€ndigt att göra viss slutkonfiguration för att köra Camunda. Camunda har rekommendationer som beskriver detta i detalj, men jag kommer inte att ta upp dem i denna artikel â jag nĂ€mner bara ett exempel: REST API för distributionen Ă€r som standard inte konfigurerad för autentisering. Du kanske vill Ă€ndra detta.
Avslutande tankar
Som du kanske har mÀrkt Àr det mycket enkelt att börja arbeta med Camunda, oavsett vilket sprÄk du anvÀnder. Huvudpunkten Àr att all interaktion sker via REST API. Installationen Àr ocksÄ ganska enkel, sÀrskilt nÀr du anvÀnder Docker.
KĂ€lla: habr.com
