Използване на Camunda за удобно оркестриране на базата на REST и Workflow Engine (без Java)

Здравей, Хабър! Представям ви превод на статия «Използвайте Camunda като лесна за употреба REST-базирана оркестрация и работен поток (без да докосвате 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, можете лесно да промените Dockerfile.

Въпреки че 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 "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).

Използване на Camunda за удобно оркестриране на базата на REST и Workflow Engine (без 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

След това информирайте 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 {
        FileParameter.FromManifestResource(Assembly.GetExecutingAssembly(), "FlowingTripBookingSaga.Models.FlowingTripBookingSaga.bpmn")
     });
  
  // Регистриране на работници
  registerWorker("reserve-car", externalTask => {
    // тук можете да направите истинския етап! Като sysout :-)
    Console.WriteLine("Резервиране на кола...");
    camunda.ExternalTaskService.Complete(workerId, externalTask.Id);
  });
  registerWorker("cancel-car", externalTask => {
    Console.WriteLine("Отказване на кола...");
    camunda.ExternalTaskService.Complete(workerId, externalTask.Id);
  });
  registerWorker("book-hotel", externalTask => {
    Console.WriteLine("Резервиране на хотел...");
    camunda.ExternalTaskService.Complete(workerId, externalTask.Id);
  });
  // Регистрирайте повече работници...
  
  StartPolling();
  
  string processInstanceId = camunda.BpmnWorkflowService.StartProcessInstance("FlowingTripBookingSaga", new Dictionary()
    {
      {"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 + " - добавено нещо";
    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

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster