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

Salut, Habr! Vă prezint traducerea articolului «Foloseste Camunda ca un motor de orchestrare și flux de lucru bazat pe REST, ușor de utilizat (fără a atinge Java)» autor Bernd Rücker.

07.07.2020, traducere recomandările sunt aplicabile coronavirusurilor în general și COVID-19 în particular. Așadar, recomand să descărcați și să printați articolul (pentru cei interesați de acest subiect). Bernd Rücker

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

Adesea discut arhitectura microserviciilor cu persoane care nu au cunoștințe despre Java: dezvoltatori C#, Node.JS/JavaScript sau adepți ai Golang. Toți se confruntă cu nevoia unui mecanism de orchestrare în arhitectura microserviciilor sau pur și simplu a unui instrument pentru optimizarea fluxului de lucru și pentru a le oferi posibilitatea de a ordona, gestiona timpii de așteptare, Saga și tranzacții compensatorii.

O platformă BPM cu sursă deschisă de la Camunda se potrivește perfect pentru aceste sarcini. Prietenia cu dezvoltatorii este una dintre caracteristicile cheie ale produsului. Însă, dacă te uiți la documentația sa, ai putea avea impresia că principalul obiectiv al 'prieteniei' Camunda este orientat către dezvoltatorii Java. Platforma oferă multe oportunități de integrare a funcțiilor și extensiilor proprii, dar toate acestea se fac în Java. Este chiar așa?

Nu! De fapt, este foarte simplu să rulezi Camunda fără a avea cunoștințe Java și să configurezi arhitectura pentru cod în orice limbaj la alegerea ta. În acest articol, vom analiza:

  • arhitectura de bază;
  • REST API;
  • sfaturi pentru bibliotecile client existente pentru limbaje diferite de Java;
  • exemplu de utilizare 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 REST API, care îți permite să scrii în orice limbaj îți place și să folosești REST cu Camunda:

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

Fluxurile de lucru în Camunda sunt definite în BPMN, care este în principal un fișier XML. Acesta poate fi modelat folosind Camunda Modeler.

Rularea Camunda printr-o imagine Docker pre-creată

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

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

În acest caz, este suficient să rulezi:

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

Nu trebuie să îți faci griji în legătură cu Linux, mașini virtuale Java sau Tomcat. Dockerfiles și documentația principală (de exemplu, instrucțiuni pentru conectarea la bazele de date necesare) sunt disponibile pe Github.

Dacă dorești să rulezi Camunda Enterprise Edition, poți schimba cu ușurință Dockerfile.

Cu toate acestea, există un dezavantaj la pornirea Camunda prin Docker: veți obține o versiune Tomcat care nu include întotdeauna ultimele corecții. Pentru a o ocolii, puteți crea singur o imagine Docker bazată pe distribuția dorită de Tomcat, așa cum este ilustrat în acest exemplu, sau puteți utiliza una dintre soluțiile descrise mai jos.

Implementarea modelului de proces

Să luăm un exemplu, folosind șablonul Saga pentru rezervarea clasică a călătoriilor, unde doriți să apelați trei acțiuni consecutiv și să compensați în mod corect acțiunile finalizate cu succes în cazul unui eșec ulterioar. Prezentat sub formă BPMN, acesta arată astfel:

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

Acum puteți utiliza REST API pentru implementarea modelului de proces. Presupunând că l-ați salvat cu numele trip.bpmn și ați pornit Camunda prin Docker, astfel încât să fie 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 "trip.bpmn=@trip.bpmn" 
http://localhost:8080/engine-rest/deployment/creat

Acum puteți lansa instanțe noi ale fluxului de lucru prin interfața REST și transmite datele pe care doriți să le vedeți ca variabile ale instanței 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

O altă întrebare interesantă: cum invocă Camunda procese, cum ar fi rezervarea unei mașini? Camunda poate nu doar să numească imediat serviciile (Principiul Push), folosind unele conectoare încorporate, conectoare, dar poate, de asemenea, să plaseze elemente de lucru într-un fel de coadă încorporată. După aceea, muncitorul poate obține elementele de lucru prin REST, să efectueze sarcina și să informeze Camunda despre finalizare (Principiul Pull).

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

Așadar, mai întâi trebuie să efectuați fetchAndLock (deoarece alți muncitori pot prelua sarcini simultan pentru a scalda 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

Apoi, informați Camunda că muncitorul a finalizat sarcina (rețineți că trebuie să introduceți identifiantul sarcinii externe obținut î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

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

Biblioteci client

E simplu să invoci REST API în orice limbaj de programare. În JavaScript, poți folosi ușor JQuery, iar în C# trebuie să folosești System.Net.Http și Newtonsoft.Json. Dar asta va lua timp. Așa că poți pur și simplu să folosești o bibliotecă client.

În prezent, există câteva biblioteci client gata disponibile:

  • JavaScript: linkul. Camunda este suportată;
  • Java: linkul. Camunda este suportată;
  • C#:linkul și linkul. Ambele proiecte sunt într-o stare intermediară și sunt practic inactive, dar pot fi un bun punct de plecare;
  • PHP: linkul — o bibliotecă care nu este foarte completă și nu include ultimele modificări ale API-ului, dar cunosc proiecte care o folosesc.

În afară de JavaScript și Java, bibliotecile client nu fac parte din produsul Camunda în sine. Nu te aștepta să suporte toate funcționalitățile REST API-ului Camunda. Dacă o bibliotecă nu oferă o anumită funcție, nu înseamnă că nu există, verifică întotdeauna REST API-ul Camunda. Proiectele standard folosesc bibliotecile ca punct de plecare și șablon.

Exemplu cu C#

Folosind biblioteca client menționată mai sus, putem scrie pur și simplu:

  var camunda = new CamundaEngineClient("http://localhost:8080/engine-rest/engine/default/", null, null);
  	// Publică fișierul BPMN XML din resurse
  camunda.RepositoryService.Deploy("trip-booking", new List {
        FileParameter.FromManifestResource(Assembly.GetExecutingAssembly(), "FlowingTripBookingSaga.Models.FlowingTripBookingSaga.bpmn")
     });
  
  	// Înregistrează lucrători
  registerWorker("reserve-car", externalTask => {
    	// aici poți face lucruri reale! Ca un sysout :-)
    Console.WriteLine("Rezervând mașina acum...");
    camunda.ExternalTaskService.Complete(workerId, externalTask.Id);
  });
  registerWorker("cancel-car", externalTask => {
    Console.WriteLine("Anulând mașina acum...");
    camunda.ExternalTaskService.Complete(workerId, externalTask.Id);
  });
  registerWorker("book-hotel", externalTask => {
    Console.WriteLine("Rezervând hotelul acum...");
    camunda.ExternalTaskService.Complete(workerId, externalTask.Id);
  });
  	// Înregistrează mai mulți lucrători...
  
  StartPolling();
  
  string processInstanceId = camunda.BpmnWorkflowService.StartProcessInstance("FlowingTripBookingSaga", new Dictionary()
    {
      {"someBookingData", "..." }
    });

Codul sursă complet funcțional poate fi găsit pe internet: linkul. Un alt exemplu este disponibil la linkul.

Пример с 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 + " - adăugând ceva";
    callback(null, {
      variables: {
        someNewData: someNewData
      }
    });
  });
  
  workers.shutdown();

Informații mai detaliate pot fi găsite pe site github.com

Metode alternative de lansare a Camunda

Imagine personalizată Docker cu „Camunda standalone WAR”

Ca alternativă la imaginea Docker pregătită de Camunda, puteți configura singur Tomcat (de exemplu, bazându-vă pe imaginile Docker oficiale Tomcat) și apoi copiați în acesta Camunda ca unul dintre așa-numitele fișiere WAR.

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

Dacă aveți multe cerințe suplimentare și vă puteți configura mediul de construire Java, de asemenea, puteți configura Camunda Standalone war. Configurați construcția Maven așa cum este în aceste exemple: construcție Maven cu configurația war sau construcție Maven cu Overlay.

Lansarea distribuției Camunda Tomcat

O altă opțiune este doar să descărcați distribuția Camunda Tomcat, să o dezarhivați și să o rulați. Pentru asta veți avea nevoie doar de Java Runtime Environment (JRE) instalată pe computerul dumneavoastră. O puteți descărca ușor de aici.

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

Pentru a schimba baza de date sau a face altceva, trebuie să configurați Tomcat, așa cum este descris în documentație. Știu că Tomcat poate părea complicat, dar de fapt este foarte simplu. Și Google știe răspunsurile la tot ce ar putea fi necesar în proces.

Lansarea Camunda utilizând Tomcat

Ultima alternativă este să configurați singur Tomcat și să instalați Camunda în el, urmând descrierea instalației. Aceasta va permite utilizarea oricărei versiuni de Tomcat pe care o preferați sau, de exemplu, să o instalați ca serviciu Windows.

Lansarea Camunda în producție

În general, pentru aceasta va fi necesar să efectuați anumite configurări finale pentru a lansa Camunda. Camunda are recomandări care descriu foarte detaliat acest lucru, dar nu voi aborda aceste subiecte în acest articol — voi menționa doar un exemplu: API-ul REST al distribuției, în mod implicit, nu este configurat pentru autentificare. Poate doriți să schimbați asta.

Concluzii

Așa cum ați observat, este foarte simplu să începeți lucrul cu Camunda, indiferent de limbajul pe care îl utilizați. Punctul cheie este că toată interacțiunea se desfășoară prin API REST. Instalarea este, de asemenea, destul de simplă, mai ales când folosiți Docker.

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster