Camunda brûke foar maklike orkestraasje basearre op REST en Workflow Engine (gjin Java)

Hoi Habr! Ik presintearje jo oandacht de oersetting fan it artikel "Brûk Camunda as in maklik te brûken REST-basearre orkestraasje- en workflowmotor (sûnder Java oan te reitsjen)" by Bernd Rücker.

07.07.2020, oersetting artikels Bernd Rukker

Camunda brûke foar maklike orkestraasje basearre op REST en Workflow Engine (gjin Java)

Ik beprate faak microservice arsjitektuer mei net-Java minsken: C # ûntwikkelers, Node.JS/JavaScript ûntwikkelers, of Golang aficionados. Allegearre wurde konfrontearre mei it feit dat se nedich hawwe in orkestraasje meganisme yn in microservice arsjitektuer, of gewoan in helpmiddel foar in streamline de workflow en krije de mooglikheid om te bestellen, omgean timeouts, Saga en kompensearjende transaksjes.

BPM platfoarm mei iepen boarne fan Camunda geweldich foar sokke taken. Untwikkeldersfreonlikens is ien fan 'e wichtichste skaaimerken fan it produkt. Mar as jo nei de dokumintaasje sjogge, kinne jo de yndruk krije dat de freonlikens fan Camunda benammen rjochte is op Java-ûntwikkelders. It platfoarm biedt in protte mooglikheden om jo eigen funksjes en útwreidingen te ferbinen, mar it wurdt allegear dien yn Java. Is it echt?

Nee! Yn feite kinne jo Camunda maklik útfiere sûnder Java-kennis en de arsjitektuer foar koade ynstelle yn elke taal fan jo kar. Yn dit artikel sille wy sjen nei:

  • basis arsjitektuer;
  • REST API
  • advys oer besteande kliïntbiblioteken foar oare talen dan Java;
  • foarbyld mei help fan C # en Node.JS;
  • manieren om de Camunda-tsjinner te begjinnen (Docker of Tomcat).

arsjitektuer

Camunda is skreaun yn Java en hat in Java Virtual Machine (JVM) nedich om te rinnen. Camunda leveret in REST API wêrmei jo kinne skriuwe yn elke taal dy't jo wolle en REST brûke mei Camunda:

Camunda brûke foar maklike orkestraasje basearre op REST en Workflow Engine (gjin Java)

Workflows yn Camunda wurde definieare yn BPMN, dat is yn prinsipe in XML-bestân. It kin wurde modelearre mei Camunda Modeler.

Camunda útfiere troch in foarboude Docker-ôfbylding

De maklikste manier om Camunda út te fieren is troch Docker te brûken. Alternative manieren om Camunda te starten wurde letter yn dit artikel beskreaun.

Camunda brûke foar maklike orkestraasje basearre op REST en Workflow Engine (gjin Java)

Yn dit gefal, gewoan rinne:

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

Jo hoege jo gjin soargen te meitsjen oer Linux, JVM's of Tomcats. Dockerfiles en basisdokumintaasje (bygelyks ynstruksjes foar ferbining mei de fereaske databases) binne beskikber op Github.

As jo ​​​​Camunda Enterprise Edition wolle útfiere, kinne jo maklik feroarje dockerfile.

It útfieren fan Camunda mei Docker hat lykwols ien neidiel: jo sille einigje mei in ferzje fan Tomcat dy't net altyd de lêste reparaasjes omfettet. Om dit om te wurkjen kinne jo jo eigen Docker-ôfbylding oanmeitsje op basis fan de winske Tomcat-distribúsje, lykas werjûn yn dit foarbyld, of brûk ien fan 'e oplossingen beskreaun hjirûnder.

Proses Model Deployment

Litte wy nei in foarbyld sjen mei it Saga-sjabloan foar in klassike reisboeking wêr't jo trije aksjes op in rige wolle trigger en sierlik kompensearje foar suksesfol foltôge aksjes yn gefal fan in letter mislearring. Fertsjintwurdige yn BPMN-foarm, sjocht it der sa út:

Camunda brûke foar maklike orkestraasje basearre op REST en Workflow Engine (gjin Java)

No kinne jo brûke REST API foar proses model ynset. Litte wy sizze dat jo it bewarje as trip.bpmn en Camunda útfiere fia Docker, sadat it beskikber is op 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

No kinne jo rinne nije workflow eksimplaren de REST API brûke en de gegevens trochjaan dy't jo wolle sjen as fariabelen fan workflow-ynstânsjes:

  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

De folgjende nijsgjirrige fraach is: hoe neamt Camunda prosedueres lykas it reservearjen fan in auto? Camunda kin net allinnich belje tsjinsten fuortendaliks (Push-Principle) mei help fan wat ynboude Anschlüsse, mar ek wurk items yn in soarte fan ynboude folchoarder. De arbeider kin dan wurkitems fia REST ûntfange, it wurk útfiere en foltôging rapportearje oan Camunda (Pull-Principle).

Camunda brûke foar maklike orkestraasje basearre op REST en Workflow Engine (gjin Java)

Dus earst moatte jo útfiere fetchAndLock (om't oare arbeiders tagelyk taken kinne ûntfange om it systeem te skaaljen):

  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

Fertel dat dan oan Camunda arbeider foltôge wurk (notysje dat jo de eksterne taak-id moatte ynfiere dy't ûntfongen is yn it earste fersyk):

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

Dat is it - jo hawwe oant no ta gjin Java nedich, krekt? En dat is genôch om te begjinnen!

Client biblioteken

In REST API oproppe is maklik yn elke programmeartaal. Yn JavaScript wurdt dit handich dien mei JQuery, en yn C #, mei System.Net.Http en Newtonsoft.Json. Mar dit sil tiid nimme. Sa kinne jo gewoan wat kliïntbibleteek brûke.

D'r binne op it stuit ferskate klearmakke kliïntbiblioteken beskikber:

  • JavaSkript: link. Stipe troch Camunda;
  • Java: link. Stipe troch Camunda;
  • C #:link и link. Beide fan dizze projekten binne yn in tuskenstân en praktysk sliepende, mar kin tsjinje as in goed útgongspunt;
  • PHP: link - net te folslein en omfettet de lêste API-feroarings net, mar ik wit projekten dy't it brûke.

Mei útsûndering fan JavaScript en Java binne de kliïntbiblioteken gjin diel fan it Camunda-produkt sels. Ferwachtsje net dat se alle Camunda's REST API-funksjes sille stypje. Krekt om't in bibleteek gjin bepaalde funksje leveret, betsjuttet net dat it d'r net is, kontrolearje altyd de REST API fan Camunda. Referinsjeprojekten brûke biblioteken as útgongspunt en sjabloan.

Foarbyld fan C#

Mei de boppesteande kliïntbibleteek kinne wy ​​gewoan skriuwe:

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

De folslein wurkjende boarnekoade kin online fûn wurde: link. In oar foarbyld is beskikber op link.

Foarbyld mei 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();

Mear ynformaasje is te finen op de webside github.com

Alternative manieren om Camunda te starten

Oanpaste Docker-ôfbylding mei "Camunda standalone WAR"

As alternatyf foar in foarboude Docker-ôfbylding fan Camunda kinne jo Tomcat sels tariede (bygelyks basearre op de offisjele Docker Tomcat-ôfbyldings) en dan Camunda dêryn kopiearje as ien fan 'e saneamde WAR-bestannen.

Camunda brûke foar maklike orkestraasje basearre op REST en Workflow Engine (gjin Java)

As jo ​​in protte oanfoljende easken hawwe en in Java-buildomjouwing kinne ynstelle, kinne jo ek ynstelle Camunda Standalone oarloch. Stel in Maven-build op lykas yn dizze foarbylden: build Maven mei oarlochskonfiguraasje of gearkomste Maven mei Overlay.

Launch de Camunda Tomcat-distribúsje

In oare opsje is om de Camunda Tomcat-distribúsje gewoan te downloaden, it út te pakken en it út te fieren. Dit fereasket allinich de Java Runtime Environment (JRE) ynstalleare op jo kompjûter. It kin maklik download hjirwei.

Camunda brûke foar maklike orkestraasje basearre op REST en Workflow Engine (gjin Java)

Om de databank te feroarjen of wat oars te dwaan moatte jo Tomcat konfigurearje lykas beskreaun yn de dokumintaasje. Ik wit Tomcat kin klinke yngewikkeld, mar it is eins hiel simpel. En Google wit de antwurden op alles dat yn it proses fereaske kin.

Running Camunda brûkend Tomcat

It lêste alternatyf is om Tomcat sels yn te stellen en Camunda deryn te ynstallearjen, folgjende de ynstallaasje beskriuwing. Dit sil jo de opsje jaan om elke ferzje fan Tomcat te brûken dy't jo leaver hawwe, of it te ynstallearjen as in Windows-tsjinst, bygelyks.

Launch fan Camunda yn produksje

Dit sil normaal wat lêste opset nedich wêze om Camunda út te fieren. D'r binne rjochtlinen yn Camunda dy't dit yn detail beskriuwe, mar ik sil der net op yngean yn dit artikel - ik sil mar ien foarbyld neame: de REST API fan 'e distribúsje is standert net ynsteld foar ferifikaasje. Jo kinne dit feroarje wolle.

Omheech op

Sa't jo sjen kinne, is it heul maklik om te begjinnen mei Camunda, nettsjinsteande de taal dy't jo brûke. It wichtichste punt is dat alle ynteraksje wurdt dien fia de REST API. Ynstallaasje is ek frij ienfâldich, foaral by it brûken fan Docker.

Boarne: www.habr.com

Add a comment