Hej, Habr! Jag presenterar för din uppmĂ€rksamhet en översĂ€ttning av artikeln av Bernd RĂŒcker.
07.07.2020/XNUMX/XNUMX, översĂ€ttning Bernd RĂŒcker

Jag diskuterar ofta mikrotjÀnstarkitektur med icke-Java-personer: C#, Node.JS/JavaScript-utvecklare eller Golang-entusiaster. Alla stÀlls inför det faktum att de behöver en orkestreringsmotor i en mikrotjÀnstarkitektur eller bara ett verktyg för att optimera arbetsflödet och fÄ möjlighet att bestÀlla, hantera timeouts, Saga och kompensera transaktioner.
BPM-plattform med bra för sĂ„dana uppgifter. UtvecklarvĂ€nlighet Ă€r en av produktens nyckelegenskaper. Men om man tittar pĂ„ dess dokumentation kan man fĂ„ intrycket att Camundas vĂ€nlighet frĂ€mst riktar sig till Java-utvecklare. Plattformen ger mĂ„nga möjligheter att koppla ihop dina egna funktioner och tillĂ€gg, men allt görs i Java. Ăr det verkligen?
Nej! Faktum Àr att du enkelt kan köra Camunda utan nÄgon Java-kunskap och konfigurera arkitekturen för att koda pÄ valfritt sprÄk. I den hÀr artikeln kommer vi att titta pÄ:
- grundlÀggande arkitektur;
- REST API;
- rÄd om befintliga klientbibliotek för andra sprÄk Àn Java;
- exempel pÄ anvÀndning av C# och Node.JS;
- sÀtt att köra Camunda-server (Docker eller Tomcat).
Arkitektur
Camunda Àr skrivet i Java och krÀver en Java Virtual Machine (JVM) för att köras. Camunda tillhandahÄller ett REST API som lÄter dig skriva pÄ vilket sprÄk du vill och anvÀnda REST med Camunda:

Arbetsflöden i Camunda definieras i BPMN, som i grunden Àr en XML-fil. Den kan modelleras med hjÀlp av .
Kör Camunda via en förbyggd 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 den hÀr artikeln.

I det hÀr fallet kör du bara:
docker run -d -p 8080:8080 camunda/camunda-bpm-platform:latest
Du behöver inte oroa dig för Linux, virtuella Java-maskiner eller Tomcats. Dockerfiler och grundlÀggande dokumentation (som instruktioner för att ansluta till de nödvÀndiga databaserna) finns tillgÀngliga pÄ .
Om du vill köra Camunda Enterprise Edition kan du enkelt byta .
Det finns dock en nackdel med att köra Camunda med Docker: du kommer att fÄ en version av Tomcat som inte alltid innehÄller de senaste korrigeringarna. För att komma runt detta pÄ nÄgot sÀtt kan du sjÀlv skapa en Docker-bild baserat pÄ den önskade Tomcat-distributionen, som visas i det hÀr exemplet, eller anvÀnda nÄgon av lösningarna som beskrivs nedan.
Installera en processmodell
LÄt oss titta pÄ ett exempel med Saga-mallen för en klassisk resebokning dÀr du vill utlösa tre ÄtgÀrder i rad och graciöst kompensera framgÄngsrika ÄtgÀrder vid ett senare misslyckande. Presenterat i BPMN-form ser det ut sÄ hÀr:

Nu kan du anvÀnda . LÄt oss sÀga att du sparade den som trip.bpmn och körde Camunda via Docker sÄ att den var 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/creat
Nu kan du springa anvÀnder REST API och skickar de data du vill se som arbetsflödesinstansvariabler:
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 Àr hur utlöser Camunda procedurer som att boka en bil? Camunda kan inte bara omedelbart ringa tjÀnster (Push-Principle), med hjÀlp av vissa inbyggda , men ocksÄ lÀgga arbetsartiklar i en slags inbyggd kö. Arbetaren kan sedan ta emot arbetsobjekt via REST, utföra arbetet och rapportera slutförandet till Camunda (Pull-Principle).

SÄ först mÄste du göra (eftersom andra arbetare 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
SÀg det sedan till Camunda (observera att du mÄste ange det externa uppgifts-ID som togs emot i den första begÀran):
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 allt - du har inte behövt nÄgon Java Àn sÄ lÀnge, eller hur? Och det rÀcker för att komma igÄng!
Klientbibliotek
Att anropa REST API Àr enkelt i alla programmeringssprÄk. I JavaScript Àr det bekvÀmt att göra detta med JQuery, och i C# kan du anvÀnda System.Net.Http och Newtonsoft.Json. Men det hÀr kommer att ta tid. SÄ du kan bara anvÀnda nÄgot klientbibliotek.
Det finns för nÀrvarande flera fÀrdiga klientbibliotek tillgÀngliga:
- javascript: . Med stöd av Camunda;
- Java: . Med stöd av Camunda;
- C #: О . BÄda dessa projekt Àr i ett mellanlÀge och har praktiskt taget ingen aktivitet, men kan fungera som en bra utgÄngspunkt;
- PHP: Àr inte ett sÀrskilt komplett bibliotek och inkluderar inte de senaste API-Àndringarna, men jag kÀnner till projekt som anvÀnder det.
Med undantag för JavaScript och Java Àr klientbibliotek inte en del av sjÀlva Camunda-produkten. FörvÀnta dig inte att de ska stödja alla funktioner i Camundas REST API. Bara för att ett bibliotek inte tillhandahÄller en viss funktion betyder det inte att det inte finns dÀr, kolla alltid Camunda REST API. Typiska projekt anvÀnder bibliotek som utgÄngspunkt och mall.
Exempel med C#
Med hjÀlp av ovanstÄende klientbibliotek kan vi helt enkelt skriva:
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", "..." }
});
FullstÀndig fungerande kÀllkod kan hittas online: . Ett annat exempel finns pÄ .
Exempel 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();
Mer information finns pÄ hemsidan
Alternativa sÀtt att starta Camunda
Anpassad Docker-bild med "Camunda fristÄende WAR"
Som ett alternativ till den förbyggda Docker-bilden frÄn Camunda kan du förbereda Tomcat sjÀlv (till exempel baserat pÄ de officiella Docker Tomcat-bilderna) och sedan kopiera Camunda in i den som en av de sÄ kallade WAR-filerna.

Om du har mÄnga ytterligare krav och kan anpassa en Java-byggmiljö kan du ocksÄ konfigurera Camunda FristÄende krig. Konfigurera ett Maven-bygge som i dessa exempel: bygg eller montering .
Lanserar Camunda Tomcat-distributionen
Ett annat alternativ Àr att helt enkelt ladda ner Camunda Tomcat-distributionen, packa upp den och köra den. För att göra detta behöver du bara Java Runtime Environment (JRE) installerad pÄ din dator. Det kan vara lÀtt .

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 har svaren pÄ allt du kan behöva under processen.
Kör Camunda med Tomcat
Det sista alternativet Àr att konfigurera Tomcat sjÀlv och installera Camunda i den, Detta ger dig möjlighet att anvÀnda vilken version av Tomcat du föredrar, eller till exempel installera den som en tjÀnst. Windows.
Lansering av Camunda i produktion
Vanligtvis kommer detta att krĂ€va att du gör nĂ„gra slutliga instĂ€llningar för att fĂ„ Camunda igĂ„ng. Camunda har riktlinjer som beskriver detta i detalj, men jag kommer inte att beröra dem i den hĂ€r artikeln â jag ska bara ge ett exempel: distributionens REST API Ă€r inte konfigurerat för autentisering som standard. Du kanske vill Ă€ndra detta.
Summering
Som du kanske har mÀrkt Àr det vÀldigt enkelt att komma igÄng med Camunda, oavsett vilket sprÄk du anvÀnder. Det viktiga Àr att all kommunikation sker via REST API. Installationen Àr ocksÄ ganska enkel, speciellt nÀr du anvÀnder Docker.
KĂ€lla: will.com
