Hayi Habr! Ndinikezela ingqalelo yakho inguqulelo yenqaku
07.07.2020/XNUMX/XNUMX, inguqulelo
Ndihlala ndixoxa ngokwakhiwa kwe-microservice nabantu abangengo-Java: abaphuhlisi be-C #, abaphuhlisi be-Node.JS/JavaScript, okanye i-Golang aficionados. Bonke bajongene nenyaniso yokuba badinga indlela yokudibanisa kwi-microservice architecture, okanye isixhobo nje sokulungelelanisa ukuhamba komsebenzi kunye nokufumana ukukwazi uku-odola, ukuphatha ixesha lokuphuma, iSaga kunye nembuyekezo yentengiselwano.
iqonga BPM nge
Hayi! Ngapha koko, unokuqhuba ngokulula iCamunda ngaphandle kolwazi lweJava kwaye usete uyilo lwekhowudi kulo naluphi na ulwimi olukhethileyo. Kweli nqaku siza kujonga:
- uyilo olusisiseko;
- REST API
- iingcebiso kwiilayibrari ezikhoyo zabaxumi kwiilwimi ngaphandle kweJava;
- umzekelo usebenzisa i-C # kunye neNode.JS;
- iindlela zokusebenzisa iseva yeCamunda (iDocker okanye iTomcat).
izakhiwo
ICamunda ibhalwe kwiJava kwaye ifuna iJava Virtual Machine (JVM) ukuze iqhube. ICamunda ibonelela nge-REST API ekuvumela ukuba ubhale ngalo naluphi na ulwimi oluthandayo kwaye usebenzise i-REST ngeCamunda:
Ukuhamba komsebenzi kwi-Camunda kuchazwe kwi-BPMN, eyona fayile ye-XML. Ingenziwa imodeli nge
Ukubaleka iCamunda ngomfanekiso weDocker owakhiwe kwangaphambili
Eyona ndlela ilula yokuqhuba iCamunda kukusebenzisa iDocker. Iindlela ezizezinye zokuqhuba iCamunda zichazwe kamva kweli nqaku.
Kule meko, qhuba nje:
docker run -d -p 8080:8080 camunda/camunda-bpm-platform:latest
Awunaxhala malunga neLinux, oomatshini beJava Virtual okanye iiTomcats. I-Dockerfiles kunye namaxwebhu asisiseko (umzekelo, imiyalelo yokudibanisa kwiinkcukacha ezifunekayo) ziyafumaneka
Ukuba ufuna ukuqhuba iCamunda Enterprise Edition ungatshintsha ngokulula
Nangona kunjalo, ukuqhuba iCamunda ngeDocker kunelinye icala elisezantsi: uya kugqiba ngenguqulelo yeTomcat engasoloko ibandakanya izilungiso zamva nje. Ukusebenzela oku, unokwenza owakho umfanekiso weDocker ngokusekelwe kunikezelo olufunwayo lweTomcat, njengoko kubonisiwe kulo mzekelo, okanye usebenzise esinye sezisombululo ezichazwe ngezantsi.
Inkqubo yokusasazwa koMfuziselo
Makhe sijonge kumzekelo usebenzisa itemplate yeSaga yokubhukisha uhambo lwakudala apho ufuna ukuqalisa iintshukumo ezintathu ngokulandelelana kwaye ubuyekeze ngobubele izenzo ezigqitywe ngempumelelo kwimeko yokusilela kamva. Imelwe kwifom ye-BPMN, ibonakala ngolu hlobo:
Ngoku ungasebenzisa
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
Ngoku ungabaleka
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
Umbuzo olandelayo onika umdla ngulo: ingaba uCamunda uzibiza njani iinkqubo ezifana nokubhukisha imoto? I-Camunda ayikwazi ukubiza kuphela iinkonzo ngokukhawuleza (Push-Principle) usebenzisa enye eyakhelwe-ngaphakathi
Ngoko ke, kufuneka wenze kuqala
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
Xela ke uCamunda lonto
curl
-H "Content-Type: application/json"
-X POST
-d <!-- -->'{"workerId":"worker123", "variables": {}}'<!-- -->
http://localhost:8080/engine-rest/<!-- -->external-task/EXTERNAL_TASK_ID/complete
Yiloo nto-awuzange ufune iJava ukuza kuthi ga ngoku, akunjalo? Kwaye kwanele ukuba uqalise!
Amathala eencwadi abaxhasi
Ukubiza i-REST API kulula kulo naluphi na ulwimi lwenkqubo. KwiJavaScript, oku kwenziwa ngokulula ngokusebenzisa i-JQuery, nakwi-C #, usebenzisa i-System.Net.Http kunye ne-Newtonsoft.Json. Kodwa oku kuya kuthatha ixesha. Ke ungasebenzisa ithala leencwadi labathengi.
Ngoku kukho amathala eencwadi asele enziwe abathengi akhoyo:
- IJavaScript:
unxibelelwano . Ixhaswa nguCamunda; - IJava:
unxibelelwano . Ixhaswa nguCamunda; - C #:
unxibelelwano иunxibelelwano . Zombini ezi projekthi zikwimeko ephakathi kwaye zithe cwaka, kodwa zinokusebenza njengesiqalo esihle; - PHP:
unxibelelwano - ayiphelelanga kakhulu kwaye ayibandakanyi utshintsho lwamva nje lwe-API, kodwa ndiyazi iiprojekthi eziyisebenzisayo.
Ngaphandle kweJavaScript kunye neJava, iilayibrari zabaxumi aziyonxalenye yemveliso yeCamunda ngokwayo. Ungalindeli ukuba baxhase zonke iimpawu ze-Camunda's REST API. Kungenxa yokuba ithala leencwadi lingaboneleli ngomsebenzi othile akuthethi ukuba akukho, hlala ujonga i-Camunda's REST API. Iiprojekthi eziqhelekileyo zisebenzisa amathala eencwadi njengendawo yokuqala kunye netemplate.
C # umzekelo
Ukusebenzisa ithala leencwadi lomxhasi lingasentla, sinokubhala ngokulula:
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", "..." }
});
Ikhowudi epheleleyo yomthombo osebenzayo inokufumaneka kwi-intanethi:
Umzekelo ngeNode.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();
Ulwazi oluninzi lunokufumaneka kwiwebhusayithi
Iindlela ezizezinye zokuqalisa iCamunda
Umfanekiso weDocker yesiko kunye ne "Camunda standalone WAR"
Njengenye indlela yomfanekiso weDocker owakhiwe ngaphambili ovela eCamunda, ungazilungiselela iTomcat ngokwakho (umzekelo, ngokusekwe kwimifanekiso esemthethweni yeDocker Tomcat) kwaye emva koko ukope uCamunda kuyo njengenye yeefayile ezibizwa ngokuba yi-WAR.
Ukuba uneemfuno ezininzi ezongezelelweyo kwaye unokuseta indawo yokwakha yeJava, unokuseta kwakhona imfazwe yeCamunda Standalone. Cwangcisa iMaven ukwakha njengoko kule mizekelo: yakha
Iphehlelela usasazo lweCamunda Tomcat
Enye inketho kukukhuphela ngokulula ukuhanjiswa kweCamunda Tomcat, uyivule, kwaye uyiqhube. Oku kufuna kuphela iJava Runtime Environment (JRE) efakwe kwikhompyuter yakho. Inokuba lula
Ukutshintsha isiseko sedatha okanye wenze nantoni na enye oyifunayo ukuqwalasela iTomcat njenge
Ukubaleka iCamunda usebenzisa iTomcat
Enye indlela yokugqibela kukuseta iTomcat ngokwakho kwaye ufake iCamunda kuyo,
Ukwazisa iCamunda kwimveliso
Oku kuya kufuna ukusetwa kokugqibela ukuze kuqhutywe iCamunda. Kukho izikhokelo kwiCamunda ezichaza oku ngokweenkcukacha ezinkulu, kodwa andiyi kungena kuzo kweli nqaku - ndiza kukhankanya umzekelo omnye kuphela: i-REST API yonikezelo ayilungiselelwanga ukuqinisekiswa ngokungagqibekanga. Ungafuna ukutshintsha oku.
Ukuqulunqa
Njengoko ubona, kulula kakhulu ukuqalisa ngeCamunda, nokuba usebenzisa luphi na ulwimi. Inqaku eliphambili kukuba konke ukusebenzisana kwenziwa nge-REST API. Ukufakela kukwalula kakhulu, ngakumbi xa usebenzisa iDocker.
umthombo: www.habr.com