Camunda izmantošana vienkāršai orķestrēšanai, pamatojoties uz REST un Workflow Engine (bez Java)

Čau Habr! Piedāvāju jūsu uzmanībai raksta tulkojumu "Izmantojiet Camunda kā viegli lietojamu uz REST balstītu orķestrēšanas un darbplūsmas dzinēju (nepieskaroties Javai)" autors Bernds Rūkers.

07.07.2020., tulkojums Raksts Bernds Rukers

Camunda izmantošana vienkāršai orķestrēšanai, pamatojoties uz REST un Workflow Engine (bez Java)

Es bieži apspriežu mikropakalpojumu arhitektūru ar cilvēkiem, kas nav Java: C# izstrādātāji, Node.JS/JavaScript izstrādātāji vai Golang cienītāji. Viņi visi saskaras ar faktu, ka viņiem ir nepieciešams orķestrēšanas mehānisms mikropakalpojumu arhitektūrā vai vienkārši rīks, lai racionalizētu darbplūsmu un iegūtu iespēju pasūtīt, apstrādāt taimautus, Saga un kompensācijas darījumus.

BPM platforma ar atvērtais avots no Camunda lieliski piemērots šādiem uzdevumiem. Izstrādātājam draudzīgums ir viena no produkta galvenajām iezīmēm. Bet, ja paskatās uz tā dokumentāciju, var rasties iespaids, ka Camundas "draudzīgums" galvenokārt ir vērsts uz Java izstrādātājiem. Platforma nodrošina daudzas iespējas savu funkciju un paplašinājumu savienošanai, taču tas viss tiek darīts Java. Vai tiešām?

Nē! Faktiski jūs varat viegli palaist Camunda bez jebkādām Java zināšanām un iestatīt koda arhitektūru jebkurā jūsu izvēlētajā valodā. Šajā rakstā mēs apskatīsim:

  • pamata arhitektūra;
  • REST API
  • konsultācijas par esošajām klientu bibliotēkām valodām, kas nav Java;
  • piemēram, izmantojot C# un Node.JS;
  • veidi, kā startēt Camunda serveri (Docker vai Tomcat).

Arhitektūra

Camunda ir rakstīta Java valodā, un tās darbībai ir nepieciešama Java virtuālā mašīna (JVM). Camunda nodrošina REST API, kas ļauj rakstīt jebkurā valodā, kas jums patīk, un izmantot REST ar Camunda:

Camunda izmantošana vienkāršai orķestrēšanai, pamatojoties uz REST un Workflow Engine (bez Java)

Camunda darbplūsmas ir definētas BPMN, kas būtībā ir XML fails. To var modelēt ar Kamunda modelētāja.

Camundas palaišana, izmantojot iepriekš izveidotu Docker attēlu

Vienkāršākais veids, kā palaist Camunda, ir izmantot Docker. Alternatīvi veidi, kā palaist Camunda, ir aprakstīti vēlāk šajā rakstā.

Camunda izmantošana vienkāršai orķestrēšanai, pamatojoties uz REST un Workflow Engine (bez Java)

Šajā gadījumā vienkārši palaidiet:

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

Jums nav jāuztraucas par Linux, JVM vai Tomcats. Dockerfaili un pamatdokumentācija (piemēram, instrukcijas pieslēgšanai nepieciešamajām datu bāzēm) ir pieejamas vietnē GitHub.

Ja vēlaties palaist Camunda Enterprise Edition, varat to viegli mainīt Dockerfile.

Tomēr Camunda palaišanai ar Docker ir viens mīnuss: jūs iegūsit Tomcat versiju, kurā ne vienmēr ir iekļauti jaunākie labojumi. Lai to novērstu, varat izveidot savu Docker attēlu, pamatojoties uz vēlamo Tomcat izplatīšanu, kā parādīts šajā piemērā, vai izmantot kādu no tālāk aprakstītajiem risinājumiem.

Procesa modeļa ieviešana

Apskatīsim piemēru, izmantojot Saga veidni klasiskai ceļojuma rezervēšanai, kur vēlaties aktivizēt trīs darbības pēc kārtas un graciozi kompensēt veiksmīgi pabeigtas darbības vēlākas kļūmes gadījumā. Atveidots BPMN formā, tas izskatās šādi:

Camunda izmantošana vienkāršai orķestrēšanai, pamatojoties uz REST un Workflow Engine (bez Java)

Tagad jūs varat izmantot REST API procesa modeļa izvietošanai. Pieņemsim, ka saglabājat to kā trip.bpmn un palaižat Camunda, izmantojot Docker, lai tas būtu pieejams vietnē 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

Tagad jūs varat skriet jauni darbplūsmas gadījumi izmantojot REST API un nododiet datus, kurus vēlaties redzēt kā darbplūsmas gadījumu mainīgos:

  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ākamais interesantais jautājums ir: kā Camunda izsauc tādas procedūras kā automašīnas rezervēšana? Camunda var ne tikai nekavējoties izsaukt pakalpojumus (Push-Principle), izmantojot kādu iebūvētu savienotāji, bet arī sakārtot darba priekšmetus tādā kā iebūvētā kārtībā. Pēc tam darbinieks var atnest darba vienumus, izmantojot REST, veikt darbu un likt Camundai pabeigt (pievilkšanas princips).

Camunda izmantošana vienkāršai orķestrēšanai, pamatojoties uz REST un Workflow Engine (bez Java)

Tātad vispirms jums ir jāizpilda fetchAndLock (jo citi darbinieki vienlaikus var saņemt uzdevumus, lai palielinātu sistēmu):

  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

Tad pasaki to Kamundai strādnieks pabeidza darbu (Ņemiet vērā, ka jums jāievada ārējā uzdevuma ID, kas saņemts pirmajā pieprasījumā):

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

Tas arī viss - jums joprojām nav vajadzīga Java, vai ne? Un ar to pietiek, lai sāktu!

Klientu bibliotēkas

REST API izsaukšana ir vienkārša jebkurā programmēšanas valodā. JavaScript to var ērti izdarīt, izmantojot JQuery, un C#, izmantojot System.Net.Http un Newtonsoft.Json. Bet tas prasīs laiku. Tātad jūs varat vienkārši izmantot kādu klienta bibliotēku.

Šobrīd ir pieejamas vairākas gatavas klientu bibliotēkas:

  • JavaScript: saite. Atbalsta Camunda;
  • Java: saite. Atbalsta Camunda;
  • C #:saite и saite. Abi šie projekti ir vidējā stāvoklī un praktiski neaktivizējas, taču var kalpot kā labs sākumpunkts;
  • PHP: saite - nav pārāk pilnīga un neietver jaunākās API izmaiņas, bet es zinu projektus, kas to izmanto.

Klientu bibliotēkas, izņemot JavaScript un Java, nav paša Camunda produkta daļa. Negaidiet, ka tie atbalstīs visas Camundas REST API funkcijas. Tas, ka bibliotēka nenodrošina noteiktu funkciju, nenozīmē, ka tās nav, vienmēr pārbaudiet Camundas REST API. Atsauces projektos bibliotēkas tiek izmantotas kā sākumpunkts un veidne.

C# piemērs

Izmantojot iepriekš minēto klienta bibliotēku, mēs varam vienkārši uzrakstīt:

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

Pilnībā strādājošu avota kodu var atrast tiešsaistē: saite. Vēl viens piemērs ir pieejams vietnē saite.

Piemērs ar 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();

Plašāku informāciju var atrast tīmekļa vietnē github.com

Alternatīvi veidi, kā palaist Camunda

Pielāgots Docker attēls ar “Camunda standalone WAR”

Kā alternatīvu iepriekš izveidotajam Camundas Docker attēlam varat pats sagatavot Tomcat (piemēram, pamatojoties uz oficiālajiem Docker Tomcat attēliem) un pēc tam kopēt tajā Camunda kā vienu no tā sauktajiem WAR failiem.

Camunda izmantošana vienkāršai orķestrēšanai, pamatojoties uz REST un Workflow Engine (bez Java)

Ja jums ir daudz papildu prasību un varat iestatīt Java būvēšanas vidi, varat arī iestatīt Camunda Standalone war. Iestatiet Maven būvējumu, kā parādīts šajos piemēros: build Maven ar kara konfigurāciju vai montāža Maven ar pārklājumu.

Tiek sākta Camunda Tomcat izplatīšana

Vēl viena iespēja ir vienkārši lejupielādēt Camunda Tomcat izplatīšanu, izpakot to un palaist to. Tam nepieciešama tikai jūsu datorā instalētā Java Runtime Environment (JRE). Tas var būt viegli lejupielādēt no šejienes.

Camunda izmantošana vienkāršai orķestrēšanai, pamatojoties uz REST un Workflow Engine (bez Java)

Lai mainītu datu bāzi vai darītu kaut ko citu, ir jākonfigurē Tomcat līdzīgi aprakstīts dokumentācijā. Es zinu, ka Tomcat var izklausīties sarežģīti, bet patiesībā tas ir ļoti vienkārši. Un Google zina atbildes uz visu, kas var būt nepieciešams šajā procesā.

Camunda palaišana, izmantojot Tomcat

Pēdējā alternatīva ir pašam iestatīt Tomcat un instalēt tajā Camunda, ievērojot uzstādīšanas aprakstu. Tas dos jums iespēju izmantot vēlamo Tomcat versiju vai instalēt to, piemēram, kā Windows pakalpojumu.

Camunda ražošanas uzsākšana

Lai palaistu Camunda, parasti būs nepieciešama galīgā iestatīšana. Camunda ir atrodamas vadlīnijas, kas to apraksta ļoti detalizēti, taču šajā rakstā es tajās neiedziļināšos - nosaukšu tikai vienu piemēru: izplatīšanas REST API pēc noklusējuma nav konfigurēta autentifikācijai. Iespējams, vēlēsities to mainīt.

Summējot-up

Kā redzat, ir ļoti viegli sākt darbu ar Camunda neatkarīgi no izmantotās valodas. Galvenais ir tas, ka visa mijiedarbība tiek veikta, izmantojot REST API. Arī instalēšana ir diezgan vienkārša, it īpaši, ja izmantojat Docker.

Avots: www.habr.com

Pievieno komentāru