Здравей, Хабър! Представям ви превод на статия автор Bernd Rücker.
07.07.2020 г., превод Bernd Rücker

Често обсъждам микросервизна архитектура с хора, далече от Java: разработчици на C#, Node.JS/JavaScript или любители на Golang. Всички те се сблъскват с необходимостта от механизъм за оркестрация в микросервизната архитектура или просто инструмент за оптимизация на работния процес и за възможности за организиране, обработка на таймаути, Saga и компенсаторни транзакции.
BPM платформа с отлично подхожда за такива задачи. Приятелството към разработчика е една от основните характеристики на продукта. Но ако погледнете документацията му, може да получите впечатление, че основното "приятелство" на Camunda е насочено към Java разработчици. Платформата предлага много възможности за свързване на собствените функции и разширения, но всичко това се прави на Java. Вярно ли е това?
Не! Всъщност можете лесно да стартирате Camunda без никакви знания по Java и да настроите архитектурата за код на всеки език по ваш избор. В тази статия ще разгледаме:
- основната архитектура;
- REST API;
- съвети относно съществуващите клиентски библиотеки за езици, различни от 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 или Tomcats. Dockerfiles и основната документация (например, инструкция за свързване с необходимите бази данни) са достъпни на .
Ако искате да стартирате Camunda Enterprise Edition, можете лесно да промените .
Въпреки че Camunda се стартира с Docker, има един недостатък: получавате версия на Tomcat, която не винаги включва последните корекции. За да заобиколите това, можете сами да създадете Docker имидж на базата на необходимото разпространение на Tomcat, както е показано в този пример, или да използвате едно от описаните по-долу решения.
Разгръщане на модел на процес
Нека разгледаме пример, използвайки шаблона Saga за класическо резервиране на пътувания, където искате да извикате три действия последователно и да компенсирате успешно извършените действия в случай на по-късно провал. Представен в формата BPMN той изглежда по следния начин:

Сега можете да използвате . Да предположим, че сте го запазили с името 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 "trip.bpmn=@trip.bpmn"
http://localhost:8080/engine-rest/deployment/create
Сега можете да стартирате чрез 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), използвайки някои вградени , но също така да поставя работни елементи в някаква вградена последователност. След което работникът може да получи работните елементи чрез REST, да извърши работата и да информира Camunda за завършването (Pull-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
След това информирайте Camunda, че (обърнете внимание, че трябва да въведете идентификатора на външната задача, получен при първото запитване):
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);
// Деплой на BPMN XML файла от ресурсите
camunda.RepositoryService.Deploy("trip-booking", new ListПълният работещ изходен код може да бъде намерен в интернет: . Друг пример е наличен на адрес .
Пример с 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 + " - добавено нещо";
callback(null, {
variables: {
someNewData: someNewData
}
});
});
workers.shutdown();
По-подробна информация може да бъде намерена на сайта
Алтернативни методи за стартиране на Camunda
Персонализиран Docker образ с «Camunda standalone WAR»
Като алтернатива на готовия Docker образ от Camunda, можете сами да подготвите Tomcat (напр. на базата на официалните Docker образи на Tomcat), а след това да копирате Camunda в него като един от т. нар. WAR файлове.

Ако имате много допълнителни изисквания и можете да конфигурирате среда за изграждане на Java, можете също да настроите Camunda Standalone war. Настройте изграждането на Maven, както в тези примери: изграждане или изграждане .
Стартиране на дистрибутива на Camunda Tomcat
Друг вариант е просто да изтеглите дистрибутива на Camunda Tomcat, да го разархивирате и да го стартирате. За това е необходимо само Java Runtime Environment (JRE), инсталирано на вашия компютър. Може лесно .

За да промените базата данни или да направите нещо друго, трябва да конфигурирате Tomcat, както . Знам, че Tomcat може да изглежда сложен, но всъщност е много прост. А Google знае отговорите на всичко, което може да ви е необходимо в процеса.
Стартиране на Camunda с Tomcat
Последната алтернатива е сами да настроите Tomcat и да инсталирате Camunda в него, . Това ще предостави възможността да се използва всяка версия на Tomcat, която предпочитате, или например да я инсталирате като Windows услуга.
Стартиране на Camunda в продукция
Обикновено, за това ще бъде необходимо да се извършат някои окончателни настройки за стартиране на Camunda. В Camunda има препоръки, които много подробно го описват, но няма да ги разглеждам в тази статия — ще спомена само един пример: REST API на дистрибутива по подразбиране не е настроен за удостоверяване. Може да пожелаете да промените това.
Подводни заключения
Както може би сте забелязали, да започнете работа с Camunda е много лесно, независимо от езика, който използвате. Ключовият момент е, че всичкото взаимодействие се осъществява чрез REST API. Инсталацията също е доста проста, особено при използване на Docker.
Източник: habr.com
