„Camunda“ naudojimas lengvam orkestravimui, pagrįstam REST ir „Workflow Engine“ (be „Java“)

Sveiki, Habr! Jūsų dėmesiui pristatau straipsnio vertimą „Naudokite Camunda kaip lengvai naudojamą REST orkestravimo ir darbo eigos variklį (neliesdami Java)“ pateikė Bernd Rücker.

07.07.2020-XNUMX-XNUMX, vertimas Straipsnis Berndas Ruckeris

„Camunda“ naudojimas lengvam orkestravimui, pagrįstam REST ir „Workflow Engine“ (be „Java“)

Aš dažnai diskutuoju apie mikro paslaugų architektūrą su ne Java žmonėmis: C# kūrėjais, Node.JS/JavaScript kūrėjais arba Golang entuziastais. Visi jie susiduria su tuo, kad jiems reikalingas orkestravimo mechanizmas mikro paslaugų architektūroje arba tiesiog įrankis, skirtas supaprastinti darbo eigą ir įgyti galimybę užsisakyti, tvarkyti skirtąjį laiką, Saga ir kompensacines operacijas.

BPM platforma su atviro kodo iš Camunda puikiai tinka tokioms užduotims. Patogumas kūrėjams yra viena iš pagrindinių produkto savybių. Tačiau pažvelgus į jos dokumentaciją gali susidaryti įspūdis, kad „Camunda“ „draugiškumas“ daugiausia skirtas „Java“ kūrėjams. Platformoje yra daug galimybių prijungti savo funkcijas ir plėtinius, tačiau visa tai daroma „Java“. Ar tikrai?

Ne! Tiesą sakant, galite lengvai paleisti „Camunda“ be jokių „Java“ žinių ir nustatyti kodo architektūrą bet kuria pasirinkta kalba. Šiame straipsnyje apžvelgsime:

  • pagrindinė architektūra;
  • REST API
  • konsultacijos dėl esamų klientų bibliotekų kitomis kalbomis nei Java;
  • pavyzdys naudojant C# ir Node.JS;
  • būdų, kaip paleisti „Camunda“ serverį („Docker“ arba „Tomcat“).

Architektūra

„Camunda“ yra parašyta „Java“ ir jai reikia „Java“ virtualios mašinos (JVM). „Camunda“ teikia REST API, leidžiančią rašyti bet kokia jums patinkančia kalba ir naudoti REST su „Camunda“:

„Camunda“ naudojimas lengvam orkestravimui, pagrįstam REST ir „Workflow Engine“ (be „Java“)

„Camunda“ darbo eigos yra apibrėžtos BPMN, kuri iš esmės yra XML failas. Galima modeliuoti su Camunda modeliuotoja.

„Camunda“ paleidimas naudojant iš anksto sukurtą „Docker“ vaizdą

Lengviausias būdas paleisti „Camunda“ yra naudoti „Docker“. Alternatyvūs Camunda paleidimo būdai aprašyti vėliau šiame straipsnyje.

„Camunda“ naudojimas lengvam orkestravimui, pagrįstam REST ir „Workflow Engine“ (be „Java“)

Tokiu atveju tiesiog paleiskite:

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

Jums nereikia jaudintis dėl Linux, JVM ar Tomcats. Dockerfailus ir pagrindinę dokumentaciją (pavyzdžiui, prisijungimo prie reikalingų duomenų bazių nurodymus) rasite adresu GitHub.

Jei norite paleisti „Camunda Enterprise Edition“, galite lengvai pakeisti dockerfile.

Tačiau „Camunda“ paleidimas su „Docker“ turi vieną minusą: gausite „Tomcat“ versiją, kuri ne visada apima naujausius pataisymus. Norėdami tai išspręsti, galite sukurti savo Docker vaizdą pagal pageidaujamą Tomcat paskirstymą, kaip parodyta šiame pavyzdyje, arba naudoti vieną iš toliau aprašytų sprendimų.

Proceso modelio diegimas

Pažvelkime į klasikinio kelionės užsakymo Saga šablono pavyzdį, kai norite suaktyvinti tris veiksmus iš eilės ir maloniai kompensuoti sėkmingai atliktus veiksmus, jei vėliau įvyktų nesėkmė. Pavaizduota BPMN forma, ji atrodo taip:

„Camunda“ naudojimas lengvam orkestravimui, pagrįstam REST ir „Workflow Engine“ (be „Java“)

Dabar galite naudoti REST API proceso modeliui diegti. Tarkime, kad išsaugojote jį kaip trip.bpmn ir paleidžiate „Camunda“ per „Docker“, kad jis būtų pasiekiamas „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

Dabar galite bėgti naujų darbo eigos atvejų naudodami REST API ir perduoti duomenis, kuriuos norite matyti kaip darbo eigos egzempliorių kintamuosius:

  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

Kitas įdomus klausimas: kaip „Camunda“ atlieka tokias procedūras kaip automobilio užsakymas? „Camunda“ gali ne tik iš karto paskambinti tarnyboms („Push-Principle“), naudodama kai kuriuos įtaisytus įrenginius jungtys, bet ir darbo daiktus sudėti į savotišką įmontuotą tvarką. Tada darbuotojas gali pasiimti darbo elementus per REST, atlikti darbą ir nurodyti Camundai užbaigti (traukimo principas).

„Camunda“ naudojimas lengvam orkestravimui, pagrįstam REST ir „Workflow Engine“ (be „Java“)

Taigi pirmiausia reikia įvykdyti fetchAndLock (nes kiti darbuotojai gali gauti užduotis tuo pačiu metu, kad padidintų sistemos mastelį):

  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

Tada pasakykite tai Camundai darbuotojas baigė darbą (atminkite, kad turite įvesti išorinės užduoties ID, gautą pirmoje užklausoje):

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

Tai viskas – jums vis dar neprireikė jokios „Java“, tiesa? Ir to pakanka pradėti!

Klientų bibliotekos

Iškviesti REST API lengva bet kuria programavimo kalba. „JavaScript“ programoje tai patogiai atliekama naudojant JQuery, o C# – naudojant System.Net.Http ir Newtonsoft.Json. Bet tai užtruks. Taigi galite tiesiog naudoti tam tikrą kliento biblioteką.

Šiuo metu yra kelios paruoštos klientų bibliotekos:

  • „JavaScript“: nuoroda. Palaiko Camunda;
  • Java: nuoroda. Palaiko Camunda;
  • C #:nuoroda и nuoroda. Abu šie projektai yra tarpinės būklės ir praktiškai neveikiantys, tačiau gali būti geras atspirties taškas;
  • PHP: nuoroda – ne per daug pilna ir neapima naujausių API pakeitimų, bet žinau projektų, kuriuose tai naudojama.

Išskyrus JavaScript ir Java, klientų bibliotekos nėra paties Camunda produkto dalis. Nesitikėkite, kad jie palaikys visas Camunda REST API funkcijas. Tai, kad biblioteka neteikia tam tikros funkcijos, nereiškia, kad jos nėra, visada patikrinkite Camunda REST API. Referenciniuose projektuose bibliotekos naudojamos kaip atskaitos taškas ir šablonas.

C# pavyzdys

Naudodami aukščiau pateiktą kliento biblioteką, galime tiesiog parašyti:

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

Visiškai veikiantį šaltinio kodą galima rasti internete: nuoroda. Kitas pavyzdys pateikiamas adresu nuoroda.

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

Daugiau informacijos rasite tinklalapyje github.com

Alternatyvūs Camunda paleidimo būdai

Pasirinktinis „Docker“ vaizdas su „Camunda autonominiu karu“

Kaip alternatyvą iš anksto sukurtam „Camunda“ „Docker“ vaizdui, galite patys paruošti „Tomcat“ (pavyzdžiui, remiantis oficialiais „Docker Tomcat“ vaizdais) ir nukopijuoti „Camunda“ į jį kaip vieną iš vadinamųjų WAR failų.

„Camunda“ naudojimas lengvam orkestravimui, pagrįstam REST ir „Workflow Engine“ (be „Java“)

Jei turite daug papildomų reikalavimų ir galite nustatyti „Java“ kūrimo aplinką, taip pat galite nustatyti „Camunda Standalone war“. Sukurkite „Maven“ versiją, kaip parodyta šiuose pavyzdžiuose: „build“. Maven su karo konfigūracija arba surinkimas Maven su perdanga.

Pradedamas „Camunda Tomcat“ platinimas

Kita galimybė yra tiesiog atsisiųsti „Camunda Tomcat“ platinimą, išpakuoti jį ir paleisti. Tam reikia tik jūsų kompiuteryje įdiegtos Java Runtime Environment (JRE). Tai gali būti lengvai parsisiųsti iš čia.

„Camunda“ naudojimas lengvam orkestravimui, pagrįstam REST ir „Workflow Engine“ (be „Java“)

Norėdami pakeisti duomenų bazę ar ką nors kita, turite sukonfigūruoti Tomcat kaip aprašyta dokumentacijoje. Žinau, kad Tomcat gali skambėti sudėtingai, bet iš tikrųjų tai labai paprasta. Ir „Google“ žino atsakymus į viską, ko gali prireikti šiame procese.

„Camunda“ paleidimas naudojant „Tomcat“.

Paskutinė alternatyva yra pačiam nustatyti „Tomcat“ ir įdiegti „Camunda“, vadovaudamiesi diegimo aprašymu. Tai suteiks jums galimybę naudoti bet kurią Tomcat versiją arba įdiegti ją kaip, pavyzdžiui, „Windows“ paslaugą.

Camunda gamybos pradžia

Paprastai norint paleisti „Camunda“ reikės tam tikros galutinės sąrankos. „Camunda“ yra gairės, kurios tai labai išsamiai aprašo, tačiau šiame straipsnyje į jas nesigilinsiu – paminėsiu tik vieną pavyzdį: platinimo REST API pagal nutylėjimą nėra sukonfigūruota autentifikavimui. Galbūt norėsite tai pakeisti.

Apibendrinimas

Kaip matote, pradėti naudotis „Camunda“ labai lengva, nepaisant vartojamos kalbos. Svarbiausia yra tai, kad visa sąveika atliekama naudojant REST API. Diegimas taip pat yra gana paprastas, ypač naudojant „Docker“.

Šaltinis: www.habr.com

Добавить комментарий