Выкарыстанне Camunda для зручнай аркестроўкі на аснове REST і Workflow Engine (без Java)

Прывітанне, Хабр! Уяўляю вашай увазе пераклад артыкула «Ужыванне Camunda з'яўляецца простым для выкарыстання REST-базаваны аркестрацыя і workflow engine (without touching Java)» аўтара Bernd Rücker.

07.07.2020 г., пераклад артыкулы Bernd Rücker

Выкарыстанне Camunda для зручнай аркестроўкі на аснове REST і Workflow Engine (без Java)

Я часта абмяркоўваю мікрасэрвісную архітэктуру з людзьмі, далёкімі ад Java: распрацоўшчыкамі C#, Node.JS/JavaScript ці прыхільнікамі Golang. Усе яны сутыкаюцца з тым, што ім патрэбен механізм аркестроўкі ў мікрасэрвіснай архітэктуры ці проста прылада для аптымізацыі працоўнага працэсу і атрыманні магчымасці парадкавання, апрацоўкі тайм-аўтаў, Saga і кампенсавальных транзакцый.

BPM-платформа з адкрытым зыходным кодам ад Camunda выдатна падыходзіць для такіх задач. Прыязнасць па стаўленні да распрацоўніка - адна з ключавых асаблівасцяў прадукта. Але калі зірнуць на яго дакументацыю, можа скласціся ўражанне, што галоўным чынам прыязнасць Camunda накіравана на Java-распрацоўнікаў. Платформа дае мноства магчымасцяў для падлучэння ўласных функцый і пашырэнняў, але ўсё гэта робіцца на Java. Ці так гэта на самой справе?

Не! На самой справе, можна лёгка запусціць Camunda без якіх-небудзь ведаў Java і наладзіць архітэктуру для кода на любой мове, па вашаму выбару. У гэтым артыкуле мы разгледзім:

  • базавую архітэктуру;
  • REST API;
  • парады па існуючых кліенцкіх бібліятэках для моў, адрозных ад Java;
  • прыклад выкарыстання C # і Node.JS;
  • спосабы запуску сервера Camunda (Docker ці Tomcat).

Архітэктура

Camunda напісана на Java і для запуску мае патрэбу ў віртуальнай машыне Java (JVM). Camunda дае REST API, які дазваляе вам пісаць на любой мове, які вам падабаецца, і выкарыстоўваць REST з Camunda:

Выкарыстанне Camunda для зручнай аркестроўкі на аснове REST і Workflow Engine (без Java)

Працоўныя працэсы ў Camunda вызначаюцца ў BPMN, які ў асноўным уяўляе сабой XML-файл. Яго можна змадэляваць з дапамогай Camunda Modeler.

Запуск Camunda праз папярэдне створаны вобраз Docker

Самы просты спосаб запусціць Camunda - гэта выкарыстоўваць Docker. Альтэрнатыўныя спосабы запуску Camunda апісаны далей у гэтым артыкуле.

Выкарыстанне Camunda для зручнай аркестроўкі на аснове REST і Workflow Engine (без Java)

У гэтым выпадку дастаткова проста запусціць:

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

Вам не трэба хвалявацца аб Linux, віртуальных машынах Java або Tomcats. Dockerfiles і асноўная дакументацыя (напрыклад, інструкцыя па падлучэнні да патрэбных баз дадзеных) даступныя на Github.

Калі вы хочаце запусціць Camunda Enterprise Edition, вы можаце лёгка змяніць Докер-файл.

Аднак у запуску Camunda з дапамогай Docker ёсць адзін недахоп: вы атрымаеце версію Tomcat, якая не заўсёды ўключае апошнія выпраўленні. Каб неяк абыйсці гэта, вы можаце самастойна стварыць Docker-выява на аснове патрэбнага дыстрыбутыва Tomcat, як паказана ў гэтым прыкладзе, або скарыстацца адным з рашэнняў, апісаных ніжэй.

Разгортванне мадэлі працэсу

Давайце разгледзім прыклад, выкарыстаючы шаблон Saga для класічнага браніравання паездак, дзе вы жадаеце выклікаць тры дзеянні запар і карэктна кампенсаваць паспяхова выкананыя дзеянні ў выпадку пазнейшага збою. Прадстаўлены ў форме BPMN ён выглядае наступным чынам:

Выкарыстанне Camunda для зручнай аркестроўкі на аснове REST і Workflow Engine (без Java)

Цяпер вы можаце выкарыстоўваць REST API для разгортвання мадэлі працэсу. Выкажам здагадку, вы захавалі яго з імем trip.bpmn і запусцілі Camunda праз Docker, каб ен быў даступны на 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

Цяпер вы можаце запускаць новыя экзэмпляры працоўнага працэсу з дапамогай REST API і перадаваць дадзеныя, якія вы хочаце бачыць у якасці зменных асобніка працоўнага працэсу:

  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

Наступнае цікавае пытанне: як Camunda выклікае працэдуры, падобныя браніраванню аўтамабіля? Camunda можа не толькі адразу выклікаць сэрвісы (Push-Principle), выкарыстоўваючы некаторыя убудаваныя канектары, Але і змяшчаць працоўныя элементы ў свайго роду убудаваную чарговасць. Пасля чаго worker можа атрымаць працоўныя элементы праз REST, выканаць працу і паведаміць Camunda аб завяршэнні (Pull-Principle).

Выкарыстанне Camunda для зручнай аркестроўкі на аснове REST і Workflow Engine (без Java)

Такім чынам, спачатку вам трэба выканаць fetchAndLock (паколькі іншыя worker могуць атрымліваць задачы адначасова для маштабавання сістэмы):

  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

Затым паведаміце Camunda, што worker завяршыў працу (звярніце ўвагу, што вы павінны ўвесці ідэнтыфікатар external task, атрыманы ў першым запыце):

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

Вось і ўсё - вам да гэтага часу не спатрэбілася ніякай Java, праўда? І гэтага дастаткова для пачатку працы!

Кліенцкія бібліятэкі

Выклікаць REST API лёгка ў любой мове праграмавання. У JavaScript гэта зручна рабіць з дапамогай JQuery, а ў C# - задзейнічаць System.Net.Http і Newtonsoft.Json. Але на гэта спатрэбіцца час. Таму вы можаце проста скарыстацца якой-небудзь кліенцкай бібліятэкай.

На дадзены момант даступна некалькі гатовых кліенцкіх бібліятэк:

  • JavaScript: спасылка. Падтрымліваецца Camunda;
  • Java: спасылка. Падтрымліваецца Camunda;
  • C #:спасылка и спасылка. Абодва гэтыя праекты знаходзяцца ў прамежкавым стане і практычна бяздзейнічаюць, але могуць паслужыць добрай адпраўной кропкай;
  • PHP: спасылка — не занадта поўная і не ўлучальная апошнія змены API бібліятэка, але я ведаю праекты, якія выкарыстоўваюць яе.

За выключэннем JavaScript і Java, кліенцкія бібліятэкі не з'яўляюцца часткай самага прадукта Camunda. Не чакайце, што яны будуць падтрымліваць усе магчымасці REST API Camunda. Калі бібліятэка не падае вызначанай функцыі, гэта не значыць, што яе тамака няма, заўсёды правярайце REST API Camunda. Тыпавыя праекты выкарыстоўваюць бібліятэкі ў якасці адпраўной кропкі і шаблона.

Прыклад з C#

Выкарыстоўваючы ўказаную вышэй кліенцкую бібліятэку, мы можам проста напісаць:

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

Цалкам працоўны зыходны код можна знайсці ў Інтэрнеце: спасылка. Іншы прыклад даступны па адрасе спасылка.

Прыклад з 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();

Больш падрабязную інфармацыю можна знайсці на сайце github.com

Альтэрнатыўныя спосабы запуску Camunda

Карыстацкая выява Docker з «Camunda standalone WAR»

У якасці альтэрнатывы гатовай выяве Docker з Camunda вы можаце самастойна падрыхтаваць Tomcat (напрыклад, на аснове афіцыйных выяў Docker Tomcat), а затым скапіяваць у яго Camunda як адзін з так званых WAR-файлаў.

Выкарыстанне Camunda для зручнай аркестроўкі на аснове REST і Workflow Engine (без Java)

Калі ў вас ёсць шмат дадатковых патрабаванні і вы можаце наладзіць асяроддзе зборкі Java, вы таксама можаце наладзіць Camunda Standalone war. Наладзьце зборку Maven як у гэтых прыкладах: зборка Maven з канфігурацыяй war ці зборка Maven з Overlay.

Запуск дыстрыбутыва Camunda Tomcat

Яшчэ адзін варыянт - проста спампаваць дыстрыбутыў Camunda Tomcat, разархіваваць яго і запусціць. Для гэтага запатрабуецца толькі Java Runtime Environment (JRE), усталяваная на вашым кампутары. Яе можна лёгка спампаваць адсюль.

Выкарыстанне Camunda для зручнай аркестроўкі на аснове REST і Workflow Engine (без Java)

Каб змяніць базу дадзеных або зрабіць нешта яшчэ, вам трэба наладзіць Tomcat, як апісана ў дакументацыі. Я ведаю, што Tomcat можа здацца складаным, але насамрэч гэта вельмі проста. І Google ведае адказы на ўсё, што можа спатрэбіцца ў працэсе.

Запуск Camunda з выкарыстаннем Tomcat

Апошняя альтэрнатыва - гэта самастойна наладзіць Tomcat і ўсталяваць у яго Camunda, прытрымліваючыся апісання ўстаноўкі. Гэта дасць магчымасць выкарыстоўваць любую версію Tomcat, якую вы аддаеце перавагу, ці, напрыклад, усталяваць яе ў якасці службы Windows.

Запуск Camunda у вытворчасць

Як правіла, для гэтага будзе неабходна выканаць нейкія канчатковыя наладкі для запуску Camunda. У Camunda ёсць рэкамендацыі, вельмі падрабязна гэта якія апісваюць, але я не постаці закранаць іх у гэтым артыкуле назаву толькі адзін прыклад: REST API дыстрыбутыва па змаўчанні не наладжаны на праверку сапраўднасці. Магчыма, вы захочаце змяніць гэта.

Падвядзенне вынікаў

Як вы маглі заўважыць, пачаць працаваць з Camunda вельмі проста, незалежна ад мовы, які вы карыстаецеся. Ключавы момант складаецца ў тым, што ўсё ўзаемадзеянне ажыццяўляецца праз REST API. Ўстаноўка таксама даволі простая, асабліва пры выкарыстанні Docker.

Крыніца: habr.com

Дадаць каментар