Salut, Habr! Vă prezint traducerea articolului autor Bernd Rücker.
07.07.2020, traducere Bernd Rücker

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 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:

Fluxurile de lucru în Camunda sunt definite în BPMN, care este în principal un fișier XML. Acesta poate fi modelat folosind .
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.

Î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 .
Dacă dorești să rulezi Camunda Enterprise Edition, poți schimba cu ușurință .
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:

Acum puteți utiliza . 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 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, , 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).

Așadar, mai întâi trebuie să efectuați (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ă (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: . Camunda este suportată;
- Java: . Camunda este suportată;
- C#: și . Ambele proiecte sunt într-o stare intermediară și sunt practic inactive, dar pot fi un bun punct de plecare;
- PHP: — 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 ListCodul sursă complet funcțional poate fi găsit pe internet: . Un alt exemplu este disponibil la .
Пример с 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
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.

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 sau construcție .
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 .

Pentru a schimba baza de date sau a face altceva, trebuie să configurați Tomcat, așa cum . Ș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, . 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
