AnvÀnda Camunda för enkel orkestrering baserad pÄ REST och Workflow Engine (ingen Java)

Hej, Habr! Jag presenterar för din uppmĂ€rksamhet en översĂ€ttning av artikeln "AnvĂ€nd Camunda som en lĂ€ttanvĂ€nd REST-baserad orkestrerings- och arbetsflödesmotor (utan att röra Java)" av Bernd RĂŒcker.

07.07.2020/XNUMX/XNUMX, översĂ€ttning Artikel Bernd RĂŒcker

AnvÀnda Camunda för enkel orkestrering baserad pÄ REST och Workflow Engine (ingen Java)

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

AnvÀnda Camunda för enkel orkestrering baserad pÄ REST och Workflow Engine (ingen Java)

Arbetsflöden i Camunda definieras i BPMN, som i grunden Àr en XML-fil. Den kan modelleras med hjÀlp av Camunda Modeler.

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.

AnvÀnda Camunda för enkel orkestrering baserad pÄ REST och Workflow Engine (ingen Java)

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

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

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:

AnvÀnda Camunda för enkel orkestrering baserad pÄ REST och Workflow Engine (ingen Java)

Nu kan du anvÀnda REST API för implementering av processmodeller. 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 nya arbetsflödesinstanser 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 kontakter, 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).

AnvÀnda Camunda för enkel orkestrering baserad pÄ REST och Workflow Engine (ingen Java)

SÄ först mÄste du göra hÀmta AndLock (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 arbetare har avslutat sitt arbete (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: lĂ€nk. Med stöd av Camunda;
  • Java: lĂ€nk. Med stöd av Camunda;
  • C #:lĂ€nk Đž lĂ€nk. BĂ„da dessa projekt Ă€r i ett mellanlĂ€ge och har praktiskt taget ingen aktivitet, men kan fungera som en bra utgĂ„ngspunkt;
  • PHP: lĂ€nk Ă€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: lÀnk. Ett annat exempel finns pÄ lÀnk.

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 github.com

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.

AnvÀnda Camunda för enkel orkestrering baserad pÄ REST och Workflow Engine (ingen Java)

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 Maven med krigskonfiguration eller montering Maven med överlÀgg.

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

AnvÀnda Camunda för enkel orkestrering baserad pÄ REST och Workflow Engine (ingen Java)

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

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