Camundan käyttäminen helppoa orkestrointia varten, joka perustuu REST- ja Workflow Engineen (ei Javaa)

Hei Habr! Esitän huomionne artikkelin käännöksen "Käytä Camundaa helppokäyttöisenä REST-pohjaisena orkestrointi- ja työnkulkumoottorina (koskematta Javaan)" Kirjailija: Bernd Rücker

07.07.2020, käännös Artikkeli Bernd Rucker

Camundan käyttäminen helppoa orkestrointia varten, joka perustuu REST- ja Workflow Engineen (ei Javaa)

Keskustelen usein mikropalveluarkkitehtuurista muiden kuin Java-käyttäjien kanssa: C#-kehittäjien, Node.JS/JavaScript-kehittäjien tai Golangin harrastajien kanssa. He kaikki kohtaavat sen tosiasian, että he tarvitsevat mikropalveluarkkitehtuuriin orkestrointimekanismin tai vain työkalun työnkulun virtaviivaistamiseen ja kykyyn tilata, käsitellä aikakatkaisuja, Sagaa ja kompensaatiotapahtumia.

BPM-alustalla avoin lähdekoodi Camundalta loistava sellaisiin tehtäviin. Kehittäjäystävällisyys on yksi tuotteen tärkeimmistä ominaisuuksista. Mutta jos katsot sen dokumentaatiota, saatat saada vaikutelman, että Camundan "ystävällisyys" on suunnattu pääasiassa Java-kehittäjille. Alusta tarjoaa paljon vaihtoehtoja omien toimintojesi ja laajennuksien yhdistämiseen, mutta kaikki tehdään Javalla. Onko se todella?

Ei! Itse asiassa voit helposti käyttää Camundaa ilman Java-tietoa ja määrittää arkkitehtuurin koodille millä tahansa valitsemallasi kielellä. Tässä artikkelissa tarkastelemme:

  • perusarkkitehtuuri;
  • REST API
  • neuvonta olemassa olevista asiakaskirjastoista muille kielille kuin Javalle;
  • esimerkkinä C# ja Node.JS;
  • tapoja käynnistää Camunda-palvelin (Docker tai Tomcat).

Arkkitehtuuri

Camunda on kirjoitettu Java-kielellä ja tarvitsee Java Virtual Machinen (JVM) toimiakseen. Camunda tarjoaa REST-sovellusliittymän, jonka avulla voit kirjoittaa millä tahansa kielellä ja käyttää RESTiä Camundan kanssa:

Camundan käyttäminen helppoa orkestrointia varten, joka perustuu REST- ja Workflow Engineen (ei Javaa)

Camundan työnkulut määritellään BPMN:ssä, joka on periaatteessa XML-tiedosto. Sitä voidaan mallintaa Camunda mallintaja.

Camundan käyttäminen valmiiksi rakennetun Docker-kuvan läpi

Helpoin tapa käyttää Camundaa on käyttää Dockeria. Vaihtoehtoisia tapoja käynnistää Camunda kuvataan myöhemmin tässä artikkelissa.

Camundan käyttäminen helppoa orkestrointia varten, joka perustuu REST- ja Workflow Engineen (ei Javaa)

Suorita tässä tapauksessa:

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

Sinun ei tarvitse huolehtia Linuxista, JVM:istä tai Tomcateista. Docker-tiedostot ja perusdokumentaatio (esimerkiksi ohjeet tarvittaviin tietokantoihin yhdistämisestä) ovat saatavilla osoitteessa Github.

Jos haluat käyttää Camunda Enterprise Editionia, voit vaihtaa sen helposti Dockerfile.

Camundan käyttämisessä Dockerin kanssa on kuitenkin yksi haittapuoli: päädyt Tomcat-versioon, joka ei aina sisällä uusimpia korjauksia. Voit kiertää tämän luomalla oman Docker-kuvan halutun Tomcat-jakelun perusteella, kuten tässä esimerkissä näytetään, tai käyttämällä jotakin alla kuvatuista ratkaisuista.

Prosessimallin käyttöönotto

Katsotaanpa esimerkkiä Saga-mallin käyttämisestä klassiseen matkavaraukseen, jossa haluat käynnistää kolme toimintoa peräkkäin ja kompensoida sulavasti onnistuneesti suoritetut toiminnot myöhemmän epäonnistumisen varalta. Esitettynä BPMN-muodossa, se näyttää tältä:

Camundan käyttäminen helppoa orkestrointia varten, joka perustuu REST- ja Workflow Engineen (ei Javaa)

Nyt voit käyttää REST API prosessimallin käyttöönottoa varten. Oletetaan, että tallennat sen nimellä trip.bpmn ja käytät Camundaa Dockerin kautta, jotta se on saatavilla localhostissa: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

Nyt voit juosta uusia työnkulun ilmentymiä REST API:n avulla ja välitä tiedot, jotka haluat nähdä työnkulun ilmentymän muuttujina:

  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

Seuraava mielenkiintoinen kysymys on: miten Camunda kutsuu prosesseja kuten auton varaamisen? Camunda ei voi vain soittaa palveluun välittömästi (Push-Principle) jollakin sisäänrakennetulla liittimet, mutta myös laittaa työtavarat eräänlaiseen sisäänrakennettuun järjestykseen. Työntekijä voi sitten noutaa työkohteet REST:n kautta, suorittaa työn ja käskeä Camundan suorittamaan sen loppuun (Pull-Principle).

Camundan käyttäminen helppoa orkestrointia varten, joka perustuu REST- ja Workflow Engineen (ei Javaa)

Joten ensin sinun on suoritettava fetchAndLock (koska muut työntekijät voivat vastaanottaa tehtäviä samaan aikaan järjestelmän skaalaamiseksi):

  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

Kerro sitten Camundalle se työntekijä suoritti työnsä (huomaa, että sinun on syötettävä ensimmäisessä pyynnössä vastaanotettu ulkoinen tehtävätunnus):

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

Siinä se - et vieläkään ole tarvinnut Javaa, eikö niin? Ja se riittää alkuun!

Asiakaskirjastot

REST API:n kutsuminen on helppoa millä tahansa ohjelmointikielellä. JavaScriptissä tämä tehdään kätevästi JQueryllä ja C#:ssa System.Net.Http:llä ja Newtonsoft.Jsonilla. Mutta tämä vie aikaa. Joten voit vain käyttää jotain asiakaskirjastoa.

Tällä hetkellä saatavilla on useita valmiita asiakaskirjastoja:

  • JavaScript: linkki. Camundan tukema;
  • java: linkki. Camundan tukema;
  • C #:linkki и linkki. Molemmat hankkeet ovat välivaiheessa ja käytännössä lepotilassa, mutta voivat toimia hyvänä lähtökohtana;
  • PHP: linkki - ei liian täydellinen eikä sisällä uusimpia API-muutoksia, mutta tiedän projekteja, jotka käyttävät sitä.

JavaScriptiä ja Javaa lukuun ottamatta asiakaskirjastot eivät kuulu itse Camunda-tuotteeseen. Älä odota niiden tukevan kaikkia Camundan REST API -ominaisuuksia. Se, että kirjasto ei tarjoa tiettyä toimintoa, ei tarkoita, että sitä ei olisi olemassa, tarkista aina Camundan REST API. Viiteprojektit käyttävät kirjastoja lähtökohtana ja mallina.

C# esimerkki

Yllä olevaa asiakaskirjastoa käyttämällä voimme yksinkertaisesti kirjoittaa:

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

Täysin toimiva lähdekoodi löytyy verkosta: linkki. Toinen esimerkki löytyy osoitteesta linkki.

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

Lisätietoja löytyy verkkosivuilta github.com

Vaihtoehtoisia tapoja käynnistää Camunda

Mukautettu Docker-kuva, jossa on "Camunda standalone WAR"

Vaihtoehtona valmiiksi rakennetulle Docker-kuvalle Camundasta voit valmistaa Tomcatin itse (esimerkiksi virallisten Docker Tomcat -kuvien perusteella) ja sitten kopioida Camundan siihen yhdeksi niin sanotuista WAR-tiedostoista.

Camundan käyttäminen helppoa orkestrointia varten, joka perustuu REST- ja Workflow Engineen (ei Javaa)

Jos sinulla on monia lisävaatimuksia ja voit määrittää Java-rakennusympäristön, voit myös määrittää Camunda Standalone war -sovelluksen. Aseta Maven-koontiversio kuten näissä esimerkeissä: build Maven war config tai kokoonpano Maven peitolla.

Aloitetaan Camunda Tomcat -jakelu

Toinen vaihtoehto on yksinkertaisesti ladata Camunda Tomcat -jakelu, purkaa se ja suorittaa se. Tämä vaatii vain Java Runtime Environment (JRE) -ympäristön, joka on asennettu tietokoneeseen. Se voi olla helposti lataa täältä.

Camundan käyttäminen helppoa orkestrointia varten, joka perustuu REST- ja Workflow Engineen (ei Javaa)

Jotta voit muuttaa tietokantaa tai tehdä jotain muuta, sinun on määritettävä Tomcat kuten kuvattu dokumentaatiossa. Tiedän, että Tomcat saattaa kuulostaa monimutkaiselta, mutta se on itse asiassa hyvin yksinkertainen. Ja Google tietää vastaukset kaikkeen, mitä prosessissa voidaan tarvita.

Camundan ajaminen Tomcatilla

Viimeinen vaihtoehto on asentaa Tomcat itse ja asentaa siihen Camunda, asennuskuvauksen mukaisesti. Tämä antaa sinulle mahdollisuuden käyttää haluamaasi Tomcat-versiota tai asentaa sen esimerkiksi Windows-palveluna.

Camundan tuotanto käynnistyy

Tämä vaatii yleensä joitain lopullisia asetuksia Camundan käyttämiseksi. Camundassa on ohjeita, jotka kuvaavat tätä erittäin yksityiskohtaisesti, mutta en käsittele niitä tässä artikkelissa - mainitsen vain yhden esimerkin: jakelun REST API ei ole oletusarvoisesti määritetty todennusta varten. Haluat ehkä muuttaa tätä.

Tiivistelmäraportteja

Kuten näet, Camundan käytön aloittaminen on erittäin helppoa käyttämästäsi kielestä riippumatta. Tärkeintä on, että kaikki vuorovaikutus tapahtuu REST API:n kautta. Asennus on myös melko helppoa, varsinkin kun käytät Dockeria.

Lähde: will.com

Lisää kommentti