Користење на Камунда за лесна оркестрација базирана на REST и Работен мотор (без Java)

Еј Хабр! Ви го презентирам преводот на статијата „Користете ја Камунда како лесен за употреба мотор за оркестрација и работа базиран на REST (без допирање на Јава)“ од Бернд Рикер.

07.07.2020, превод Член Бернд Рикер

Користење на Камунда за лесна оркестрација базирана на REST и Работен мотор (без Java)

Често разговарам за архитектура на микросервис со луѓе кои не се Java: програмери на C#, Node.JS/JavaScript или ентузијасти од Golang. Сите тие се соочени со фактот дека им е потребен мотор за оркестрација во архитектура на микросервис или само алатка за оптимизирање на работниот тек и стекнување способност за нарачка, справување со тајмаути, Сага и компензирање трансакции.

BPM платформа со отворен код од Камунда одлично за такви задачи. Пријатноста кон програмерите е една од клучните карактеристики на производот. Но, ако ја погледнете неговата документација, можеби ќе добиете впечаток дека „пријателството“ на Камунда главно е насочено кон развивачите на Java. Платформата обезбедува многу опции за поврзување на вашите сопствени функции и екстензии, но сето тоа е направено во Java. Дали е тоа навистина?

Не! Всушност, можете лесно да ја стартувате Камунда без никакво знаење за Java и да ја конфигурирате архитектурата да кодира на кој било јазик по ваш избор. Во оваа статија ќе разгледаме:

  • основна архитектура;
  • REST API;
  • совети за постоечките библиотеки на клиенти за други јазици освен Java;
  • пример користејќи C# и Node.JS;
  • начини за стартување на серверот Camunda (Docker или Tomcat).

архитектура

Camunda е напишана во Java и бара Java Virtual Machine (JVM) за да работи. Камунда обезбедува REST API што ви овозможува да пишувате на кој било јазик што го сакате и да користите REST со Камунда:

Користење на Камунда за лесна оркестрација базирана на REST и Работен мотор (без Java)

Работните текови во Камунда се дефинирани во BPMN, што во основа е XML-датотека. Може да се моделира користејќи Камунда Моделер.

Водење на Камунда преку претходно изградена слика на Docker

Најлесен начин да ја стартувате Камунда е да користите Docker. Алтернативните начини за лансирање на Камунда се опишани подоцна во оваа статија.

Користење на Камунда за лесна оркестрација базирана на REST и Работен мотор (без Java)

Во овој случај, само стартувајте:

  docker run -d -p 8080:8080 camunda/camunda-bpm-platform:latest

Не треба да се грижите за Linux, Java виртуелните машини или Tomcats. Dockerfiles и основната документација (на пример, инструкции за поврзување со потребните бази на податоци) се достапни на Github.

Ако сакате да ја стартувате Camunda Enterprise Edition, можете лесно да го промените dockerfile.

Сепак, има една лоша страна за водење на Камунда со помош на Docker: ќе завршите со верзија на Tomcat која не секогаш ги вклучува најновите поправки. За некако да го заобиколите ова, можете сами да креирате слика на Docker врз основа на саканата дистрибуција на Tomcat, како што е прикажано во овој пример, или да користите едно од решенијата опишани подолу.

Распоредување на модел на процес

Ајде да погледнеме пример со користење на шаблонот Сага за класична резервација за патување каде што сакате да активирате три дејства по ред и благодатно да ги надоместите успешните дејства во случај на подоцнежен неуспех. Презентирано во форма на БПМН, изгледа вака:

Користење на Камунда за лесна оркестрација базирана на REST и Работен мотор (без Java)

Сега можете да користите REST API за распоредување на процесен модел. Да речеме дека сте ја зачувале како trip.bpmn и сте ја управувале Камунда преку 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

Следното интересно прашање е како Камунда ги активира процедурите како резервација на автомобил? Камунда не само што може веднаш да повика услуги (Push-Principle), користејќи некои вградени конектори, но и поставете ги работните предмети во еден вид вграден ред. Работникот потоа може да ги земе работните ставки преку REST, да ја изврши работата и да и каже на Камунда да заврши (Повлечете-принцип).

Користење на Камунда за лесна оркестрација базирана на REST и Работен мотор (без 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

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

  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: линк. Поддржано од Камунда;
  • Јава: линк. Поддржано од Камунда;
  • Ц #:линк и линк. И двата проекти се во средна состојба и практично мируваат, но можат да послужат како добра почетна точка;
  • PHP: линк не е многу комплетна библиотека и не ги вклучува најновите промени на API, но знам за проекти кои ја користат.

Со исклучок на JavaScript и Java, библиотеките на клиентите не се дел од самиот производ на Камунда. Не очекувајте да ги поддржат сите карактеристики на REST API на Камунда. Само затоа што библиотеката не обезбедува одредена функција не значи дека ја нема, секогаш проверувајте го Camunda REST API. Типичните проекти користат библиотеки како почетна точка и шаблон.

Пример со 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

Алтернативни начини за започнување на Камунда

Прилагодена слика на Docker со „Camunda standalone WAR“

Како алтернатива на претходно изградената слика на Docker од Камунда, можете сами да го подготвите Tomcat (на пример, врз основа на официјалните слики на Docker Tomcat) и потоа да ја копирате Camunda во неа како една од таканаречените датотеки WAR.

Користење на Камунда за лесна оркестрација базирана на REST и Работен мотор (без Java)

Ако имате многу дополнителни барања и можете да ја приспособите околината за градење Java, можете исто така да ја конфигурирате Camunda Standalone war. Поставете изработка на Maven како во овие примери: изгради Maven со конфигурација за војна или склопување Maven со преклопување.

Лансирање на дистрибуцијата на Camunda Tomcat

Друга опција е едноставно да ја преземете дистрибуцијата на Camunda Tomcat, да ја отпакувате и да ја стартувате. За да го направите ова, потребна ви е само Java Runtime Environment (JRE) инсталирана на вашиот компјутер. Тоа може да биде лесно преземете од овде.

Користење на Камунда за лесна оркестрација базирана на REST и Работен мотор (без Java)

За да ја промените базата на податоци или да направите нешто друго, треба да го конфигурирате Tomcat like опишани во документацијата. Знам дека Tomcat може да изгледа комплицирано, но всушност е многу едноставно. И Google ги има одговорите на сè што може да ви треба во процесот.

Вклучување на Камунда со помош на Tomcat

Последната алтернатива е сами да го конфигурирате Tomcat и да ја инсталирате Камунда во него, следејќи го описот за инсталација. Ова ќе ви даде можност да користите која било верзија на Tomcat што ја претпочитате или, на пример, да ја инсталирате како услуга на Windows.

Лансирање на Камунда во производство

Вообичаено, ова ќе бара од вас да направите некое финално поставување за да ја активирате Камунда. Камунда има упатства кои го опишуваат ова во многу детали, но нема да ги допирам во оваа статија - само ќе дадам еден пример: REST API на дистрибуцијата не е стандардно конфигуриран за автентикација. Можеби ќе сакате да го промените ова.

Сумирајќи-up

Како што можеби забележавте, започнувањето со Камунда е многу лесно, без оглед на јазикот што го користите. Клучната точка е дека целата комуникација се врши преку REST API. Инсталирањето е исто така прилично едноставно, особено кога се користи Docker.

Извор: www.habr.com

Додадете коментар