Често обсъждам архитектурата на микросервизите с хора, които не са 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 са дефинирани в BPMN, който основно е XML файл. Може да се моделира с Camunda Modeler.
Пускане на Camunda през предварително изградено изображение на Docker
Най-лесният начин да стартирате Camunda е да използвате Docker. Алтернативни начини за стартиране на Camunda са описани по-нататък в тази статия.
В този случай просто стартирайте:
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, той изглежда така:
Сега можете да използвате REST API за внедряване на модел на процес. Да приемем, че го запазвате като trip.bpmn и стартирате Camunda чрез Docker, така че да е наличен на localhost:8080:
Сега можете да бягате нови екземпляри на работния процес като използвате REST API и предадете данните, които искате да видите като променливи на екземпляр на работния поток:
Следващият интересен въпрос е: как Camunda нарича процедури като резервиране на кола? Camunda може не само да извиква незабавно услуги (принцип Push), използвайки някои вградени конектори, но също така поставя работните елементи в един вид вграден ред. След това работникът може да извлече работни елементи чрез REST, да изпълни работата и да каже на Camunda да завърши (принцип на издърпване).
Така че първо трябва да изпълните fetchAndLock (тъй като други работници могат да получават задачи по едно и също време, за да мащабират системата):
Това е - все още не сте имали нужда от Java, нали? И това е достатъчно, за да започнете!
Клиентски библиотеки
Извикването на REST API е лесно на всеки език за програмиране. В JavaScript това се прави удобно с помощта на JQuery, а в C# с помощта на System.Net.Http и Newtonsoft.Json. Но това ще отнеме време. Така че можете просто да използвате някаква клиентска библиотека.
В момента има няколко готови клиентски библиотеки:
° С #:връзка и връзка. И двата проекта са в междинно състояние и практически неактивни, но могат да послужат като добра отправна точка;
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", "..." }
});
Напълно работещият изходен код може да бъде намерен онлайн: връзка. Друг пример е достъпен на връзка.
Повече информация можете да намерите на уебсайта github.com
Алтернативни начини за стартиране на Camunda
Персонализирано изображение на Docker с „Camunda standalone WAR“
Като алтернатива на предварително създадено изображение на Docker от Camunda, можете сами да подготвите Tomcat (например въз основа на официалните изображения на Docker Tomcat) и след това да копирате Camunda в него като един от така наречените WAR файлове.
Ако имате много допълнителни изисквания и можете да настроите среда за изграждане на Java, можете също да настроите Camunda Standalone war. Настройте компилация на Maven като в тези примери: build Maven с конфигурация за война или монтаж Maven с Overlay.
Стартиране на разпространението на 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.