Përdorimi i Camunda për orkestrim të lehtë bazuar në REST dhe Motorin e rrjedhës së punës (pa Java)

Përshëndetje, Habr! Unë paraqes në vëmendjen tuaj një përkthim të artikullit "Përdorni Camunda si një motor orkestrimi dhe rrjedhje pune të lehtë për t'u përdorur me bazë REST (pa prekur Java)" nga Bernd Rücker.

07.07.2020/XNUMX/XNUMX, përkthim Artikull Bernd Rücker

Përdorimi i Camunda për orkestrim të lehtë bazuar në REST dhe Motorin e rrjedhës së punës (pa Java)

Unë shpesh diskutoj arkitekturën e mikroshërbimeve me njerëz jo Java: zhvilluesit e C#, Node.JS/JavaScript ose entuziastët e Golang. Të gjithë ata janë përballur me faktin se kanë nevojë për një motor orkestrimi në një arkitekturë mikroservice ose thjesht një mjet për të optimizuar rrjedhën e punës dhe për të fituar aftësinë për të porositur, për të trajtuar afatet, Sagën dhe transaksionet kompensuese.

Platforma BPM me burim i hapur nga Camunda e shkëlqyeshme për detyra të tilla. Mirëdashësia ndaj zhvilluesit është një nga karakteristikat kryesore të produktit. Por nëse shikoni dokumentacionin e tij, mund të keni përshtypjen se mirëdashësia e Camunda-s ka për qëllim kryesisht zhvilluesit e Java. Platforma ofron shumë mundësi për të lidhur funksionet dhe shtesat tuaja, por gjithçka bëhet në Java. A është me të vërtetë?

Jo! Në fakt, ju mund ta ekzekutoni lehtë Camunda pa ndonjë njohuri Java dhe të konfiguroni arkitekturën për të koduar në çdo gjuhë që dëshironi. Në këtë artikull do të shikojmë:

  • arkitektura bazë;
  • REST API;
  • këshilla për bibliotekat ekzistuese të klientëve për gjuhë të tjera përveç Java;
  • shembull i përdorimit të C# dhe Node.JS;
  • mënyra për të ekzekutuar serverin Camunda (Docker ose Tomcat).

Arkitekturë

Camunda është shkruar në Java dhe kërkon një makinë virtuale Java (JVM) për të ekzekutuar. Camunda ofron një API REST që ju lejon të shkruani në çdo gjuhë që ju pëlqen dhe të përdorni REST me Camunda:

Përdorimi i Camunda për orkestrim të lehtë bazuar në REST dhe Motorin e rrjedhës së punës (pa Java)

Rrjedhat e punës në Camunda përcaktohen në BPMN, i cili në thelb është një skedar XML. Mund të modelohet duke përdorur Camunda Modeler.

Drejtimi i Camunda përmes një imazhi të para-ndërtuar Docker

Mënyra më e lehtë për të drejtuar Camunda është të përdorni Docker. Mënyrat alternative për të drejtuar Camunda përshkruhen më vonë në këtë artikull.

Përdorimi i Camunda për orkestrim të lehtë bazuar në REST dhe Motorin e rrjedhës së punës (pa Java)

Në këtë rast, thjesht ekzekutoni:

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

Ju nuk duhet të shqetësoheni për Linux, Java Virtual Machines ose Tomcats. Dockerfiles dhe dokumentacioni bazë (për shembull, udhëzimet për t'u lidhur me bazat e të dhënave të kërkuara) janë në dispozicion në Github.

Nëse dëshironi të ekzekutoni Camunda Enterprise Edition, mund ta ndryshoni lehtësisht dockerfile.

Megjithatë, ka një dobësi për të përdorur Camunda duke përdorur Docker: do të përfundoni me një version të Tomcat që nuk përfshin gjithmonë rregullimet më të fundit. Për ta shmangur disi këtë, mund të krijoni vetë një imazh Docker bazuar në shpërndarjen e dëshiruar të Tomcat, siç tregohet në këtë shembull, ose të përdorni një nga zgjidhjet e përshkruara më poshtë.

Vendosja e një modeli procesi

Le të shohim një shembull duke përdorur shabllonin Saga për një rezervim klasik udhëtimi ku dëshironi të aktivizoni tre veprime me radhë dhe të kompensoni me hijeshi veprimet e suksesshme në rast të një dështimi të mëvonshëm. E paraqitur në formën BPMN, duket kështu:

Përdorimi i Camunda për orkestrim të lehtë bazuar në REST dhe Motorin e rrjedhës së punës (pa Java)

Tani mund të përdorni REST API për vendosjen e modelit të procesit. Le të themi se e keni ruajtur atë si trip.bpmn dhe keni drejtuar Camunda nëpërmjet Docker, kështu që ishte i disponueshëm në 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

Tani mund të vraposh raste të reja të rrjedhës së punës duke përdorur API-në REST dhe duke kaluar të dhënat që dëshironi të shihni si variabla të shembullit të rrjedhës së punës:

  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

Pyetja tjetër interesante është se si Camunda shkakton procedura si rezervimi i një makine? Camunda jo vetëm që mund të telefonojë menjëherë shërbimet (Push-Principle), duke përdorur disa të integruara lidhësit, por gjithashtu vendosni artikujt e punës në një lloj radhe të integruar. Më pas, punëtori mund të marrë artikujt e punës përmes REST, të kryejë punën dhe të raportojë përfundimin te Camunda (Parimi i tërheqjes).

Përdorimi i Camunda për orkestrim të lehtë bazuar në REST dhe Motorin e rrjedhës së punës (pa Java)

Pra, së pari ju duhet të bëni fetchAndLock (pasi punëtorët e tjerë mund të marrin detyra në të njëjtën kohë për të shkallëzuar sistemin):

  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

Atëherë thuaji Camundës punëtori ka përfunduar punën e tij (vini re se duhet të futni ID-në e detyrës së jashtme të marrë në kërkesën e parë):

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

Kjo është ajo - ju nuk keni nevojë për ndonjë Java deri më tani, apo jo? Dhe kjo është e mjaftueshme për të filluar!

Bibliotekat e klientëve

Thirrja e REST API është e lehtë në çdo gjuhë programimi. Në JavaScript është e përshtatshme ta bëni këtë duke përdorur JQuery, dhe në C# mund të përdorni System.Net.Http dhe Newtonsoft.Json. Por kjo do të marrë kohë. Kështu që ju mund të përdorni vetëm disa bibliotekë klientësh.

Aktualisht ekzistojnë disa biblioteka të gatshme të klientëve:

  • javascript: lidhje. Mbështetur nga Camunda;
  • Java: lidhje. Mbështetur nga Camunda;
  • C #:lidhje и lidhje. Të dyja këto projekte janë në një gjendje të ndërmjetme dhe praktikisht nuk kanë asnjë aktivitet, por mund të shërbejnë si një pikënisje e mirë;
  • PHP: lidhje nuk është një bibliotekë shumë e plotë dhe nuk përfshin ndryshimet më të fundit të API, por unë njoh projekte që e përdorin atë.

Me përjashtim të JavaScript dhe Java, bibliotekat e klientëve nuk janë pjesë e vetë produktit Camunda. Mos prisni që ata të mbështesin të gjitha veçoritë REST API të Camunda. Vetëm për shkak se një bibliotekë nuk ofron një veçori të caktuar nuk do të thotë se nuk është aty, kontrolloni gjithmonë API-në e Camunda REST. Projektet tipike përdorin bibliotekat si pikënisje dhe shabllon.

Shembull me C#

Duke përdorur bibliotekën e mësipërme të klientit, ne thjesht mund të shkruajmë:

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

Kodi burimor i plotë i punës mund të gjendet në internet: lidhje. Një shembull tjetër është në dispozicion në lidhje.

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

Më shumë informacion mund të gjeni në faqen e internetit github.com

Mënyra alternative për të filluar Camunda

Imazhi i personalizuar Docker me "Camunda standalone WAR"

Si një alternativë ndaj imazhit të para-ndërtuar Docker nga Camunda, mund të përgatisni vetë Tomcat (për shembull, bazuar në imazhet zyrtare të Docker Tomcat) dhe më pas të kopjoni Camunda në të si një nga të ashtuquajturat skedarë WAR.

Përdorimi i Camunda për orkestrim të lehtë bazuar në REST dhe Motorin e rrjedhës së punës (pa Java)

Nëse keni shumë kërkesa shtesë dhe mund të personalizoni një mjedis ndërtimi Java, mund të konfiguroni gjithashtu Camunda Standalone War. Vendosni një ndërtim Maven si në këta shembuj: ndërtoni Maven me konfigurim lufte ose montim Maven me mbivendosje.

Nisja e shpërndarjes Camunda Tomcat

Një tjetër mundësi është që thjesht të shkarkoni shpërndarjen Camunda Tomcat, ta çzipni dhe ta ekzekutoni. Për ta bërë këtë, ju duhet vetëm Java Runtime Environment (JRE) e instaluar në kompjuterin tuaj. Mund të jetë lehtësisht shkarkoni nga këtu.

Përdorimi i Camunda për orkestrim të lehtë bazuar në REST dhe Motorin e rrjedhës së punës (pa Java)

Për të ndryshuar bazën e të dhënave ose për të bërë ndonjë gjë tjetër, duhet të konfiguroni Tomcat like të përshkruara në dokumentacion. E di që Tomcat mund të duket i ndërlikuar, por në fakt është shumë i thjeshtë. Dhe Google ka përgjigjet për gjithçka që ju nevojitet gjatë procesit.

Vrapimi i Camunda duke përdorur Tomcat

Alternativa e fundit është të konfiguroni vetë Tomcat dhe të instaloni Camunda në të, duke ndjekur përshkrimin e instalimit. Kjo do t'ju japë mundësinë të përdorni çdo version të Tomcat që preferoni, ose, për shembull, ta instaloni atë si një shërbim Windows.

Nisja e Camunda në prodhim

Në mënyrë tipike, kjo do t'ju kërkojë të bëni disa konfigurime përfundimtare për të funksionuar Camunda. Camunda ka udhëzime që e përshkruajnë këtë në detaje, por unë nuk do t'i prek ato në këtë artikull - do të jap vetëm një shembull: API REST i shpërndarjes nuk është konfiguruar për vërtetim si parazgjedhje. Ju mund të dëshironi ta ndryshoni këtë.

Përmbledhje

Siç mund ta keni vënë re, fillimi me Camunda është shumë i lehtë, pavarësisht nga gjuha që përdorni. Pika kryesore është se i gjithë komunikimi bëhet përmes API-së REST. Instalimi është gjithashtu mjaft i thjeshtë, veçanërisht kur përdorni Docker.

Burimi: www.habr.com

Shto një koment