Салом, Хабр! Ман ба диққати шумо тарҷумаи мақоларо пешкаш мекунам
07.07.2020, тарҷума
Ман аксар вақт меъмории микросервисро бо одамони ғайри Java муҳокима мекунам: C#, таҳиягарони Node.JS/JavaScript ё дӯстдорони Голанг. Ҳамаи онҳо бо он рӯ ба рӯ мешаванд, ки ба онҳо як муҳаррики оркестрсозӣ дар меъмории микросервис ё танҳо асбобе барои оптимизатсияи ҷараёни кор ва ба даст овардани қобилияти фармоиш, коркарди вақт, Сага ва транзаксияҳои ҷубронкунанда лозим аст.
Платформаи BPM бо
Не! Дарвоқеъ, шумо метавонед Camunda-ро бе ягон дониши Java ба осонӣ иҷро кунед ва меъмориро барои рамзгузорӣ бо дилхоҳ забони интихобкардаатон танзим кунед. Дар ин мақола мо дида мебароем:
- меъмории асосӣ;
- API REST;
- маслиҳат оид ба китобхонаҳои муштарӣ барои забонҳои ғайр аз Java;
- мисоли истифодаи C# ва Node.JS;
- роҳҳои иҷро кардани сервери Camunda (Docker ё Tomcat).
меъморӣ
Camunda дар Java навишта шудааст ва барои кор кардан мошини виртуалии Java (JVM) -ро талаб мекунад. Camunda REST API-ро пешниҳод мекунад, ки ба шумо имкон медиҳад бо ҳар забони дилхоҳатон нависед ва REST-ро бо Camunda истифода баред:
Ҷараёни корӣ дар Camunda дар BPMN муайян карда мешавад, ки асосан файли XML мебошад. Он метавонад бо истифода аз моделсозӣ
Иҷрои Camunda тавассути тасвири қаблан сохташудаи Docker
Роҳи осонтарини иҷро кардани Camunda ин истифодаи Docker мебошад. Роҳҳои алтернативии идора кардани Camunda дар ин мақола дар поён оварда шудаанд.
Дар ин ҳолат, танҳо иҷро кунед:
docker run -d -p 8080:8080 camunda/camunda-bpm-platform:latest
Ба шумо лозим нест, ки дар бораи Linux, Java Virtual Machines ё Tomcats хавотир шавед. Докерфайлҳо ва ҳуҷҷатҳои асосӣ (масалан, дастурҳо оид ба пайвастшавӣ ба пойгоҳи додаҳои зарурӣ) дар ин ҷо дастрасанд
Агар шумо хоҳед, ки Camunda Enterprise Edition -ро иҷро кунед, шумо метавонед ба осонӣ тағир диҳед
Аммо, як нуқсони иҷро кардани Camunda бо истифода аз Docker вуҷуд дорад: шумо бо версияи Tomcat хоҳед ёфт, ки на ҳамеша ислоҳҳои охиринро дар бар мегирад. Барои рафъи ин, шумо метавонед худатон дар асоси тақсимоти дилхоҳи Tomcat тасвири Docker эҷод кунед, тавре ки дар ин мисол нишон дода шудааст, ё яке аз ҳалли дар зер тавсифшударо истифода баред.
Ҷойгир кардани модели раванд
Биёед мисолеро бо истифода аз қолаби Saga барои фармоиши сайёҳии классикӣ бубинем, ки дар он шумо мехоҳед се амалро пай дар пай ба кор баред ва дар сурати нокомии дертар амалҳои муваффақро ҷуброн кунед. Дар шакли BPMN пешниҳод шудааст, чунин менамояд:
Акнун шумо метавонед истифода баред
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
Акнун шумо метавонед давед
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), бо истифода аз баъзе дарунсохт
Пас, аввал шумо бояд кор кунед
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
Он гоҳ ба Камунда бигӯед
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();
Маълумоти бештарро дар вебсайт пайдо кардан мумкин аст
Роҳҳои алтернативии оғоз кардани Камунда
Тасвири фармоишии Docker бо "Camunda WAR standalone"
Ҳамчун алтернатива ба тасвири қаблан сохташудаи Docker аз Camunda, шумо метавонед Tomcat-ро худатон омода кунед (масалан, дар асоси тасвирҳои расмии Docker Tomcat) ва сипас Camunda-ро ба он ҳамчун яке аз файлҳои ба ном WAR нусхабардорӣ кунед.
Агар шумо бисёр талаботҳои иловагӣ дошта бошед ва муҳити сохтани Java-ро танзим карда тавонед, шумо инчунин метавонед ҷанги Standalone Camunda-ро танзим кунед. Сохтани Mavenро тавре дар ин мисолҳо насб кунед: созед
Оғози тақсимоти Camunda Tomcat
Варианти дигар ин аст, ки танҳо зеркашӣ кардани тақсимоти Camunda Tomcat, кушодани он ва иҷро кардани он. Барои ин ба шумо танҳо Java Runtime Environment (JRE) лозим аст, ки дар компютери шумо насб карда шудааст. Он метавонад ба осонӣ
Барои тағир додани пойгоҳи додаҳо ё ягон кори дигаре, шумо бояд Tomcat-ро ба монанди танзим кунед
Иҷроиши Camunda бо истифода аз Tomcat
Варианти охирин ин аст, ки Tomcat-ро худатон танзим кунед ва дар он Camunda насб кунед,
Дар истехсолот ба кор андохта шудани Камунда
Одатан, ин аз шумо талаб мекунад, ки баъзе танзимоти ниҳоиро иҷро кунед, то Camunda кор кунад. Camunda дорои дастурҳое мебошад, ки инро ба таври муфассал тавсиф мекунанд, аммо ман дар ин мақола ба онҳо дахл намекунам - ман танҳо як мисол меорам: REST API-и тақсимот бо нобаёнӣ барои аутентификатсия танзим карда нашудааст. Шояд шумо инро тағир додан мехоҳед.
Натиҷа
Тавре ки шумо мушоҳида кардаед, оғоз кардан бо Camunda, новобаста аз забоне, ки шумо истифода мебаред, хеле осон аст. Нуқтаи асосӣ дар он аст, ки ҳама иртибот тавассути REST API анҷом дода мешавад. Насбкунӣ низ хеле содда аст, махсусан ҳангоми истифодаи Docker.
Манбаъ: will.com