Siv Camunda kom yooj yim REST-based orchestration thiab Workflow Cav (tsis muaj Java)

Hlo Habr! Kuv nthuav qhia rau koj mloog cov lus txhais ntawm tsab xov xwm "Siv Camunda ua ib qho yooj yim-rau-siv REST-based orchestration thiab workflow engine (tsis kov Java)" los ntawm Bernd RΓΌcker.

07.07.2020/XNUMX/XNUMX, lus lus Bernd RΓΌcker: koj puas xav tau ntau tus thwjtim?

Siv Camunda kom yooj yim REST-based orchestration thiab Workflow Cav (tsis muaj Java)

Kuv feem ntau tham txog microservice architecture nrog cov neeg tsis yog Java: C#, Node.JS/JavaScript developers, lossis Golang enthusiasts. Tag nrho cov ntawm lawv tau ntsib nrog lub fact tias lawv xav tau ib tug orchestration cav nyob rau hauv ib tug microservice architecture los yog tsuas yog ib lub cuab tam los optimize lub workflow thiab tau txais lub peev xwm los txiav txim, lis timeouts, dabneeg thiab them nyiaj muas noj.

BPM platform nrog qhib qhov chaw los ntawm Camunda zoo heev rau tej hauj lwm ntawd. Kev tsim kho tus phooj ywg yog ib qho ntawm cov yam ntxwv tseem ceeb ntawm cov khoom. Tab sis yog tias koj saib nws cov ntaub ntawv, koj yuav tau txais kev xav tias Camunda tus phooj ywg yog tsom rau Java developers. Lub platform muab ntau txoj hauv kev los txuas koj tus kheej cov haujlwm thiab txuas ntxiv, tab sis nws tau ua tiav hauv Java. Puas yog tiag?

Tsis muaj! Qhov tseeb, koj tuaj yeem khiav Camunda tau yooj yim yam tsis muaj kev paub Java thiab teeb tsa cov qauv rau kev cai hauv txhua hom lus koj xaiv. Hauv tsab xov xwm no peb yuav saib:

  • yooj yim architecture;
  • REST API;
  • cov lus qhia ntawm cov tsev qiv ntawv uas twb muaj lawm rau cov lus uas tsis yog Java;
  • piv txwv ntawm kev siv C# thiab Node.JS;
  • txoj hauv kev los khiav Camunda server (Docker lossis Tomcat).

architecture

Camunda sau rau hauv Java thiab yuav tsum muaj Java Virtual Machine (JVM) los khiav. Camunda muab REST API uas tso cai rau koj sau txhua hom lus koj nyiam thiab siv REST nrog Camunda:

Siv Camunda kom yooj yim REST-based orchestration thiab Workflow Cav (tsis muaj Java)

Workflows nyob rau hauv Camunda yog txhais nyob rau hauv BPMN, uas yog yeej ib tug XML ntaub ntawv. Nws tuaj yeem ua qauv siv Camunda Modeler.

Khiav Camunda ntawm Docker duab ua ntej

Txoj kev yooj yim tshaj plaws los khiav Camunda yog siv Docker. Lwm txoj hauv kev los khiav Camunda tau piav qhia tom qab hauv kab lus no.

Siv Camunda kom yooj yim REST-based orchestration thiab Workflow Cav (tsis muaj Java)

Hauv qhov no, tsuas yog khiav:

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

Koj tsis tas yuav txhawj txog Linux, Java Virtual Machine lossis Tomcats. Dockerfiles thiab cov ntaub ntawv yooj yim (piv txwv li, cov lus qhia rau kev txuas mus rau cov ntaub ntawv xav tau) muaj nyob ntawm github.

Yog tias koj xav khiav Camunda Enterprise Edition, koj tuaj yeem hloov tau yooj yim Dockerfile.

Txawm li cas los xij, muaj ib qho downside rau khiav Camunda siv Docker: koj yuav xaus nrog ib tug version ntawm Tomcat uas tsis ib txwm suav nrog qhov tseeb kho. Yuav ua li cas mus txog qhov no, koj tuaj yeem tsim Docker duab koj tus kheej raws li qhov xav tau Tomcat faib, raws li qhia hauv qhov piv txwv no, lossis siv ib qho kev daws teeb meem tau piav qhia hauv qab no.

Deploying tus txheej txheem qauv

Cia peb saib ib qho piv txwv uas siv Saga template rau kev mus ncig ua si classic uas koj xav ua rau peb ua ua ke thiab ua kom zoo dua qub rau kev ua tiav zoo nyob rau hauv rooj plaub ntawm kev ua tsis tiav tom qab. Muab tso rau hauv daim ntawv BPMN, nws zoo li no:

Siv Camunda kom yooj yim REST-based orchestration thiab Workflow Cav (tsis muaj Java)

Tam sim no koj tuaj yeem siv REST API rau txheej txheem qauv xa tawm. Cia peb hais tias koj tau cawm nws li trip.bpmn thiab khiav Camunda ntawm Docker yog li nws muaj nyob rau hauv 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

Tam sim no koj tuaj yeem khiav cov xwm txheej tshiab ua haujlwm siv REST API thiab dhau cov ntaub ntawv koj xav pom raws li kev ua haujlwm piv txwv piv txwv:

  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

Cov lus nug tseem ceeb tom ntej yog Camunda ua li cas ua cov txheej txheem xws li booking tsheb? Camunda tsis tuaj yeem tsuas yog hu rau cov kev pabcuam tam sim ntawd (Push-Principle), siv qee qhov built-in cov khoom sib txuas, tab sis kuj muab cov khoom ua hauj lwm rau hauv ib hom kab ua ke. Tus neeg ua haujlwm tuaj yeem tau txais cov khoom ua haujlwm ntawm REST, ua haujlwm, thiab tshaj tawm ua tiav rau Camunda (Pull-Principle).

Siv Camunda kom yooj yim REST-based orchestration thiab Workflow Cav (tsis muaj Java)

Yog li ua ntej koj yuav tsum ua fetchAndLock (vim lwm tus neeg ua haujlwm tuaj yeem tau txais cov haujlwm tib lub sijhawm los ntsuas qhov system):

  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

Ces qhia Camunda tias tus neeg ua haujlwm tau ua tiav nws txoj haujlwm (nco ntsoov tias koj yuav tsum nkag mus rau lwm tus ID ua haujlwm tau txais hauv thawj qhov kev thov):

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

Qhov ntawd yog nws - koj tsis tau xav tau Java tam sim no, txoj cai? Thiab qhov ntawd txaus los pib!

Client Library

Hu rau REST API yog ib qho yooj yim hauv txhua hom lus programming. Hauv JavaScript nws yooj yim ua qhov no siv JQuery, thiab hauv C# koj tuaj yeem siv System.Net.Http thiab Newtonsoft.Json. Tab sis qhov no yuav siv sijhawm. Yog li koj tuaj yeem siv qee lub tsev qiv ntawv tus neeg siv khoom.

Tam sim no muaj ntau lub tsev qiv ntawv npaj ua tus neeg siv khoom muaj:

  • javascript: txuas. Txhawb los ntawm Camunda;
  • Java: txuas. Txhawb los ntawm Camunda;
  • C #:txuas ΠΈ txuas. Ob qho tib si ntawm cov haujlwm no yog nyob rau hauv nruab nrab lub xeev thiab tsis muaj kev ua si, tab sis tuaj yeem ua qhov pib zoo;
  • PHP: txuas tsis yog lub tsev qiv ntawv ua tiav heev thiab tsis suav nrog qhov hloov pauv API tshiab, tab sis kuv paub txog cov haujlwm uas siv nws.

Nrog rau kev zam ntawm JavaScript thiab Java, cov tsev qiv ntawv cov neeg siv khoom tsis yog ib feem ntawm Camunda cov khoom nws tus kheej. Tsis txhob cia siab tias lawv yuav txhawb nqa tag nrho Camunda's REST API nta. Tsuas yog vim lub tsev qiv ntawv tsis muab qee qhov tshwj xeeb tsis txhais tau tias nws tsis nyob ntawd, nco ntsoov xyuas Camunda REST API. Tej yaam num siv cov tsev qiv ntawv los ua qhov pib thiab cov qauv.

Piv txwv nrog C#

Siv lub tsev qiv ntawv cov neeg siv khoom saum toj no, peb tuaj yeem sau yooj yim:

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

Cov lej ua haujlwm puv puv tuaj yeem pom hauv online: txuas. Lwm qhov piv txwv muaj nyob ntawm txuas.

Piv txwv nrog 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();

Xav paub ntau ntxiv tuaj yeem pom ntawm lub vev xaib github.com

Lwm txoj hauv kev los pib Camunda

Custom Docker duab nrog "Camunda standalone WAR"

Raws li lwm txoj hauv kev tsim ua ntej Docker duab los ntawm Camunda, koj tuaj yeem npaj Tomcat koj tus kheej (piv txwv li, raws li cov duab Docker Tomcat) thiab tom qab ntawd luam Camunda rau hauv nws ua ib qho ntawm cov ntaub ntawv WAR.

Siv Camunda kom yooj yim REST-based orchestration thiab Workflow Cav (tsis muaj Java)

Yog tias koj muaj ntau qhov kev xav tau ntxiv thiab tuaj yeem hloov kho Java tsim ib puag ncig, koj tuaj yeem teeb tsa Camunda Standalone ua tsov rog. Teeb tsa Maven tsim raws li hauv cov piv txwv no: tsim Maven nrog tsov rog configuration los yog sib dhos Maven nrog Overlay.

Tua tawm Camunda Tomcat faib

Lwm qhov kev xaiv tsuas yog rub tawm Camunda Tomcat faib, qhib nws thiab khiav nws. Txhawm rau ua qhov no, koj tsuas yog xav tau Java Runtime Ib puag ncig (JRE) ntsia hauv koj lub computer. Nws tuaj yeem yooj yim download tau los ntawm no.

Siv Camunda kom yooj yim REST-based orchestration thiab Workflow Cav (tsis muaj Java)

Txhawm rau hloov cov ntaub ntawv lossis ua lwm yam koj yuav tsum teeb tsa Tomcat nyiam tau piav nyob rau hauv cov ntaub ntawv. Kuv paub Tomcat yuav zoo li nyuaj, tab sis nws ua tau yooj yim heev. Thiab Google muaj cov lus teb rau txhua yam koj xav tau hauv cov txheej txheem.

Khiav Camunda siv Tomcat

Lwm txoj hauv kev yog los teeb tsa Tomcat koj tus kheej thiab nruab Camunda hauv nws, ua raws li cov lus piav qhia installation. Qhov no yuav muab sijhawm rau koj los siv txhua yam ntawm Tomcat koj nyiam, lossis, piv txwv li, nruab nws ua qhov kev pabcuam Windows.

Tua tawm Camunda rau hauv kev tsim khoom

Feem ntau, qhov no yuav xav kom koj ua qee qhov kev teeb tsa zaum kawg kom tau Camunda khiav. Camunda muaj cov lus qhia uas piav qhia qhov no kom ntxaws, tab sis kuv yuav tsis kov lawv hauv kab lus no - Kuv tsuas yog yuav muab ib qho piv txwv: qhov kev faib tawm REST API tsis tau teeb tsa rau kev lees paub los ntawm lub neej ntawd. Tej zaum koj yuav xav hloov qhov no.

Summing txog

Raws li koj tau pom, pib nrog Camunda yog ib qho yooj yim heev, tsis hais hom lus koj siv. Lub ntsiab lus tseem ceeb yog tias txhua qhov kev sib txuas lus tau ua tiav los ntawm REST API. Kev txhim kho kuj yooj yim heev, tshwj xeeb tshaj yog thaum siv Docker.

Tau qhov twg los: www.hab.com

Ntxiv ib saib