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:
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.
Î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:
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:
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).
Deci mai întâi trebuie să faci fetchAndLock (deoarece alți lucrători pot primi sarcini în același timp pentru a scala sistemul):
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:
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ă.
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.
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.
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.