Utilizarea Camunda pentru o orchestrare ușoară bazată pe REST și Workflow Engine (fără Java)

Bună, Habr! Vă prezint atenției o traducere a articolului „Folosiți Camunda ca un motor de orchestrare și flux de lucru bazat pe REST ușor de utilizat (fără a atinge Java)” de Bernd Rücker.

07.07.2020, traducere articole Bernd Rücker

Utilizarea Camunda pentru o orchestrare ușoară bazată pe REST și Workflow Engine (fără Java)

Discut adesea despre arhitectura microserviciilor cu persoane care nu sunt Java: dezvoltatori C#, Node.JS/JavaScript sau entuziaști Golang. Toți se confruntă cu faptul că au nevoie de un motor de orchestrare într-o arhitectură de microservicii sau doar de un instrument pentru a optimiza fluxul de lucru și a dobândi capacitatea de a comanda, gestiona timeout-uri, Saga și tranzacții compensatoare.

Platforma BPM cu open source de la Camunda excelent pentru astfel de sarcini. Amabilitatea dezvoltatorilor este una dintre caracteristicile cheie ale produsului. Dar dacă te uiți la documentația sa, s-ar putea să ai impresia că prietenia lui Camunda vizează în principal dezvoltatorii Java. Platforma oferă multe oportunități de a vă conecta propriile funcții și extensii, dar totul se face în Java. Este într-adevăr?

Nu! De fapt, puteți rula cu ușurință Camunda fără cunoștințe Java și puteți configura arhitectura pentru a codifica în orice limbă la alegere. În acest articol ne vom uita la:

  • arhitectura de baza;
  • API-ul REST;
  • sfaturi privind bibliotecile client existente pentru alte limbi decât Java;
  • exemplu de utilizare a C# și Node.JS;
  • modalități de a rula serverul Camunda (Docker sau Tomcat).

Arhitectură

Camunda este scris în Java și necesită o mașină virtuală Java (JVM) pentru a rula. Camunda oferă un API REST care vă permite să scrieți în orice limbă doriți și să utilizați REST cu Camunda:

Utilizarea Camunda pentru o orchestrare ușoară bazată pe REST și Workflow Engine (fără Java)

Fluxurile de lucru din Camunda sunt definite în BPMN, care este practic un fișier XML. Poate fi modelat folosind Camunda Modeler.

Rularea Camunda printr-o imagine Docker pre-construită

Cel mai simplu mod de a rula Camunda este să folosești Docker. Modalități alternative de a rula Camunda sunt descrise mai târziu în acest articol.

Utilizarea Camunda pentru o orchestrare ușoară bazată pe REST și Workflow Engine (fără Java)

În acest caz, rulați:

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

Nu trebuie să vă faceți griji pentru Linux, Java Virtual Machines sau Tomcats. Dockerfiles și documentația de bază (de exemplu, instrucțiuni pentru conectarea la bazele de date necesare) sunt disponibile la Github.

Dacă doriți să rulați Camunda Enterprise Edition, puteți schimba cu ușurință Dockerfile.

Cu toate acestea, există un dezavantaj în a rula Camunda folosind Docker: veți ajunge cu o versiune de Tomcat care nu include întotdeauna cele mai recente remedieri. Pentru a ocoli cumva acest lucru, puteți crea singur o imagine Docker pe baza distribuției Tomcat dorite, așa cum se arată în acest exemplu, sau puteți utiliza una dintre soluțiile descrise mai jos.

Implementarea unui model de proces

Să ne uităm la un exemplu de utilizare a șablonului Saga pentru o rezervare clasică de călătorie în care doriți să declanșați trei acțiuni la rând și să compensați cu grație acțiunile de succes în cazul unui eșec ulterior. Prezentat în formă BPMN, arată astfel:

Utilizarea Camunda pentru o orchestrare ușoară bazată pe REST și Workflow Engine (fără Java)

Acum poți folosi API REST pentru implementarea modelului de proces. Să presupunem că ați salvat-o ca trip.bpmn și ați rulat Camunda prin Docker, astfel încât a fost disponibil pe 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

Acum poți fugi noi instanțe de flux de lucru folosind API-ul REST și transmiterea datelor pe care doriți să le vedeți ca variabile de instanță a fluxului de lucru:

  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

Următoarea întrebare interesantă este cum declanșează Camunda proceduri precum rezervarea unei mașini? Camunda nu numai că poate apela imediat serviciile (Principiul Push), folosind unele încorporate conectori, dar și puneți elementele de lucru într-un fel de coadă încorporată. Lucrătorul poate primi apoi elementele de lucru prin REST, poate efectua munca și poate raporta finalizarea către Camunda (Principiul de tragere).

Utilizarea Camunda pentru o orchestrare ușoară bazată pe REST și Workflow Engine (fără Java)

Deci mai întâi trebuie să faci fetchAndLock (deoarece alți lucrători pot primi sarcini în același timp pentru a scala sistemul):

  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

Atunci spune-i asta Camundei muncitorul și-a încheiat munca (rețineți că trebuie să introduceți ID-ul sarcinii externe primite în prima solicitare):

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

Asta e - nu ai nevoie de Java până acum, nu? Și asta este suficient pentru a începe!

Biblioteci client

Apelarea API-ului REST este ușoară în orice limbaj de programare. În JavaScript este convenabil să faci asta folosind JQuery, iar în C# poți folosi System.Net.Http și Newtonsoft.Json. Dar asta va dura timp. Deci, puteți utiliza doar o bibliotecă client.

În prezent, există mai multe biblioteci client gata făcute disponibile:

  • JavaScript: legătură. Sprijinit de Camunda;
  • Java: legătură. Sprijinit de Camunda;
  • C #:legătură и legătură. Ambele proiecte sunt într-o stare intermediară și nu au practic nicio activitate, dar pot servi ca un bun punct de plecare;
  • PHP: legătură nu este o bibliotecă foarte completă și nu include cele mai recente modificări API, dar știu proiecte care o folosesc.

Cu excepția JavaScript și Java, bibliotecile client nu fac parte din produsul Camunda în sine. Nu vă așteptați ca aceștia să accepte toate caracteristicile API-ului REST Camunda. Doar pentru că o bibliotecă nu oferă o anumită caracteristică, nu înseamnă că nu există, verificați întotdeauna API-ul REST Camunda. Proiectele tipice folosesc biblioteci ca punct de plecare și șablon.

Exemplu cu C#

Folosind biblioteca client de mai sus, putem scrie pur și simplu:

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

Codul sursă complet funcțional poate fi găsit online: legătură. Un alt exemplu este disponibil la legătură.

Exemplu cu 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();

Mai multe informații pot fi găsite pe site github.com

Modalități alternative de a începe Camunda

Imagine Docker personalizată cu „Camunda standalone WAR”

Ca alternativă la imaginea Docker pre-construită de la Camunda, puteți pregăti singur Tomcat (de exemplu, pe baza imaginilor oficiale Docker Tomcat) și apoi copiați Camunda în ea ca unul dintre așa-numitele fișiere WAR.

Utilizarea Camunda pentru o orchestrare ușoară bazată pe REST și Workflow Engine (fără Java)

Dacă aveți multe cerințe suplimentare și puteți personaliza un mediu de construcție Java, puteți configura și Camunda Standalone War. Configurați o construcție Maven ca în aceste exemple: build Maven cu configurație de război sau asamblare Maven cu Overlay.

Lansarea distribuției Camunda Tomcat

O altă opțiune este să descărcați pur și simplu distribuția Camunda Tomcat, să o dezarhivați și să o rulați. Pentru a face acest lucru, aveți nevoie doar de Java Runtime Environment (JRE) instalat pe computer. Poate fi ușor descărcați de aici.

Utilizarea Camunda pentru o orchestrare ușoară bazată pe REST și Workflow Engine (fără Java)

Pentru a schimba baza de date sau pentru a face orice altceva trebuie să configurați Tomcat ca descrise în documentație. Știu că Tomcat poate părea complicat, dar de fapt este foarte simplu. Și Google are răspunsurile la tot ce ai putea avea nevoie în acest proces.

Rularea Camunda folosind Tomcat

Ultima alternativă este să configurați singur Tomcat și să instalați Camunda în el, urmând descrierea instalării. Acest lucru vă va oferi posibilitatea de a utiliza orice versiune de Tomcat pe care o preferați sau, de exemplu, să o instalați ca serviciu Windows.

Lansarea Camunda în producție

În mod obișnuit, acest lucru vă va cere să faceți o configurație finală pentru ca Camunda să funcționeze. Camunda are linii directoare care descriu acest lucru în detaliu, dar nu le voi atinge în acest articol - voi da doar un exemplu: API-ul REST al distribuției nu este configurat pentru autentificare în mod implicit. Poate doriți să schimbați acest lucru.

Însumând-up

După cum probabil ați observat, începerea utilizării Camunda este foarte ușoară, indiferent de limba pe care o folosiți. Punctul cheie este că toată comunicarea se face prin API-ul REST. Instalarea este, de asemenea, destul de simplă, mai ales când utilizați Docker.

Sursa: www.habr.com

Adauga un comentariu