AnvÀndning av Camunda för enkel orchestration baserat pÄ REST och Workflow Engine (utan Java)

Hej, Habr! Jag presenterar översĂ€ttningen av artikeln «AnvĂ€nd Camunda som en lĂ€ttanvĂ€nd REST-baserad orkestrerings- och arbetsflödesmotor (utan att röra vid Java)» författare Bernd RĂŒcker.

07.07.2020, översĂ€ttning artiklar Bernd RĂŒcker

AnvÀndning av Camunda för enkel orchestration baserat pÄ REST och Workflow Engine (utan Java)

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 öppen kĂ€llkod frĂ„n Camunda 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:

AnvÀndning av Camunda för enkel orchestration baserat pÄ REST och Workflow Engine (utan Java)

Arbetsflöden i Camunda definieras i BPMN, vilket huvudsakligen Àr en XML-fil. Det kan modelleras med hjÀlp av Camunda Modeler.

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.

AnvÀndning av Camunda för enkel orchestration baserat pÄ REST och Workflow Engine (utan Java)

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Ä Github.

Om du vill köra Camunda Enterprise Edition kan du enkelt Àndra Dockerfile.

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:

AnvÀndning av Camunda för enkel orchestration baserat pÄ REST och Workflow Engine (utan Java)

Nu kan du anvÀnda REST API för distribution av processmodell. 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 nya instanser av arbetsflödet 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). kopplingar, 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).

AnvÀndning av Camunda för enkel orchestration baserat pÄ REST och Workflow Engine (utan Java)

SÄ först mÄste du utföra fetchAndLock (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 worker har slutfört arbetet (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: lĂ€nk. Camunda stöds;
  • Java: lĂ€nk. Camunda stöds;
  • C#:lĂ€nk och lĂ€nk. BĂ„da dessa projekt Ă€r i ett mellanlĂ€ge och Ă€r nĂ€stan inaktiva, men kan fungera som en bra utgĂ„ngspunkt;
  • PHP: lĂ€nk — 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 List {
        FileParameter.FromManifestResource(Assembly.GetExecutingAssembly(), "FlowingTripBookingSaga.Models.FlowingTripBookingSaga.bpmn")
     });
  
  // Registrera arbetare
  registerWorker("reserve-car", externalTask => {
    // hÀr kan du göra det verkliga jobbet! Som en sysout :-)
    Console.WriteLine("Reserverar bil nu...");
    camunda.ExternalTaskService.Complete(workerId, externalTask.Id);
  });
  registerWorker("cancel-car", externalTask => {
    Console.WriteLine("Avbryter bilen nu...");
    camunda.ExternalTaskService.Complete(workerId, externalTask.Id);
  });
  registerWorker("book-hotel", externalTask => {
    Console.WriteLine("Reserverar hotell nu...");
    camunda.ExternalTaskService.Complete(workerId, externalTask.Id);
  });
  // Registrera fler arbetare...
  
  StartPolling();
  
  string processInstanceId = camunda.BpmnWorkflowService.StartProcessInstance("FlowingTripBookingSaga", new Dictionary()
    {
      {"someBookingData", "..." }
    });

Den fullstÀndiga kÀllkoden kan hittas online: lÀnk. Ett annat exempel finns pÄ adressen lÀnk.

ĐŸŃ€ĐžĐŒĐ”Ń€ с 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 github.com

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.

AnvÀndning av Camunda för enkel orchestration baserat pÄ REST och Workflow Engine (utan Java)

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 Maven med WAR-konfiguration eller bygg Maven med Overlay.

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 ladda ner hÀrifrÄn.

AnvÀndning av Camunda för enkel orchestration baserat pÄ REST och Workflow Engine (utan Java)

För att Àndra databasen eller göra nÄgot annat mÄste du konfigurera Tomcat, som beskrivet i dokumentationen. 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, genom att följa installationsbeskrivningen. 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

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster