Upotreba Camunde za jednostavnu orkestraciju zasnovanu na REST-u i Workflow Engine-u (bez Java)

Hej Habr! Predstavljam Vašoj pažnji prevod članka „Koristite Camundu kao motor za orkestraciju i radni proces koji je jednostavan za korištenje (bez dodirivanja Jave)“ autora Bernda Rückera.

07.07.2020, prevod članci Bernd Rücker

Upotreba Camunde za jednostavnu orkestraciju zasnovanu na REST-u i Workflow Engine-u (bez Java)

Često razgovaram o mikroservisnoj arhitekturi sa ljudima koji nisu Java: C#, Node.JS/JavaScript programeri ili Golang entuzijasti. Svi oni suočeni su s činjenicom da im je potreban mehanizam orkestracije u mikroservisnoj arhitekturi ili samo alat za optimizaciju toka posla i stjecanje mogućnosti naručivanja, rukovanja timeoutima, Sagom i kompenzacijskim transakcijama.

BPM platforma sa open source iz Camunde odličan za ovakve zadatke. Prijateljstvo za programere jedna je od ključnih karakteristika proizvoda. Ali ako pogledate njegovu dokumentaciju, mogli biste steći utisak da je Camundina ljubaznost uglavnom usmjerena na Java programere. Platforma pruža mnoge mogućnosti za povezivanje vlastitih funkcija i ekstenzija, ali sve se radi u Javi. Je li stvarno?

Ne! U stvari, možete jednostavno pokrenuti Camundu bez ikakvog znanja o Javi i konfigurirati arhitekturu da kodira na bilo kojem jeziku po vašem izboru. U ovom članku ćemo pogledati:

  • osnovna arhitektura;
  • REST API;
  • savjet o postojećim klijentskim bibliotekama za jezike koji nisu Java;
  • primjer korištenja C# i Node.JS;
  • načine za pokretanje Camunda servera (Docker ili Tomcat).

arhitektura

Camunda je napisana na Javi i zahtijeva Java virtuelnu mašinu (JVM) za pokretanje. Camunda pruža REST API koji vam omogućava da pišete na bilo kom jeziku koji želite i koristite REST sa Camundom:

Upotreba Camunde za jednostavnu orkestraciju zasnovanu na REST-u i Workflow Engine-u (bez Java)

Tokovi rada u Camundi su definisani u BPMN, koji je u osnovi XML datoteka. Može se modelirati pomoću Camunda Modeler.

Pokretanje Camunde putem unaprijed izgrađene Docker slike

Najlakši način za pokretanje Camunde je korištenje Dockera. Alternativni načini pokretanja Camunde opisani su kasnije u ovom članku.

Upotreba Camunde za jednostavnu orkestraciju zasnovanu na REST-u i Workflow Engine-u (bez Java)

U ovom slučaju samo pokrenite:

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

Ne morate da brinete o Linuxu, Java virtuelnim mašinama ili Tomcats. Docker fajlovi i osnovna dokumentacija (na primjer, upute za povezivanje sa potrebnim bazama podataka) dostupni su na GitHub.

Ako želite pokrenuti Camunda Enterprise Edition, možete lako promijeniti dockerfile.

Međutim, postoji jedan nedostatak pokretanja Camunde koristeći Docker: na kraju ćete dobiti verziju Tomcata koja ne uključuje uvijek najnovije popravke. Da biste to nekako zaobišli, možete sami kreirati Docker sliku na osnovu željene Tomcat distribucije, kao što je prikazano u ovom primjeru, ili koristiti jedno od dolje opisanih rješenja.

Primjena modela procesa

Pogledajmo primjer korištenja Saga predloška za klasičnu rezervaciju putovanja gdje želite pokrenuti tri akcije zaredom i graciozno nadoknaditi uspješne akcije u slučaju kasnijeg neuspjeha. Predstavljen u BPMN formi, izgleda ovako:

Upotreba Camunde za jednostavnu orkestraciju zasnovanu na REST-u i Workflow Engine-u (bez Java)

Sada možete koristiti REST API za implementaciju modela procesa. Recimo da ste ga sačuvali kao trip.bpmn i pokrenuli Camundu preko Dockera tako da je bio dostupan na 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

Sada možeš da trčiš nove instance toka posla koristeći REST API i prosljeđivanje podataka koje želite vidjeti kao varijable instance toka posla:

  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

Sljedeće zanimljivo pitanje je kako Camunda pokreće procedure poput rezervacije automobila? Camunda ne može samo odmah pozvati usluge (Push-Principle), koristeći neke ugrađene konektori, ali i staviti radne stavke u neku vrstu ugrađenog reda čekanja. Radnik tada može primiti radne stavke putem REST-a, izvršiti posao i prijaviti završetak Camundi (princip povlačenja).

Upotreba Camunde za jednostavnu orkestraciju zasnovanu na REST-u i Workflow Engine-u (bez Java)

Dakle, prvo treba da uradite fetchAndLock (pošto drugi radnici mogu primati zadatke u isto vrijeme za skaliranje sistema):

  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

Onda reci to Camundi radnik je završio svoj posao (imajte na umu da morate unijeti vanjski ID zadatka primljen u prvom zahtjevu):

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

To je to - do sada vam nije trebala Java, zar ne? I to je dovoljno za početak!

Klijentske biblioteke

Pozivanje REST API-ja je jednostavno u bilo kojem programskom jeziku. U JavaScript-u je zgodno to učiniti koristeći JQuery, a u C# možete koristiti System.Net.Http i Newtonsoft.Json. Ali ovo će potrajati. Dakle, možete koristiti samo neku klijentsku biblioteku.

Trenutno je dostupno nekoliko gotovih klijentskih biblioteka:

  • javascript: link. Podržao Camunda;
  • Java: link. Podržao Camunda;
  • C #:link и link. Oba ova projekta su u srednjem stanju i praktično nemaju aktivnosti, ali mogu poslužiti kao dobra polazna tačka;
  • PHP: link nije baš kompletna biblioteka i ne uključuje najnovije izmjene API-ja, ali znam za projekte koji je koriste.

Sa izuzetkom JavaScript-a i Jave, klijentske biblioteke nisu dio samog proizvoda Camunda. Ne očekujte da će podržavati sve Camundine REST API funkcije. Samo zato što biblioteka ne pruža određenu funkciju ne znači da nije tu, uvijek provjerite Camunda REST API. Tipični projekti koriste biblioteke kao polaznu tačku i šablon.

Primjer sa C#

Koristeći gornju klijentsku biblioteku, možemo jednostavno napisati:

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

Kompletan radni izvorni kod se može naći na internetu: link. Drugi primjer je dostupan na link.

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

Više informacija možete pronaći na web stranici Github.com

Alternativni načini za pokretanje Camunde

Prilagođena Docker slika s "Camunda standalone WAR"

Kao alternativu unaprijed izgrađenoj Docker slici iz Camunde, možete sami pripremiti Tomcat (na primjer, na osnovu zvaničnih Docker Tomcat slika) i zatim kopirati Camundu u njega kao jednu od takozvanih WAR datoteka.

Upotreba Camunde za jednostavnu orkestraciju zasnovanu na REST-u i Workflow Engine-u (bez Java)

Ako imate mnogo dodatnih zahtjeva i možete prilagoditi Java okruženje za izradu, također možete konfigurirati Camunda Standalone war. Postavite Maven build kao u ovim primjerima: build Maven sa ratnom konfiguracijom ili montažu Maven sa preklapanjem.

Pokretanje distribucije Camunda Tomcat

Druga opcija je jednostavno preuzeti Camunda Tomcat distribuciju, raspakirati je i pokrenuti. Da biste to uradili, potrebno vam je samo Java Runtime Environment (JRE) instalirano na vašem računaru. To može biti lako preuzmite odavde.

Upotreba Camunde za jednostavnu orkestraciju zasnovanu na REST-u i Workflow Engine-u (bez Java)

Da biste promijenili bazu podataka ili uradili bilo što drugo morate konfigurirati Tomcat kao opisano u dokumentaciji. Znam da Tomcat može izgledati komplikovano, ali je zapravo vrlo jednostavno. A Google ima odgovore na sve što vam može zatrebati u tom procesu.

Pokretanje Camunde koristeći Tomcat

Posljednja alternativa je da sami konfigurirate Tomcat i instalirate Camundu u njega, prateći opis instalacije. Ovo će vam dati priliku da koristite bilo koju verziju Tomcat-a koju želite, ili, na primjer, da je instalirate kao Windows uslugu.

Lansiranje Camunde u proizvodnju

Obično će to zahtijevati od vas da izvršite konačnu postavku da biste pokrenuli Camundu. Camunda ima smjernice koje ovo opisuju vrlo detaljno, ali ih se neću doticati u ovom članku – dat ću samo jedan primjer: REST API distribucije nije konfiguriran za autentifikaciju prema zadanim postavkama. Možda biste željeli promijeniti ovo.

Sumiranje

Kao što ste možda primijetili, početak korištenja Camunde je vrlo jednostavan, bez obzira na jezik koji koristite. Ključna stvar je da se sva komunikacija obavlja preko REST API-ja. Instalacija je također prilično jednostavna, posebno kada koristite Docker.

izvor: www.habr.com

Dodajte komentar