Hallo, Habr! Ich präsentiere Ihnen eine Übersetzung des Artikels. Autor Bernd Rücker.
07.07.2020, Übersetzung Bernd Rücker

Ich diskutiere oft über Microservices-Architekturen mit Menschen, die wenig Erfahrung mit Java haben: Entwicklern von C#, Node.JS/JavaScript oder Anhänger von Golang. Alle stehen vor der Herausforderung, dass sie einen Orchestrierungsmechanismus in ihrer Microservices-Architektur benötigen oder einfach ein Werkzeug zur Optimierung von Workflows, um zeitliche Abläufe, Sagas und kompensierende Transaktionen zu organisieren.
Die BPM-Plattform mit eignet sich hervorragend für solche Aufgaben. Entwicklerfreundlichkeit ist eines der Hauptmerkmale des Produkts. Aber wenn man sich die Dokumentation ansieht, könnte der Eindruck entstehen, dass diese „Freundlichkeit“ hauptsächlich auf Java-Entwickler ausgerichtet ist. Die Plattform bietet viele Möglichkeiten zur Anbindung eigener Funktionen und Erweiterungen, aber das geschieht alles in Java. Ist das wirklich so?
Nein! In Wahrheit kann man Camunda ganz einfach ohne jegliche Java-Kenntnisse starten und die Architektur für Code in jeder gewünschten Sprache einrichten. In diesem Artikel werden wir betrachten:
- die grundlegende Architektur;
- REST API;
- Tipps zu bestehenden Client-Bibliotheken für andere Sprachen als Java;
- ein Beispiel für die Verwendung von C# und Node.JS;
- Möglichkeiten zum Starten des Camunda-Servers (Docker oder Tomcat).
Architektur
Camunda ist in Java geschrieben und benötigt zum Ausführen eine Java Virtual Machine (JVM). Camunda bietet eine REST API, die es Ihnen erlaubt, in jeder Sprache zu schreiben, die Sie möchten, und REST mit Camunda zu nutzen:

Workflows in Camunda werden in BPMN definiert, was hauptsächlich eine XML-Datei darstellt. Diese kann mithilfe von .
Camunda über ein vorgefertigtes Docker-Image zu starten,
Der einfachste Weg, Camunda zu starten, ist die Verwendung von Docker. Alternative Möglichkeiten, Camunda zu starten, werden im weiteren Verlauf dieses Artikels beschrieben.

In diesem Fall reicht es aus, einfach Folgendes auszuführen:
docker run -d -p 8080:8080 camunda/camunda-bpm-platform:latest
Sie müssen sich keine Gedanken über Linux, Java Virtual Machines oder Tomcats machen. Dockerfiles und die grundlegende Dokumentation (z. B. Anleitungen zur Anbindung an die benötigten Datenbanken) sind verfügbar unter .
Wenn Sie die Camunda Enterprise Edition starten möchten, können Sie dies ganz einfach ändern. .
Es gibt jedoch einen Nachteil beim Starten von Camunda mit Docker: Sie erhalten eine Tomcat-Version, die nicht immer die neuesten Fehlerbehebungen enthält. Um dies zu umgehen, können Sie ein Docker-Image auf der Grundlage der gewünschten Tomcat-Distribution selbst erstellen, wie in diesem Beispiel gezeigt, oder eine der unten beschriebenen Lösungen nutzen.
Bereitstellung des Prozessmodells
Betrachten wir ein Beispiel, das das Saga-Muster für die klassische Buchung von Reisen verwendet, bei dem Sie drei Aktionen nacheinander aufrufen und erfolgreich durchgeführte Aktionen bei einem späteren Fehler ordnungsgemäß kompensieren möchten. In Form von BPMN sieht das wie folgt aus:

Jetzt können Sie . Angenommen, Sie haben es unter dem Namen trip.bpmn gespeichert und Camunda über Docker gestartet, sodass es unter localhost:8080 verfügbar ist:
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/create
Jetzt können Sie mit der REST API starten und die Daten übergeben, die Sie als Variablen der Workflow-Instanz sehen möchten:
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
Die nächste interessante Frage ist: Wie ruft Camunda Verfahren wie die Autoreservierung auf? Camunda kann nicht nur sofort Dienste (Push-Prinzip) mithilfe einiger eingebauter , sondern auch Arbeitsobjekte in eine Art internes Warteschlangensystem stellen. Danach kann der Worker Arbeitsobjekte über REST abrufen, die Arbeit ausführen und Camunda über den Abschluss informieren (Pull-Prinzip).

Zuerst müssen Sie ausführen (da andere Worker gleichzeitig Aufgaben zum Skalieren des Systems abrufen können):
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
Teilen Sie Camunda dann mit, dass (beachten Sie, dass Sie die ID der externen Aufgabe, die Sie in der ersten Anfrage erhalten haben, eingeben müssen):
curl
-H "Content-Type: application/json"
-X POST
-d '{"workerId":"worker123", "variables": {}}'
http://localhost:8080/engine-rest/external-task/EXTERNAL_TASK_ID/complete
Das ist alles — Sie haben immer noch kein Java benötigt, oder? Und das ist ausreichend, um loszulegen!
Kundenbibliotheken
Es ist einfach, das REST-API in jeder Programmiersprache aufzurufen. In JavaScript ist es bequem mit JQuery, und in C# nutzen Sie System.Net.Http und Newtonsoft.Json. Aber das benötigt Zeit. Daher können Sie einfach eine der verfügbaren Kundenbibliotheken verwenden.
Derzeit sind mehrere fertige Kundenbibliotheken verfügbar:
- JavaScript: . Camunda wird unterstützt;
- Java: . Camunda wird unterstützt;
- C#: und . Beide Projekte sind in einem vorläufigen Zustand und nahezu inaktiv, können aber als gute Ausgangsbasis dienen;
- PHP: — eine nicht besonders vollständige Bibliothek, die nicht die neuesten API-Änderungen enthält, aber ich kenne Projekte, die sie verwenden.
Außer JavaScript und Java sind die Kundenbibliotheken nicht Teil des Camunda-Produkts selbst. Erwarten Sie nicht, dass sie alle Funktionen des Camunda REST-APIs unterstützen. Wenn eine Bibliothek eine bestimmte Funktion nicht bereitstellt, bedeutet das nicht, dass sie nicht existiert; überprüfen Sie immer das Camunda REST-API. Typische Projekte verwenden Bibliotheken als Ausgangspunkt und Vorlage.
Beispiel mit C#
Mit der oben genannten Kundenbibliothek können wir einfach Folgendes schreiben:
var camunda = new CamundaEngineClient("http://localhost:8080/engine-rest/engine/default/", null, null);
// Deployen Sie die BPMN-XML-Datei aus den Ressourcen
camunda.RepositoryService.Deploy("trip-booking", new ListDer vollständig funktionsfähige Quellcode ist online zu finden: . Ein weiteres Beispiel finden Sie unter .
Пример с 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 + " - etwas hinzugefügt";
callback(null, {
variables: {
someNewData: someNewData
}
});
});
workers.shutdown();
Weitere Informationen finden Sie auf der Website
Alternative Methoden zum Starten von Camunda
Benutzerdefiniertes Docker-Image mit „Camunda Standalone WAR“
Anstelle des vorgefertigten Docker-Images von Camunda können Sie Tomcat selbst vorbereiten (zum Beispiel basierend auf den offiziellen Docker-Bildern von Tomcat) und Camunda als eine der sogenannten WAR-Dateien hinein kopieren.

Wenn Sie viele zusätzliche Anforderungen haben und die Java-Build-Umgebung anpassen können, können Sie auch das Camunda Standalone WAR selbst anpassen. Konfigurieren Sie den Maven-Build wie in diesen Beispielen: Build oder Build .
Starten der Camunda Tomcat-Distribution
Eine weitere Möglichkeit besteht darin, einfach die Camunda Tomcat-Distribution herunterzuladen, zu entpacken und zu starten. Dafür benötigen Sie nur die Java Runtime Environment (JRE), die auf Ihrem Computer installiert ist. Diese können Sie ganz einfach .

Um die Datenbank zu ändern oder etwas anderes zu tun, müssen Sie Tomcat so konfigurieren, wie . Ich weiß, dass Tomcat kompliziert erscheinen kann, aber eigentlich ist es ganz einfach. Außerdem kennt Google die Antworten auf alle Fragen, die während des Prozesses aufkommen können.
Camunda mit Tomcat ausführen
Die letzte Alternative besteht darin, Tomcat selbst einzurichten und Camunda zu installieren, . Damit können Sie jede Tomcat-Version verwenden, die Sie bevorzugen, oder sie beispielsweise als Windows-Dienst installieren.
Camunda in der Produktion starten
In der Regel sind einige letzte Anpassungen erforderlich, um Camunda zu starten. Camunda hat Empfehlungen, die dies sehr detailliert beschreiben, aber ich werde sie in diesem Artikel nicht ansprechen - nur ein Beispiel: Die REST-API der Standarddistribution ist standardmäßig nicht für die Authentifizierung konfiguriert. Möglicherweise möchten Sie dies ändern.
Zusammenfassung
Wie Sie vielleicht bemerkt haben, ist es sehr einfach, mit Camunda zu arbeiten, unabhängig von der verwendeten Sprache. Der Schlüssel ist, dass die gesamte Interaktion über die REST-API erfolgt. Die Installation ist ebenfalls recht einfach, insbesondere bei der Verwendung von Docker.
Quelle: habr.com
