Sèvi ak Camunda pou òkestrasyon fasil ki baze sou REST ak Workflow Engine (pa gen Java)

Hey Habr! Mwen prezante nan atansyon ou tradiksyon an nan atik la "Sèvi ak Camunda kòm yon òkestrasyon ki baze sou REST ki fasil pou itilize ak motè workflow (san yo pa manyen Java)" pa Bernd Rücker.

07.07.2020/XNUMX/XNUMX, tradiksyon atik Bernd Rücker

Sèvi ak Camunda pou òkestrasyon fasil ki baze sou REST ak Workflow Engine (pa gen Java)

Mwen souvan diskite sou achitekti mikwosèvis ak moun ki pa Java: C#, devlopè Node.JS/JavaScript, oswa fanatik Golang. Yo tout ap fè fas ak lefèt ke yo bezwen yon motè orchestration nan yon achitekti mikwosèvis oswa jis yon zouti pou optimize workflow la ak jwenn kapasite nan lòd, okipe timeouts, Saga ak konpansasyon tranzaksyon yo.

BPM platfòm ak sous louvri soti nan Camunda gwo pou travay sa yo. Zanmitay devlopè se youn nan karakteristik prensipal yo nan pwodwi a. Men, si ou gade nan dokiman li yo, ou ta ka jwenn enpresyon ke amitye Camunda a se sitou ki vize a devlopè Java. Platfòm nan bay anpil opòtinite pou konekte pwòp fonksyon ou ak ekstansyon, men tout bagay fèt nan Java. Eske se vre?

Non! An reyalite, ou ka fasilman kouri Camunda san okenn konesans Java ak konfigirasyon achitekti a nan kòd nan nenpòt lang ou chwazi. Nan atik sa a nou pral gade nan:

  • achitekti debaz;
  • REST API;
  • konsèy sou bibliyotèk kliyan ki egziste deja pou lang ki pa Java;
  • egzanp lè l sèvi avèk C# ak Node.JS;
  • fason yo kouri sèvè Camunda (Docker oswa Tomcat).

achitekti

Camunda ekri nan lang Java epi li mande yon Java Virtual Machine (JVM) pou kouri. Camunda bay yon API REST ki pèmèt ou ekri nan nenpòt lang ou renmen epi sèvi ak REST ak Camunda:

Sèvi ak Camunda pou òkestrasyon fasil ki baze sou REST ak Workflow Engine (pa gen Java)

Workflows nan Camunda yo defini nan BPMN, ki se fondamantalman yon dosye XML. Li ka modle lè l sèvi avèk Camunda Modeler.

Kouri Camunda atravè yon imaj Docker pre-bati

Fason ki pi fasil pou kouri Camunda se sèvi ak Docker. Fason altènatif pou kouri Camunda yo dekri pita nan atik sa a.

Sèvi ak Camunda pou òkestrasyon fasil ki baze sou REST ak Workflow Engine (pa gen Java)

Nan ka sa a, jis kouri:

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

Ou pa bezwen enkyete w sou Linux, Java Virtual Machines oswa Tomcats. Dockerfiles ak dokiman debaz yo (pa egzanp, enstriksyon pou konekte ak baz done obligatwa yo) disponib nan Github.

Si ou vle kouri Camunda Enterprise Edition, ou ka fasilman chanje dockerfile.

Sepandan, gen yon sèl dezavantaj nan kouri Camunda lè l sèvi avèk Docker: ou pral fini ak yon vèsyon nan Tomcat ki pa toujou gen ladan yo fikse dènye yo. Pou yon jan kanmenm jwenn alantou sa a, ou ka kreye yon imaj Docker tèt ou ki baze sou distribisyon an Tomcat vle, jan yo montre nan egzanp sa a, oswa itilize youn nan solisyon ki dekri anba a.

Deplwaye yon Modèl Pwosesis

Ann gade nan yon egzanp lè l sèvi avèk modèl la Saga pou yon anrjistreman vwayaj klasik kote ou vle deklanche twa aksyon nan yon ranje ak grasye konpanse aksyon siksè nan ka ta gen yon echèk pita. Prezante nan fòm BPMN, li sanble sa a:

Sèvi ak Camunda pou òkestrasyon fasil ki baze sou REST ak Workflow Engine (pa gen Java)

Koulye a, ou ka itilize REST API pou deplwaman modèl pwosesis. Ann di ou te sove li kòm trip.bpmn epi li te kouri Camunda atravè Docker konsa li te disponib sou 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

Koulye a, ou ka kouri nouvo ka workflow lè l sèvi avèk REST API a epi pase done ou vle wè yo kòm varyab egzanp workflow:

  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

Pwochen kesyon enteresan an se ki jan Camunda deklanche pwosedi tankou anrjistreman yon machin? Camunda ka pa sèlman imedyatman rele sèvis (Pouse-Principe), lè l sèvi avèk kèk bati-an konektè, men tou, mete atik travay nan yon kalite bati-an keu. Lè sa a, travayè a ka resevwa atik travay yo atravè REST, fè travay la, epi rapòte fini bay Camunda (Pull-Principle).

Sèvi ak Camunda pou òkestrasyon fasil ki baze sou REST ak Workflow Engine (pa gen Java)

Se konsa, premye ou bezwen fè fetchAndLock (piske lòt travayè yo ka resevwa travay an menm tan pou monte sistèm nan):

  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

Lè sa a, di Camunda sa travayè a fini travay li (Remake byen ke ou dwe antre ID travay ekstèn ou resevwa nan premye demann lan):

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

Sa a se li - ou pa te bezwen okenn Java jiska prezan, dwa? E sa ase pou kòmanse!

Bibliyotèk Kliyan

Rele REST API a fasil nan nenpòt lang pwogramasyon. Nan JavaScript li bon pou fè sa lè l sèvi avèk JQuery, ak nan C # ou ka itilize System.Net.Http ak Newtonsoft.Json. Men, sa a pral pran tan. Se konsa, ou ka jis itilize kèk bibliyotèk kliyan.

Kounye a gen plizyè bibliyotèk kliyan ki pare ki disponib:

  • javascript: lyen. Sipòte pa Camunda;
  • Java: lyen. Sipòte pa Camunda;
  • C #:lyen и lyen. Tou de pwojè sa yo nan yon eta entèmedyè epi yo pa gen aktivite nòmalman, men yo ka sèvi kòm yon bon pwen depa;
  • PHP: lyen se pa yon bibliyotèk trè konplè epi li pa gen ladan dènye chanjman API yo, men mwen konnen pwojè ki sèvi ak li.

Eksepte JavaScript ak Java, bibliyotèk kliyan yo pa fè pati pwodwi Camunda li menm. Pa atann yo sipòte tout karakteristik REST API Camunda a. Jis paske yon bibliyotèk pa bay yon sèten karakteristik sa pa vle di li pa la, toujou tcheke API REST Camunda. Pwojè tipik itilize bibliyotèk kòm yon pwen depa ak modèl.

Egzanp ak C#

Sèvi ak bibliyotèk kliyan ki anwo a, nou ka senpleman ekri:

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

Ou ka jwenn tout kòd sous k ap travay sou entènèt: lyen. Yon lòt egzanp disponib nan lyen.

Egzanp ak 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();

Ou ka jwenn plis enfòmasyon sou sit entènèt la github.com

Fason altènatif yo kòmanse Camunda

Custom Docker imaj ak "Camunda standalone WAR"

Kòm yon altènativ a imaj Docker ki te deja bati nan Camunda, ou ka prepare Tomcat tèt ou (pa egzanp, ki baze sou imaj ofisyèl Docker Tomcat yo) ak Lè sa a, kopi Camunda nan li kòm youn nan sa yo rele dosye WAR yo.

Sèvi ak Camunda pou òkestrasyon fasil ki baze sou REST ak Workflow Engine (pa gen Java)

Si ou gen anpil kondisyon adisyonèl epi ou ka Customize yon anviwònman bati Java, ou ka tou configured Camunda Standalone lagè. Fikse yon konstriksyon Maven tankou nan egzanp sa yo: bati Maven ak konfigirasyon lagè oswa asanble Maven ak kouvri.

Lanse distribisyon Camunda Tomcat

Yon lòt opsyon se tou senpleman telechaje distribisyon Camunda Tomcat la, dekonprime li epi kouri li. Pou fè sa, ou sèlman bezwen Java Runtime Environment (JRE) enstale sou òdinatè w lan. Li kapab fasil telechaje soti isit la.

Sèvi ak Camunda pou òkestrasyon fasil ki baze sou REST ak Workflow Engine (pa gen Java)

Pou chanje baz done a oswa fè nenpòt lòt bagay ou bezwen konfigirasyon Tomcat tankou ki dekri nan dokiman an. Mwen konnen Tomcat ka sanble konplike, men li aktyèlman trè senp. Epi Google gen repons pou tout bagay ou ta ka bezwen nan pwosesis la.

Kouri Camunda lè l sèvi avèk Tomcat

Dènye altènatif la se konfigirasyon Tomcat tèt ou epi enstale Camunda nan li, swiv deskripsyon enstalasyon an. Sa ap ba ou opòtinite pou itilize nenpòt vèsyon Tomcat ou prefere, oswa, pou egzanp, enstale li kòm yon sèvis Windows.

Lanse Camunda nan pwodiksyon an

Tipikman, sa a pral mande pou ou fè kèk konfigirasyon final pou fè Camunda kouri. Camunda gen direktiv ki dekri sa a an detay, men mwen pa pral manyen yo nan atik sa a - mwen pral jis bay yon egzanp: API REST distribisyon an pa konfigirasyon pou otantifikasyon pa default. Ou ta ka vle chanje sa a.

Adisyon-up

Kòm ou ka remake, kòmanse ak Camunda trè fasil, kèlkeswa lang ou itilize a. Pwen kle a se ke tout kominikasyon fèt atravè API REST la. Enstalasyon tou se byen senp, espesyalman lè w ap itilize Docker.

Sous: www.habr.com

Add nouvo kòmantè