A Camunda használata a REST és Workflow Engine alapú egyszerű hangszereléshez (Java nélkül)

Szia Habr! Figyelmébe ajánlom a cikk fordítását "Használja a Camundát egyszerűen használható REST-alapú hangszerelési és munkafolyamat-motorként (a Java érintése nélkül)" írta: Bernd Rücker.

07.07.2020., fordítás Cikk Bernd Rucker

A Camunda használata a REST és Workflow Engine alapú egyszerű hangszereléshez (Java nélkül)

Gyakran beszélek a mikroszolgáltatás-architektúráról nem Java-sokkal: C#-fejlesztőkkel, Node.JS/JavaScript-fejlesztőkkel vagy Golang-rajongókkal. Mindannyian szembesülnek azzal a ténnyel, hogy szükségük van egy hangszerelési mechanizmusra egy mikroszolgáltatási architektúrában, vagy csak egy olyan eszközre, amely racionalizálja a munkafolyamatot, és lehetővé teszi a rendelések, az időtúllépések, a Saga és a kompenzációs tranzakciók kezelését.

BPM platformmal nyílt forráskódú Camunda kiváló az ilyen feladatokra. A fejlesztőbarátság a termék egyik legfontosabb jellemzője. De ha megnézzük a dokumentációját, az a benyomásunk támadhat, hogy a Camunda „barátságossága” főként a Java fejlesztőket célozza meg. A platform számos lehetőséget kínál saját funkciók és bővítmények összekapcsolására, de mindez Java nyelven történik. Ez valóban?

Nem! Valójában könnyedén futtathatja a Camundát Java-ismeretek nélkül, és beállíthatja a kód architektúráját bármely választott nyelven. Ebben a cikkben megvizsgáljuk:

  • alapvető architektúra;
  • REST API
  • tanácsadás meglévő klienskönyvtárakkal kapcsolatban a Javatól eltérő nyelveken;
  • példa a C# és a Node.JS használatával;
  • a Camunda szerver indításának módjai (Docker vagy Tomcat).

építészet

A Camunda Java nyelven íródott, és futtatásához Java virtuális gépre (JVM) van szüksége. A Camunda REST API-t biztosít, amely lehetővé teszi, hogy bármilyen nyelven írjon, és használja a REST-et a Camundával:

A Camunda használata a REST és Workflow Engine alapú egyszerű hangszereléshez (Java nélkül)

A Camunda munkafolyamatait BPMN-ben határozzák meg, amely alapvetően egy XML-fájl. Ezzel lehet modellezni Camunda modellező.

A Camunda futtatása egy előre elkészített Docker-képen keresztül

A Camunda futtatásának legegyszerűbb módja a Docker használata. A Camunda elindításának alternatív módjait a cikk későbbi részében ismertetjük.

A Camunda használata a REST és Workflow Engine alapú egyszerű hangszereléshez (Java nélkül)

Ebben az esetben egyszerűen futtassa:

  docker run -d -p 8080:8080 camunda/camunda-bpm-platform:latest

Nem kell aggódnia a Linux, a JVM vagy a Tomcat miatt. A Docker-fájlok és az alapvető dokumentációk (például a szükséges adatbázisokhoz való kapcsolódási utasítások) a címen érhetők el GitHub.

Ha a Camunda Enterprise Editiont szeretné futtatni, könnyen módosíthatja dockerfile.

A Camunda Dockerrel való futtatásának azonban van egy hátránya: a végén a Tomcat olyan verzióját kapja, amely nem mindig tartalmazza a legújabb javításokat. Ennek megkerüléséhez létrehozhat saját Docker-képet a kívánt Tomcat-eloszlás alapján, amint az ebben a példában látható, vagy használhatja az alább ismertetett megoldások egyikét.

Folyamatmodell bevezetése

Nézzünk egy példát a Saga sablon használatára egy klasszikus utazási foglaláshoz, ahol egymás után három műveletet kíván elindítani, és későbbi hiba esetén kecsesen kompenzálni a sikeresen végrehajtott műveleteket. BPMN formában ábrázolva így néz ki:

A Camunda használata a REST és Workflow Engine alapú egyszerű hangszereléshez (Java nélkül)

Most már használhatod REST API a folyamatmodell üzembe helyezéséhez. Tegyük fel, hogy elmented trip.bpmn néven, és a Camundát a Dockeren keresztül futtatod, így elérhető a localhost:8080:

  curl -w "n" 
-H "Accept: application/json" 
-F "deployment-name=trip" 
-F "enable-duplicate-filtering=true" 
-F "deploy-changed-only=true" 
-F "[email protected]" 
http://localhost:8080/engine-rest/deployment/creat

Most már futhatsz új munkafolyamat-példányok a REST API használatával, és adja át a munkafolyamat-példányváltozókként látni kívánt adatokat:

  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

A következő érdekes kérdés: hogyan hívja le a Camunda az olyan eljárásokat, mint az autófoglalás? A Camunda nem csak a szolgáltatásokat tudja azonnal hívni (Push-Principle) valamilyen beépített funkció segítségével csatlakozók, hanem egyfajta beépített rendbe is rakja a munkadarabokat. A dolgozó ezután lekérheti a munkaelemeket a REST-en keresztül, elvégezheti a munkát, és megmondhatja Camundának, hogy fejezze be (Pull-Principle).

A Camunda használata a REST és Workflow Engine alapú egyszerű hangszereléshez (Java nélkül)

Tehát először végre kell hajtani fetchAndLock (mivel más dolgozók is kaphatnak feladatokat egyidejűleg a rendszer méretezéséhez):

  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

Akkor mondd el Camundának munkás befejezte a munkát (vegye figyelembe, hogy meg kell adnia az első kérésben kapott külső feladatazonosítót):

  curl 
-H "Content-Type: application/json" 
-X POST 
-d <!-- -->'{"workerId":"worker123", "variables": {}}'<!-- --> 
http://localhost:8080/engine-rest/<!-- -->external-task/EXTERNAL_TASK_ID/complete

Ennyi – még mindig nem volt szüksége Java-ra, igaz? És ez elég is az induláshoz!

Ügyfélkönyvtárak

A REST API meghívása bármely programozási nyelven egyszerű. JavaScriptben ez kényelmesen megtehető a JQuery használatával, C#-ban pedig a System.Net.Http és a Newtonsoft.Json használatával. De ehhez idő kell. Tehát csak néhány ügyfélkönyvtárat használhat.

Jelenleg számos kész ügyfélkönyvtár áll rendelkezésre:

  • javascript: link. Camunda támogatásával;
  • Jáva: link. Camunda támogatásával;
  • C #:link и link. Mindkét projekt köztes állapotban van, gyakorlatilag szunnyad, de jó kiindulópontként szolgálhat;
  • PHP: link - nem túl teljes, és nem tartalmazza a legújabb API-módosításokat, de ismerek olyan projekteket, amelyek ezt használják.

A JavaScript és a Java kivételével az ügyfélkönyvtárak nem részei magának a Camunda terméknek. Ne várja el tőlük, hogy támogassák a Camunda REST API összes funkcióját. Az, hogy egy könyvtár nem biztosít egy bizonyos funkciót, nem jelenti azt, hogy nincs is, mindig ellenőrizze a Camunda REST API-ját. A referenciaprojektek könyvtárakat használnak kiindulási pontként és sablonként.

C# példa

A fenti klienskönyvtár használatával egyszerűen a következőket írhatjuk:

  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", "..." }
    });

A teljesen működő forráskód megtalálható az interneten: link. Egy másik példa a címen érhető el link.

Példa a Node.js-re

  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();

További információk a weboldalon találhatók github.com

A Camunda elindításának alternatív módjai

Egyéni Docker-kép a „Camunda standalone WAR” funkcióval

A Camunda előre elkészített Docker-képének alternatívájaként elkészítheti saját maga a Tomcat-ot (például a hivatalos Docker Tomcat képek alapján), majd az úgynevezett WAR-fájlok közé másolhatja bele a Camundát.

A Camunda használata a REST és Workflow Engine alapú egyszerű hangszereléshez (Java nélkül)

Ha sok további követelménye van, és be tud állítani egy Java build környezetet, akkor beállíthatja a Camunda Standalone war alkalmazást is. Állítson be egy Maven buildet, mint az alábbi példákban: build Maven háborús konfigurációval vagy összeszerelés Maven Overlay-vel.

A Camunda Tomcat disztribúció indítása

Egy másik lehetőség a Camunda Tomcat disztribúció letöltése, kicsomagolása és futtatása. Ehhez csak a számítógépére telepített Java Runtime Environment (JRE) szükséges. Könnyen lehet letöltés innen.

A Camunda használata a REST és Workflow Engine alapú egyszerű hangszereléshez (Java nélkül)

Az adatbázis megváltoztatásához vagy bármi máshoz konfigurálnia kell a Tomcatet dokumentációban leírtak. Tudom, hogy a Tomcat bonyolultnak hangzik, de valójában nagyon egyszerű. A Google pedig mindenre tudja a választ, amire a folyamat során szükség lehet.

Camunda futtatása Tomcat segítségével

Az utolsó alternatíva az, hogy saját maga állítja be a Tomcat-ot, és telepíti bele a Camundát, a telepítési leírást követve. Ez lehetőséget ad arra, hogy a Tomcat bármelyik verzióját használja, vagy például Windows-szolgáltatásként telepítse.

A Camunda gyártásba helyezése

Ez általában némi végső beállítást igényel a Camunda futtatásához. A Camundában vannak irányelvek, amelyek ezt nagyon részletesen leírják, de ebben a cikkben nem térek ki rájuk – csak egy példát említek: a disztribúció REST API-ja alapértelmezés szerint nincs beállítva hitelesítésre. Érdemes lehet ezen változtatni.

Összefoglalás

Amint látja, nagyon könnyű elkezdeni a Camundát, függetlenül a használt nyelvtől. A lényeg az, hogy minden interakció a REST API-n keresztül történik. A telepítés is meglehetősen egyszerű, különösen a Docker használatakor.

Forrás: will.com

Hozzászólás