Čau Habr! Předkládám vaší pozornosti překlad článku od Bernda Rückera.
07.07.2020/XNUMX/XNUMX, překlad Bernd Rucker

Často diskutuji o architektuře mikroslužeb s lidmi, kteří nepoužívají Java: vývojáři C#, vývojáři Node.JS/JavaScript nebo příznivci Golang. Všichni se potýkají s tím, že potřebují orchestrační mechanismus v architektuře mikroslužeb nebo jen nástroj pro zefektivnění pracovního postupu a získání schopnosti objednávat, zpracovávat timeouty, Saga a kompenzovat transakce.
Platforma BPM s skvělé pro takové úkoly. Přívětivost pro vývojáře je jednou z klíčových vlastností produktu. Když se ale podíváte do jeho dokumentace, můžete nabýt dojmu, že Camunda svou „vstřícností“ míří hlavně na vývojáře v Javě. Platforma poskytuje spoustu možností pro připojení vlastních funkcí a rozšíření, ale vše se děje v Javě. Je to skutečné?
Ne! Ve skutečnosti můžete snadno spustit Camundu bez jakýchkoli znalostí Javy a nastavit architekturu pro kód v libovolném jazyce podle vašeho výběru. V tomto článku se podíváme na:
- základní architektura;
- REST API
- poradenství ohledně stávajících klientských knihoven pro jazyky jiné než Java;
- příklad pomocí C# a Node.JS;
- způsoby, jak spustit server Camunda (Docker nebo Tomcat).
architektura
Camunda je napsána v Javě a ke spuštění potřebuje Java Virtual Machine (JVM). Camunda poskytuje REST API, které vám umožňuje psát v libovolném jazyce a používat REST s Camundou:

Pracovní postupy v Camundě jsou definovány v BPMN, což je v podstatě soubor XML. Dá se modelovat s .
Spuštění Camundy prostřednictvím předem vytvořeného obrazu Dockeru
Nejjednodušší způsob, jak spustit Camundu, je použít Docker. Alternativní způsoby spuštění Camundy jsou popsány dále v tomto článku.

V tomto případě stačí spustit:
docker run -d -p 8080:8080 camunda/camunda-bpm-platform:latest
Nemusíš se bát Linux, virtuální stroje Java nebo Tomcaty. Soubory Dockerfiles a základní dokumentace (například pokyny k připojení k požadovaným databázím) jsou k dispozici na adrese .
Pokud chcete provozovat Camunda Enterprise Edition, můžete to snadno změnit .
Spuštění Camundy s Dockerem má však jednu nevýhodu: skončíte s verzí Tomcatu, která ne vždy obsahuje nejnovější opravy. Chcete-li tento problém vyřešit, můžete vytvořit vlastní bitovou kopii Dockeru na základě požadované distribuce Tomcat, jak je znázorněno v tomto příkladu, nebo použít jedno z řešení popsaných níže.
Nasazení procesního modelu
Podívejme se na příklad pomocí šablony Saga pro klasickou rezervaci zájezdu, kde chcete spustit tři akce za sebou a ladně kompenzovat úspěšně dokončené akce v případě pozdějšího selhání. Ve formě BPMN to vypadá takto:

Nyní můžete použít . Řekněme, že to uložíte jako trip.bpmn a spustíte Camundu přes Docker, takže je k dispozici na 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/creat
Nyní můžete běžet pomocí REST API a předejte data, která chcete vidět jako proměnné instance pracovního postupu:
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
Další zajímavá otázka je: jak Camunda nazývá procedury, jako je rezervace auta? Camunda může nejen okamžitě volat služby (princip Push) pomocí některých vestavěných , ale také dát pracovní předměty do jakéhosi vestavěného pořádku. Pracovník pak může vyzvednout pracovní položky přes REST, provést práci a říct Camundovi, aby dokončil (Princip tažení).

Nejprve tedy musíte provést (protože ostatní pracovníci mohou současně přijímat úkoly pro škálování systému):
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
Tak to řekni Camundovi (všimněte si, že musíte zadat externí ID úlohy přijaté v prvním požadavku):
curl
-H "Content-Type: application/json"
-X POST
-d <!-- -->'{"workerId":"worker123", "variables": {}}'<!-- -->
http://localhost:8080/engine-rest/<!-- -->external-task/EXTERNAL_TASK_ID/complete
To je ono – ještě jsi žádnou Javu nepotřeboval, že? A to pro začátek stačí!
Klientské knihovny
Volání REST API je snadné v jakémkoli programovacím jazyce. V JavaScriptu se to pohodlně provádí pomocí JQuery a v C# pomocí System.Net.Http a Newtonsoft.Json. Ale to zabere čas. Takže stačí použít nějakou klientskou knihovnu.
V současné době je k dispozici několik hotových klientských knihoven:
- JavaScript: . Podporováno Camundou;
- Java: . Podporováno Camundou;
- C #: и . Oba tyto projekty jsou v přechodném stavu a jsou prakticky nečinné, ale mohou sloužit jako dobrý výchozí bod;
- PHP: - není příliš kompletní a neobsahuje nejnovější změny API, ale znám projekty, které to používají.
S výjimkou JavaScriptu a Javy nejsou klientské knihovny součástí samotného produktu Camunda. Neočekávejte, že budou podporovat všechny funkce REST API Camundy. To, že knihovna neposkytuje určitou funkci, neznamená, že tam není, vždy zkontrolujte Camunda REST API. Referenční projekty používají knihovny jako výchozí bod a šablonu.
Příklad C#
Pomocí výše uvedené klientské knihovny můžeme jednoduše napsat:
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", "..." }
});
Plně funkční zdrojový kód lze nalézt online: . Další příklad je k dispozici na .
Příklad s 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();
Více informací naleznete na webových stránkách
Alternativní způsoby spuštění Camundy
Vlastní obrázek dockeru s „Camundou standalone WAR“
Jako alternativu k předem vytvořenému obrazu Docker z Camundy si můžete Tomcat připravit sami (například na základě oficiálních obrázků Docker Tomcat) a poté do něj Camundu zkopírovat jako jeden z tzv. WAR souborů.

Pokud máte mnoho dalších požadavků a můžete nastavit prostředí pro sestavení Java, můžete také nastavit Camunda Standalone war. Nastavte sestavení Maven jako v těchto příkladech: build nebo montáž .
Spuštění distribuce Camunda Tomcat
Další možností je jednoduše stáhnout distribuci Camunda Tomcat, rozbalit ji a spustit. K tomu potřebujete pouze Java Runtime Environment (JRE) nainstalované na vašem počítači. Může to být snadno .

Chcete-li změnit databázi nebo udělat cokoli jiného, musíte nakonfigurovat Tomcat jako . Vím, že Tomcat může znít složitě, ale ve skutečnosti je to velmi jednoduché. A Google zná odpovědi na vše, co může být v procesu vyžadováno.
Spuštění Camundy pomocí Tomcatu
Poslední alternativou je nastavit Tomcat sami a nainstalovat do něj Camundu, Díky tomu budete mít možnost použít libovolnou verzi Tomcatu, nebo si ji například nainstalovat jako službu. Windows.
Zahájení výroby Camundy
To obvykle vyžaduje nějaké konečné nastavení ke spuštění Camundy. V Camundě existují pokyny, které to popisují velmi podrobně, ale nebudu se jimi v tomto článku zabývat – uvedu pouze jeden příklad: REST API distribuce není ve výchozím nastavení nakonfigurováno pro ověřování. Možná to budete chtít změnit.
Shrneme-up
Jak jste si možná všimli, začít s Camundou je velmi snadné, bez ohledu na jazyk, který používáte. Klíčovým bodem je, že veškerá komunikace probíhá prostřednictvím REST API. Instalace je také docela snadná, zejména při použití Dockeru.
Zdroj: www.habr.com
