Истифодаи Camunda барои оркестри осон дар асоси REST ва муҳаррики кор (на Java)

Салом, Хабр! Ман ба диққати шумо тарҷумаи мақоларо пешкаш мекунам "Камундаро ҳамчун муҳаррики оркестрсозӣ ва ҷараёни кор дар асоси REST осон истифода баред (бидуни ламс кардани Java)" аз ҷониби Бернд Рюкер.

07.07.2020, тарҷума мақолаҳо Бернд Рюкер

Истифодаи Camunda барои оркестри осон дар асоси REST ва муҳаррики кор (на Java)

Ман аксар вақт меъмории микросервисро бо одамони ғайри Java муҳокима мекунам: C#, таҳиягарони Node.JS/JavaScript ё дӯстдорони Голанг. Ҳамаи онҳо бо он рӯ ба рӯ мешаванд, ки ба онҳо як муҳаррики оркестрсозӣ дар меъмории микросервис ё танҳо асбобе барои оптимизатсияи ҷараёни кор ва ба даст овардани қобилияти фармоиш, коркарди вақт, Сага ва транзаксияҳои ҷубронкунанда лозим аст.

Платформаи BPM бо манбаи кушода аз Камунда барои чунин вазифаҳо бузург аст. Дӯстии таҳиягарон яке аз хусусиятҳои асосии маҳсулот мебошад. Аммо агар шумо ба ҳуҷҷатҳои он назар андозед, шумо метавонед чунин таассурот пайдо кунед, ки дӯстии Камунда асосан ба таҳиягарони Java нигаронида шудааст. Платформа имкониятҳои зиёдеро барои пайваст кардани функсияҳо ва васеъкунии шахсии худ фароҳам меорад, аммо ҳамааш дар Java анҷом дода мешавад. Оё воқеан?

Не! Дарвоқеъ, шумо метавонед Camunda-ро бе ягон дониши Java ба осонӣ иҷро кунед ва меъмориро барои рамзгузорӣ бо дилхоҳ забони интихобкардаатон танзим кунед. Дар ин мақола мо дида мебароем:

  • меъмории асосӣ;
  • API REST;
  • маслиҳат оид ба китобхонаҳои муштарӣ барои забонҳои ғайр аз Java;
  • мисоли истифодаи C# ва Node.JS;
  • роҳҳои иҷро кардани сервери Camunda (Docker ё Tomcat).

меъморӣ

Camunda дар Java навишта шудааст ва барои кор кардан мошини виртуалии Java (JVM) -ро талаб мекунад. Camunda REST API-ро пешниҳод мекунад, ки ба шумо имкон медиҳад бо ҳар забони дилхоҳатон нависед ва REST-ро бо Camunda истифода баред:

Истифодаи Camunda барои оркестри осон дар асоси REST ва муҳаррики кор (на Java)

Ҷараёни корӣ дар Camunda дар BPMN муайян карда мешавад, ки асосан файли XML мебошад. Он метавонад бо истифода аз моделсозӣ Камунда Моделиер.

Иҷрои Camunda тавассути тасвири қаблан сохташудаи Docker

Роҳи осонтарини иҷро кардани Camunda ин истифодаи Docker мебошад. Роҳҳои алтернативии идора кардани Camunda дар ин мақола дар поён оварда шудаанд.

Истифодаи Camunda барои оркестри осон дар асоси REST ва муҳаррики кор (на Java)

Дар ин ҳолат, танҳо иҷро кунед:

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

Ба шумо лозим нест, ки дар бораи Linux, Java Virtual Machines ё Tomcats хавотир шавед. Докерфайлҳо ва ҳуҷҷатҳои асосӣ (масалан, дастурҳо оид ба пайвастшавӣ ба пойгоҳи додаҳои зарурӣ) дар ин ҷо дастрасанд Github.

Агар шумо хоҳед, ки Camunda Enterprise Edition -ро иҷро кунед, шумо метавонед ба осонӣ тағир диҳед файли докер.

Аммо, як нуқсони иҷро кардани Camunda бо истифода аз Docker вуҷуд дорад: шумо бо версияи Tomcat хоҳед ёфт, ки на ҳамеша ислоҳҳои охиринро дар бар мегирад. Барои рафъи ин, шумо метавонед худатон дар асоси тақсимоти дилхоҳи Tomcat тасвири Docker эҷод кунед, тавре ки дар ин мисол нишон дода шудааст, ё яке аз ҳалли дар зер тавсифшударо истифода баред.

Ҷойгир кардани модели раванд

Биёед мисолеро бо истифода аз қолаби Saga барои фармоиши сайёҳии классикӣ бубинем, ки дар он шумо мехоҳед се амалро пай дар пай ба кор баред ва дар сурати нокомии дертар амалҳои муваффақро ҷуброн кунед. Дар шакли BPMN пешниҳод шудааст, чунин менамояд:

Истифодаи Camunda барои оркестри осон дар асоси REST ва муҳаррики кор (на 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 метавонад на танҳо фавран ба хидматҳо занг занад (Push-Principle), бо истифода аз баъзе дарунсохт пайвасткунакҳо, балки инчунин ҷузъҳои кориро ба як навъ навбати дарунсохт гузоред. Пас аз он коргар метавонад тавассути REST ашёҳои корро қабул кунад, корро иҷро кунад ва ба Камунда (Pull-Principle) дар бораи анҷоми кор хабар диҳад.

Истифодаи Camunda барои оркестри осон дар асоси REST ва муҳаррики кор (на Java)

Пас, аввал шумо бояд кор кунед fetchAndLock (зеро дигар коргарон метавонанд дар як вақт супоришҳоро барои васеъ кардани система қабул кунанд):

  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

Он гоҳ ба Камунда бигӯед коргар кори худро ба охир расонд (дар хотир доред, ки шумо бояд ID-и берунаи дар дархости аввал гирифташударо ворид кунед):

  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: Садо Ояндасоз. Камунда дастгирӣ мекунад;
  • Java: Садо Ояндасоз. Камунда дастгирӣ мекунад;
  • C #:Садо Ояндасоз и Садо Ояндасоз. Ҳардуи ин лоиҳаҳо дар ҳолати мобайнӣ қарор доранд ва амалан фаъолият надоранд, вале метавонанд ҳамчун нуқтаи хуби ибтидоӣ хизмат кунанд;
  • PHP: Садо Ояндасоз китобхонаи хеле мукаммал нест ва тағироти охирини API-ро дар бар намегирад, аммо ман лоиҳаҳоеро медонам, ки онро истифода мебаранд.

Ба истиснои JavaScript ва Java, китобхонаҳои муштарӣ ҷузъи худи маҳсулоти Camunda нестанд. Интизор нашавед, ки онҳо ҳама хусусиятҳои REST API-и Camunda-ро дастгирӣ мекунанд. Танҳо аз он сабаб, ки китобхона ягон хусусияти муайянро таъмин намекунад, маънои онро надорад, ки он дар он ҷо нест, ҳамеша API-и Camunda REST-ро тафтиш кунед. Лоиҳаҳои маъмулӣ китобхонаҳоро ҳамчун нуқтаи ибтидоӣ ва қолаб истифода мебаранд.

Намуна бо 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

Роҳҳои алтернативии оғоз кардани Камунда

Тасвири фармоишии Docker бо "Camunda WAR standalone"

Ҳамчун алтернатива ба тасвири қаблан сохташудаи Docker аз Camunda, шумо метавонед Tomcat-ро худатон омода кунед (масалан, дар асоси тасвирҳои расмии Docker Tomcat) ва сипас Camunda-ро ба он ҳамчун яке аз файлҳои ба ном WAR нусхабардорӣ кунед.

Истифодаи Camunda барои оркестри осон дар асоси REST ва муҳаррики кор (на Java)

Агар шумо бисёр талаботҳои иловагӣ дошта бошед ва муҳити сохтани Java-ро танзим карда тавонед, шумо инчунин метавонед ҷанги Standalone Camunda-ро танзим кунед. Сохтани Mavenро тавре дар ин мисолҳо насб кунед: созед Maven бо конфигуратсияи ҷанг ё маҷлис Maven бо Overlay.

Оғози тақсимоти Camunda Tomcat

Варианти дигар ин аст, ки танҳо зеркашӣ кардани тақсимоти Camunda Tomcat, кушодани он ва иҷро кардани он. Барои ин ба шумо танҳо Java Runtime Environment (JRE) лозим аст, ки дар компютери шумо насб карда шудааст. Он метавонад ба осонӣ аз ин ҷо зеркашӣ кунед.

Истифодаи Camunda барои оркестри осон дар асоси REST ва муҳаррики кор (на Java)

Барои тағир додани пойгоҳи додаҳо ё ягон кори дигаре, шумо бояд Tomcat-ро ба монанди танзим кунед дар ҳуҷҷатҳо тасвир шудааст. Ман медонам, ки Tomcat метавонад мураккаб ба назар расад, аммо ин дар асл хеле содда аст. Ва Google ба ҳама чизҳое, ки ба шумо дар ин раванд лозим аст, ҷавобҳо дорад.

Иҷроиши Camunda бо истифода аз Tomcat

Варианти охирин ин аст, ки Tomcat-ро худатон танзим кунед ва дар он Camunda насб кунед, пас аз тавсифи насб. Ин ба шумо имкон медиҳад, ки ҳама гуна версияи Tomcat-ро, ки ба шумо маъқул аст, истифода баред ё масалан, онро ҳамчун хидмати Windows насб кунед.

Дар истехсолот ба кор андохта шудани Камунда

Одатан, ин аз шумо талаб мекунад, ки баъзе танзимоти ниҳоиро иҷро кунед, то Camunda кор кунад. Camunda дорои дастурҳое мебошад, ки инро ба таври муфассал тавсиф мекунанд, аммо ман дар ин мақола ба онҳо дахл намекунам - ман танҳо як мисол меорам: REST API-и тақсимот бо нобаёнӣ барои аутентификатсия танзим карда нашудааст. Шояд шумо инро тағир додан мехоҳед.

Натиҷа

Тавре ки шумо мушоҳида кардаед, оғоз кардан бо Camunda, новобаста аз забоне, ки шумо истифода мебаред, хеле осон аст. Нуқтаи асосӣ дар он аст, ки ҳама иртибот тавассути REST API анҷом дода мешавад. Насбкунӣ низ хеле содда аст, махсусан ҳангоми истифодаи Docker.

Манбаъ: will.com

Илова Эзоҳ