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

Ich diskutiere oft mit Leuten, die wenig Erfahrung mit Java haben, über mikroservicebasierte Architekturen: C#-, Node.JS/JavaScript-Entwickler oder Anhänger von Golang. Alle stehen vor der Herausforderung, einen Orchestrierungsmechanismus in einer Mikroservice-Architektur oder einfach ein Tool zur Optimierung des Workflows zu benötigen, um Ordnung zu schaffen, Zeitüberschreitungen, Sagas und kompensierende Transaktionen zu verwalten.
Die BPM-Plattform mit ist ideal für solche Aufgaben. Die Entwicklerfreundlichkeit ist eines der Hauptmerkmale des Produkts. Wenn man jedoch die Dokumentation betrachtet, könnte man den Eindruck gewinnen, dass die Camunda-„Entwicklerfreundlichkeit“ hauptsächlich auf Java-Entwickler abzielt. Die Plattform bietet viele Möglichkeiten zur Anbindung eigener Funktionen und Erweiterungen, doch all dies geschieht in Java. Ist das wirklich der Fall?
Nein! Tatsächlich können Sie Camunda ganz einfach ohne Java-Kenntnisse starten und die Architektur für den Code in einer beliebigen Sprache Ihrer Wahl konfigurieren. In diesem Artikel werden wir behandeln:
- die grundlegende Architektur;
- REST API;
- Tipps zu existierenden Client-Bibliotheken für andere Sprachen als Java;
- ein Beispiel für die Nutzung von C# und Node.JS;
- Möglichkeiten zur Ausführung des Camunda-Servers (Docker oder Tomcat).
Architektur von
Camunda ist in Java geschrieben und benötigt eine Java Virtual Machine (JVM) für den Betrieb. Camunda bietet eine REST API, die es Ihnen ermöglicht, in jeder Sprache zu programmieren, die Sie möchten, und REST mit Camunda zu verwenden:

Workflows in Camunda werden in BPMN definiert, das hauptsächlich eine XML-Datei darstellt. Diese kann mit Hilfe von .
Camunda über ein vorgefertigtes Docker-Image starten
Der einfachste Weg, Camunda zu starten, ist die Verwendung von Docker. Alternative Möglichkeiten, Camunda zu starten, werden weiter unten in diesem Artikel beschrieben.

In diesem Fall müssen Sie einfach ausführen:
docker run -d -p 8080:8080 camunda/camunda-bpm-platform:latest
Sie müssen sich keine Sorgen um Linux, Java Virtual Machines oder Tomcats machen. Dockerfiles und die Hauptdokumentation (z. B. Anleitungen zur Verbindung mit den benötigten Datenbanken) sind auf .
Wenn Sie die Camunda Enterprise Edition starten möchten, können Sie dies ganz einfach anpassen. .
Allerdings gibt es einen Nachteil beim Starten von Camunda mit Docker: Sie erhalten eine Tomcat-Version, die nicht immer die neuesten Updates enthält. Um dies zu umgehen, können Sie ein Docker-Image basierend auf der gewünschten Tomcat-Distribution selbst erstellen, wie in diesem Beispiel dargestellt, oder eine der unten beschriebenen Lösungen verwenden.
Bereitstellung des Prozessmodells
Lassen Sie uns ein Beispiel betrachten, das das Saga-Muster für klassische Reisebuchungen verwendet, bei dem Sie drei Aktionen hintereinander ausführen möchten und erfolgreich durchgeführte Aktionen im Falle eines späteren Fehlers korrekt kompensieren. In BPMN-Form 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 zugänglich 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 und die Daten übermitteln, die Sie als Variableninstanz des Workflows 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 lautet: Wie ruft Camunda Prozesse wie die Buchung eines Autos auf? Camunda kann nicht nur sofort Dienste aufrufen (Push-Prinzip), indem sie einige integrierte , sondern auch Arbeitsaufgaben in eine Art integrierte Reihenfolge stellen. Danach kann der Worker Arbeitsaufgaben ü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 abrufen können, um das System zu skalieren):
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
Dann teilen Sie Camunda mit, dass (beachten Sie, dass Sie die ID der externen Aufgabe angeben müssen, die im ersten Anfrage erhalten wurde):
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 reicht aus, um loszulegen!
Client-Bibliotheken
Es ist einfach, das REST API in jeder Programmiersprache aufzurufen. In JavaScript lässt sich das gut mit JQuery machen, während Sie in C# System.Net.Http und Newtonsoft.Json verwenden können. Aber das benötigt Zeit. Daher können Sie einfach auf eine Client-Bibliothek zurückgreifen.
Derzeit stehen mehrere fertige Client-Bibliotheken zur Verfügung:
- JavaScript: . Camunda wird unterstützt;
- Java: . Camunda wird unterstützt;
- C#: und . Beide Projekte befinden sich im Übergangsstadium und sind nahezu inaktiv, könnten aber als gute Ausgangsbasis dienen;
- PHP: – eine nicht besonders vollständige Bibliothek, die die neuesten API-Änderungen nicht enthält, aber ich kenne Projekte, die sie nutzen.
Außer JavaScript und Java sind die Client-Bibliotheken nicht Teil des Camunda-Produkts selbst. Erwarten Sie nicht, dass sie alle Funktionen des Camunda REST-APIs unterstützen. Wenn die Bibliothek eine bestimmte Funktion nicht bietet, bedeutet das nicht, dass sie nicht vorhanden ist; überprüfen Sie immer das Camunda REST-API. Standardprojekte verwenden die Bibliotheken als Ausgangspunkt und Vorlage.
Beispiel mit C#
Mit der oben genannten Client-Bibliothek können wir einfach schreiben:
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 ListDen vollständigen funktionalen Quellcode finden Sie im Internet: . Ein weiteres Beispiel ist verfügbar 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 Webseite
Alternative Methoden zum Starten von Camunda
Benutzerdefiniertes Docker-Image mit „Camunda standalone WAR“
Sie können anstelle des fertigen Docker-Images von Camunda Tomcat selbst vorbereiten (z. B. basierend auf den offiziellen Docker-Images von Tomcat) und dann Camunda als eine der sogenannten WAR-Dateien kopieren.

Wenn Sie viele zusätzliche Anforderungen haben und die Java-Bauumgebung anpassen können, können Sie auch Camunda Standalone WAR einrichten. Richten Sie den Maven-Bau nach den folgenden Beispielen ein: Bau oder Bau .
Starten des Camunda Tomcat-Distributionspakets
Eine weitere Möglichkeit besteht darin, einfach das Camunda Tomcat-Distributionspaket herunterzuladen, es zu entpacken und zu starten. Dazu wird nur eine Java Runtime Environment (JRE) benötigt, die auf Ihrem Computer installiert ist. Diese können Sie leicht .

Um die Datenbank zu ändern oder etwas anderes zu tun, müssen Sie Tomcat wie Ich weiß, dass Tomcat kompliziert erscheinen kann, aber in Wirklichkeit ist es sehr einfach. Und Google hat die Antworten auf alle Fragen, die während des Prozesses auftauchen könnten.
Camunda mit Tomcat starten
Die letzte Alternative besteht darin, Tomcat selbst zu konfigurieren und Camunda darin zu installieren, Dies ermöglicht die Verwendung jeder Tomcat-Version, die Sie bevorzugen, oder beispielsweise die Installation als Windows-Dienst.
Camunda in die Produktion bringen
In der Regel sind einige abschließende Anpassungen erforderlich, um Camunda zu starten. Camunda bietet sehr detaillierte Empfehlungen hierzu, aber ich werde diese in diesem Artikel nicht behandeln – ich nenne nur ein Beispiel: Die REST-API des Standard-Distributors ist nicht auf Authentifizierung eingestellt. Möglicherweise möchten Sie dies ändern.
Zusammenfassung
Wie Sie festgestellt haben, ist es sehr einfach, mit Camunda zu arbeiten, unabhängig von der verwendeten Sprache. Der Schlüssel liegt darin, dass alle Interaktionen über die REST-API erfolgen. Auch die Installation ist relativ unkompliziert, insbesondere bei Verwendung von Docker.
Quelle: habr.com
