Використання Camunda для зручного оркестрування на основі REST та Workflow Engine (без Java)

Привіт, Хабре! Представляю вашій увазі переклад статті «Застосування Camunda є простим для використання REST-основаною оркестрацією і workflow engine (without touching 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, ви можете легко змінити Докер-файл.

Однак у запуску 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-Principle), використовуючи деякі вбудовані конектори, але й поміщати робочі елементи у своєрідну вбудовану черговість. Після цього worker може отримати робочі елементи через REST, виконати роботу та повідомити Camunda про завершення (Pull-Principle).

Використання Camunda для зручного оркестрування на основі REST та Workflow Engine (без Java)

Отже, спочатку вам потрібно виконати fetchAndLock (оскільки інші worker можуть отримувати завдання одночасно для масштабування системи):

  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, що worker завершив роботу (Зверніть увагу, що ви повинні ввести ідентифікатор external task, отриманий у першому запиті):

  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);
  // 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 як у таких прикладах: складання 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 дуже просто, незалежно від мови, яку ви використовуєте. Ключовий момент полягає в тому, що вся взаємодія здійснюється через API REST. Установка також досить проста, особливо при використанні Docker.

Джерело: habr.com

Додати коментар або відгук