Verwendung von Camunda für eine bequeme Orchestrierung basierend auf REST und Workflow-Engine (ohne Java)

Hallo, Habr! Ich präsentiere Ihnen eine Übersetzung des Artikels. Verwenden Sie Camunda als einfach zu bedienende REST-basierte Orchestrierungs- und Workflow-Engine (ohne Java zu berühren). Autor Bernd Rücker.

07.07.2020, Übersetzung des Artikels Bernd Rücker

Verwendung von Camunda für eine bequeme Orchestrierung basierend auf REST und Workflow-Engine (ohne Java)

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 offenem Quellcode von Camunda 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:

Verwendung von Camunda für eine bequeme Orchestrierung basierend auf REST und Workflow-Engine (ohne Java)

Workflows in Camunda werden in BPMN definiert, was hauptsächlich eine XML-Datei darstellt. Diese kann mithilfe von Camunda Modeler.

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.

Verwendung von Camunda für eine bequeme Orchestrierung basierend auf REST und Workflow-Engine (ohne Java)

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 Github.

Wenn Sie die Camunda Enterprise Edition starten möchten, können Sie dies ganz einfach ändern. Dockerfile.

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:

Verwendung von Camunda für eine bequeme Orchestrierung basierend auf REST und Workflow-Engine (ohne Java)

Jetzt können Sie REST API zur Bereitstellung des Prozessmodells. 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 neue Instanzen des Workflows 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 Connectoren, 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).

Verwendung von Camunda für eine bequeme Orchestrierung basierend auf REST und Workflow-Engine (ohne Java)

Zuerst müssen Sie fetchAndLock 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 der Worker die Arbeit abgeschlossen hat (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: Link. Camunda wird unterstützt;
  • Java: Link. Camunda wird unterstützt;
  • C#:Link und Link. Beide Projekte sind in einem vorläufigen Zustand und nahezu inaktiv, können aber als gute Ausgangsbasis dienen;
  • PHP: Link — 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 List {
        FileParameter.FromManifestResource(Assembly.GetExecutingAssembly(), "FlowingTripBookingSaga.Models.FlowingTripBookingSaga.bpmn")
     });
  
  // Arbeiten registrieren
  registerWorker("reserve-car", externalTask => {
    // hier können Sie die eigentliche Arbeit erledigen! Wie ein sysout :-)
    Console.WriteLine("Auto reservieren...");
    camunda.ExternalTaskService.Complete(workerId, externalTask.Id);
  });
  registerWorker("cancel-car", externalTask => {
    Console.WriteLine("Auto stornieren...");
    camunda.ExternalTaskService.Complete(workerId, externalTask.Id);
  });
  registerWorker("book-hotel", externalTask => {
    Console.WriteLine("Hotel reservieren...");
    camunda.ExternalTaskService.Complete(workerId, externalTask.Id);
  });
  // Weitere Arbeiter registrieren...
  
  StartPolling();
  
  string processInstanceId = camunda.BpmnWorkflowService.StartProcessInstance("FlowingTripBookingSaga", new Dictionary()
    {
      {"someBookingData", "..." }
    });

Der vollständig funktionsfähige Quellcode ist online zu finden: Link. Ein weiteres Beispiel finden Sie unter Link.

Пример с 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 github.com

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.

Verwendung von Camunda für eine bequeme Orchestrierung basierend auf REST und Workflow-Engine (ohne Java)

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 Maven mit WAR-Konfiguration oder Build Maven mit Overlay.

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 hier herunterladen.

Verwendung von Camunda für eine bequeme Orchestrierung basierend auf REST und Workflow-Engine (ohne Java)

Um die Datenbank zu ändern oder etwas anderes zu tun, müssen Sie Tomcat so konfigurieren, wie es in der Dokumentation beschrieben ist.. 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, indem Sie die Installationsanleitung befolgen.. 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

60GB SSD 8Gb DDR4