Uzante Camunda por facila instrumentado bazita sur REST kaj Workflow Engine (sen Java)

Hej Habr! Mi prezentas al via atento la tradukon de la artikolo "Uzu Camunda kiel facile uzebla REST-bazita instrumentado kaj laborflumotoro (sen tuŝi Java)" de Bernd Rücker.

07.07.2020/XNUMX/XNUMX, traduko artikoloj Bernd Rucker

Uzante Camunda por facila instrumentado bazita sur REST kaj Workflow Engine (sen Java)

Mi ofte diskutas pri mikroserva arkitekturo kun ne-Java homoj: C#-programistoj, Node.JS/JavaScript-programistoj aŭ Golang-ŝatantoj. Ĉiuj ili alfrontas la fakton, ke ili bezonas instrumentan mekanismon en mikroserva arkitekturo, aŭ nur ilon por simpligi la laborfluon kaj akiri la kapablon ordigi, pritrakti tempon, Saga kaj kompensi transakciojn.

BPM-platformo kun malfermfonteco de Camunda bonega por tiaj taskoj. Amikeco por programistoj estas unu el la ĉefaj trajtoj de la produkto. Sed se vi rigardas ĝian dokumentadon, vi eble havos la impreson, ke la "amikeco" de Camunda ĉefe celas al Java-programistoj. La platformo provizas multajn eblojn por konekti viajn proprajn funkciojn kaj etendaĵojn, sed ĉio estas farita en Java. Ĉu vere?

Ne! Fakte, vi povas facile ruli Camunda sen ajna Java scio kaj agordi la arkitekturon por kodo en iu ajn lingvo de via elekto. En ĉi tiu artikolo, ni rigardos:

  • baza arkitekturo;
  • REST API
  • konsiloj pri ekzistantaj klientbibliotekoj por lingvoj krom Java;
  • ekzemplo uzante C# kaj Node.JS;
  • manieroj lanĉi la Camundan servilon (Docker aŭ Tomcat).

arkitekturo

Camunda estas skribita en Java kaj bezonas Java Virtual Machine (JVM) por funkcii. Camunda provizas REST-API, kiu permesas vin skribi en iu ajn lingvo, kiun vi ŝatas kaj uzi REST kun Camunda:

Uzante Camunda por facila instrumentado bazita sur REST kaj Workflow Engine (sen Java)

Laborfluoj en Camunda estas difinitaj en BPMN, kiu estas esence XML-dosiero. Ĝi povas esti modeligita kun Camunda Modeler.

Kurante Camunda tra antaŭkonstruita Docker-bildo

La plej facila maniero funkciigi Camunda estas uzi Docker. Alternativaj manieroj lanĉi Camunda estas priskribitaj poste en ĉi tiu artikolo.

Uzante Camunda por facila instrumentado bazita sur REST kaj Workflow Engine (sen Java)

En ĉi tiu kazo, simple rulu:

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

Vi ne devas zorgi pri Linukso, JVM aŭ Tomcats. Dockerfiles kaj baza dokumentaro (ekzemple, instrukcioj por konekti al la postulataj datumbazoj) estas haveblaj ĉe GitHub.

Se vi volas ruli Camundan Enterprise Edition, vi povas facile ŝanĝi dockerfile.

Tamen, ruli Camunda kun Docker havas unu malavantaĝon: vi finos kun versio de Tomcat, kiu ne ĉiam inkluzivas la plej novajn korektojn. Por solvi ĉi tion, vi povas krei vian propran Docker-bildon bazitan sur la dezirata Tomcat-distribuo, kiel montrite en ĉi tiu ekzemplo, aŭ uzi unu el la solvoj priskribitaj sube.

Proceza Modela Deplojo

Ni rigardu ekzemplon uzante la ŝablonon Saga por klasika vojaĝo-rezervado, kie vi volas ekigi tri agojn sinsekve kaj gracie kompensi por sukcese plenumitaj agoj en kazo de posta fiasko. Reprezentite en formo BPMN, ĝi aspektas jene:

Uzante Camunda por facila instrumentado bazita sur REST kaj Workflow Engine (sen Java)

Nun vi povas uzi REST API por proceza modeldeplojo. Ni diru, ke vi konservas ĝin kiel trip.bpmn kaj rulu Camunda per Docker, por ke ĝi estu disponebla ĉe 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

Nun vi povas kuri novaj laborfluokazoj uzante la REST-API kaj transdonu la datumojn, kiujn vi volas vidi kiel laborfluajn ekzemplajn variablojn:

  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

La sekva interesa demando estas: kiel Camunda vokas procedurojn kiel rezervi aŭton? Camunda povas ne nur voki servojn tuj (Push-Principle) uzante iujn enkonstruitajn konektiloj, sed ankaŭ meti laboraĵojn en speco de enkonstruita ordo. La laboristo tiam povas alporti laboraĵojn per REST, plenumi la laboron kaj rakonti al Camunda kompletigi (Pull-Principle).

Uzante Camunda por facila instrumentado bazita sur REST kaj Workflow Engine (sen Java)

Do unue vi devas ekzekuti fetchAndLock (ĉar aliaj laboristoj povas ricevi taskojn samtempe por grimpi la sistemon):

  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

Tiam diru tion al Camunda laboristo kompletigis laboron (notu, ke vi devas enigi la eksteran taskon-id ricevitan en la unua peto):

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

Jen — vi ankoraŭ ne bezonis Javan, ĉu ne? Kaj tio sufiĉas por komenci!

Klientaj Bibliotekoj

Voki REST API estas facile en iu ajn programlingvo. En JavaScript, ĉi tio estas oportune farita uzante JQuery, kaj en C#, uzante System.Net.Http kaj Newtonsoft.Json. Sed ĉi tio prenos tempon. Do vi povas simple uzi iun klientan bibliotekon.

Nuntempe, pluraj pretaj klientbibliotekoj estas disponeblaj:

  • Ĝavoskripto: ligilo. Subtenata de Camunda;
  • Ĝavo: ligilo. Subtenata de Camunda;
  • C #:ligilo и ligilo. Ambaŭ ĉi tiuj projektoj estas en meza stato kaj preskaŭ neaktivaj, sed povas servi kiel bona deirpunkto;
  • PHP: ligilo - ne tro kompleta kaj ne inkluzivas la lastajn API-ŝanĝojn, sed mi konas projektojn, kiuj uzas ĝin.

Kun la escepto de JavaScript kaj Java, la klientbibliotekoj ne estas parto de la Camunda produkto mem. Ne atendu, ke ili subtenas ĉiujn REST API-funkciojn de Camunda. Nur ĉar biblioteko ne disponigas certan funkcion ne signifas ke ĝi ne estas tie, ĉiam kontrolu REST API de Camunda. Referencaj projektoj uzas bibliotekojn kiel deirpunkton kaj ŝablonon.

C# ekzemplo

Uzante la supran klientbibliotekon, ni povas simple skribi:

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

La plene funkcianta fontkodo troveblas interrete: ligilo. Alia ekzemplo estas havebla ĉe ligilo.

Ekzemplo kun 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();

Pliaj informoj troveblas en la retejo github.com

Alternativaj Vojoj Lanĉi Camunda

Propra Docker-bildo kun "Camunda memstara MILITO"

Kiel alternativo al antaŭkonstruita Docker-bildo de Camunda, vi povas mem prepari Tomcat (ekzemple, surbaze de la oficialaj bildoj de Docker Tomcat) kaj poste kopii Camunda en ĝin kiel unu el la tiel nomataj WAR-dosieroj.

Uzante Camunda por facila instrumentado bazita sur REST kaj Workflow Engine (sen Java)

Se vi havas multajn kromajn postulojn kaj povas agordi Java-konstruan medion, vi ankaŭ povas agordi Camundan Standalone-militon. Agordu Maven-konstruaĵon kiel en ĉi tiuj ekzemploj: build Maven kun militagordo aŭ kunigo Maven kun Overlay.

Lanĉante la Camunda Tomcat-distribuon

Alia opcio estas simple elŝuti la Camunda Tomcat-distribuon, malzipi ĝin kaj ruli ĝin. Ĉi tio nur postulas la Java Runtime Environment (JRE) instalita sur via komputilo. Ĝi povas esti facile elŝutu de ĉi tie.

Uzante Camunda por facila instrumentado bazita sur REST kaj Workflow Engine (sen Java)

Por ŝanĝi la datumbazon aŭ fari ion alian, vi devas agordi Tomcat kiel priskribita en dokumentaro. Mi scias, ke Tomcat povas soni komplika, sed ĝi fakte estas tre simpla. Kaj Guglo scias la respondojn al ĉio, kio povas esti postulata en la procezo.

Kurante Camunda uzante Tomcat

La lasta alternativo estas agordi Tomcat mem kaj instali Camunda en ĝi, sekvante la priskribon pri instalado. Ĉi tio donos al vi la eblon uzi kian ajn version de Tomcat vi preferas, aŭ instali ĝin kiel Vindoza servo, ekzemple.

Lanĉante Camunda en produktadon

Ĉi tio kutime postulos iun finan aranĝon por ruli Camunda. Estas gvidlinioj en Camunda, kiuj priskribas tion tre detale, sed mi ne eniros ilin en ĉi tiu artikolo - mi nomos nur unu ekzemplon: la REST API de la distribuo ne estas agordita por aŭtentikigo defaŭlte. Vi eble volas ŝanĝi ĉi tion.

Supre

Kiel vi povas vidi, estas tre facile komenci kun Camunda, sendepende de la lingvo, kiun vi uzas. La ŝlosila punkto estas, ke ĉiu interago estas farita per la REST API. Instalado ankaŭ estas sufiĉe facila, precipe kiam vi uzas Docker.

fonto: www.habr.com

Aldoni komenton