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

Хей Хабр! Представям на вашето внимание превода на статията „Използвайте Camunda като лесен за използване REST-базиран двигател за оркестрация и работен поток (без да докосвате Java)“ от Бернд Рюкер.

07.07.2020 г., превод статии Бернд Рукър

Използване на 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 Virtual Machine (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, JVM или Tomcats. Docker файлове и основна документация (например инструкции за свързване към необходимите бази данни) са достъпни на 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), използвайки някои вградени конектори, но също така поставя работните елементи в един вид вграден ред. След това работникът може да извлече работни елементи чрез REST, да изпълни работата и да каже на Camunda да завърши (принцип на издърпване).

Използване на 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

Тогава го кажи на Камунда работник свърши работа (обърнете внимание, че трябва да въведете идентификатора на външна задача, получен в първата заявка):

  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;
  • ° С #:връзка и връзка. И двата проекта са в междинно състояние и практически неактивни, но могат да послужат като добра отправна точка;
  • 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 като в тези примери: build Maven с конфигурация за война или монтаж 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.

Източник: www.habr.com

Добавяне на нов коментар