Verwendung von Camunda für einfache Orchestrierung basierend auf REST und Workflow Engine (kein Java)

Hey Habr! Ich präsentiere Ihnen die Übersetzung des Artikels „Verwenden Sie Camunda als benutzerfreundliche REST-basierte Orchestrierungs- und Workflow-Engine (ohne Java zu berühren)“ von Bernd Rücker.

07.07.2020, Übersetzung Artikel Bernd Rucker

Verwendung von Camunda für einfache Orchestrierung basierend auf REST und Workflow Engine (kein Java)

Ich diskutiere Microservice-Architektur oft mit Leuten außerhalb von Java: C#-Entwicklern, Node.JS/JavaScript-Entwicklern oder Golang-Fans. Sie alle stehen vor der Tatsache, dass sie einen Orchestrierungsmechanismus in einer Microservice-Architektur benötigen oder einfach nur ein Tool, um den Arbeitsablauf zu rationalisieren und die Möglichkeit zu erhalten, Transaktionen zu bestellen, Timeouts, Saga und Kompensationen zu verarbeiten.

BPM-Plattform mit Open Source von Camunda ideal für solche Aufgaben. Entwicklerfreundlichkeit ist eines der Hauptmerkmale des Produkts. Schaut man sich aber die Dokumentation an, könnte man den Eindruck gewinnen, dass sich Camundas „Freundlichkeit“ vor allem an Java-Entwickler richtet. Die Plattform bietet viele Möglichkeiten zur Anbindung eigener Funktionen und Erweiterungen, allerdings erfolgt alles in Java. Ist das wirklich?

Nein! Tatsächlich können Sie Camunda ganz einfach ohne Java-Kenntnisse ausführen und die Architektur für Code in einer beliebigen Sprache Ihrer Wahl einrichten. In diesem Artikel werden wir uns mit Folgendem befassen:

  • grundlegende Architektur;
  • REST-API
  • Beratung zu bestehenden Client-Bibliotheken für andere Sprachen als Java;
  • Beispiel mit C# und Node.JS;
  • Möglichkeiten zum Starten des Camunda-Servers (Docker oder Tomcat).

Architektur

Camunda ist in Java geschrieben und benötigt zur Ausführung eine Java Virtual Machine (JVM). Camunda bietet eine REST-API, die es Ihnen ermöglicht, in jeder beliebigen Sprache zu schreiben und REST mit Camunda zu verwenden:

Verwendung von Camunda für einfache Orchestrierung basierend auf REST und Workflow Engine (kein Java)

Arbeitsabläufe in Camunda werden in BPMN definiert, bei dem es sich im Grunde um eine XML-Datei handelt. Es kann mit modelliert werden Camunda Modeler.

Camunda über ein vorgefertigtes Docker-Image ausführen

Der einfachste Weg, Camunda auszuführen, ist die Verwendung von Docker. Alternative Möglichkeiten zum Starten von Camunda werden später in diesem Artikel beschrieben.

Verwendung von Camunda für einfache Orchestrierung basierend auf REST und Workflow Engine (kein Java)

Führen Sie in diesem Fall einfach Folgendes aus:

  docker run -d -p 8080:8080 camunda/camunda-bpm-platform:latest

Sie müssen sich keine Sorgen um Linux, JVMs oder Tomcats machen. Docker-Dateien und grundlegende Dokumentation (z. B. Anweisungen zum Herstellen einer Verbindung zu den erforderlichen Datenbanken) finden Sie unter Github.

Wenn Sie Camunda Enterprise Edition verwenden möchten, können Sie dies problemlos ändern Dockerfile.

Allerdings hat die Ausführung von Camunda mit Docker einen Nachteil: Sie erhalten am Ende eine Version von Tomcat, die nicht immer die neuesten Fixes enthält. Um dies zu umgehen, können Sie Ihr eigenes Docker-Image basierend auf der gewünschten Tomcat-Distribution erstellen, wie in diesem Beispiel gezeigt, oder eine der unten beschriebenen Lösungen verwenden.

Bereitstellung von Prozessmodellen

Schauen wir uns ein Beispiel mit der Saga-Vorlage für eine klassische Reisebuchung an, bei der Sie drei Aktionen hintereinander auslösen und erfolgreich abgeschlossene Aktionen im Falle eines späteren Fehlschlags elegant kompensieren möchten. In BPMN-Form dargestellt sieht es so aus:

Verwendung von Camunda für einfache Orchestrierung basierend auf REST und Workflow Engine (kein Java)

Jetzt können Sie verwenden REST-API für die Bereitstellung von Prozessmodellen. Nehmen wir an, Sie speichern es als trip.bpmn und führen Camunda über Docker aus, damit es auf 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 "[email protected]" 
http://localhost:8080/engine-rest/deployment/creat

Jetzt können Sie laufen neue Workflow-Instanzen Verwenden Sie die REST-API und übergeben Sie die Daten, die Sie sehen möchten, als Workflow-Instanzvariablen:

  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 nennt Camunda Abläufe wie die Buchung eines Autos? Camunda kann mithilfe einiger integrierter Funktionen nicht nur Dienste sofort aufrufen (Push-Prinzip). Anschlüsse, sondern auch Arbeitselemente in eine Art eingebaute Reihenfolge bringen. Der Arbeiter kann dann Arbeitselemente über REST abrufen, die Arbeit ausführen und Camunda anweisen, sie abzuschließen (Pull-Prinzip).

Verwendung von Camunda für einfache Orchestrierung basierend auf REST und Workflow Engine (kein Java)

Also müssen Sie zuerst ausführen fetchAndLock (da andere Arbeiter gleichzeitig Aufgaben erhalten 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 sag es Camunda Arbeiter hat die Arbeit abgeschlossen (Beachten Sie, dass Sie die in der ersten Anfrage erhaltene externe Aufgaben-ID 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 war's – Sie haben immer noch kein Java benötigt, oder? Und das reicht für den Anfang!

Kundenbibliotheken

Der Aufruf einer REST-API ist in jeder Programmiersprache einfach. In JavaScript erfolgt dies bequem über JQuery und in C# über System.Net.Http und Newtonsoft.Json. Aber das wird Zeit brauchen. Sie können also einfach eine Client-Bibliothek verwenden.

Derzeit sind mehrere vorgefertigte Client-Bibliotheken verfügbar:

  • JavaScript: Link. Unterstützt von Camunda;
  • Java: Link. Unterstützt von Camunda;
  • C #:Link и Link. Beide Projekte befinden sich in einem Zwischenstadium und sind praktisch ruhend, können aber als guter Ausgangspunkt dienen;
  • PHP: Link - nicht zu vollständig und enthält nicht die neuesten API-Änderungen, aber ich kenne Projekte, die es verwenden.

Mit Ausnahme von JavaScript und Java sind die Client-Bibliotheken nicht Teil des Camunda-Produkts selbst. Erwarten Sie nicht, dass sie alle REST-API-Funktionen von Camunda unterstützen. Nur weil eine Bibliothek eine bestimmte Funktion nicht bereitstellt, heißt das nicht, dass sie nicht vorhanden ist. Schauen Sie sich immer die REST-API von Camunda an. Referenzprojekte nutzen Bibliotheken als Ausgangspunkt und Vorlage.

C#-Beispiel

Mit der obigen 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 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", "..." }
    });

Den voll funktionsfähigen Quellcode finden Sie online: Link. Ein weiteres Beispiel finden Sie unter Link.

Beispiel mit 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();

Weitere Informationen finden Sie auf der Website Github.com

Alternative Möglichkeiten, Camunda zu starten

Benutzerdefiniertes Docker-Image mit „Camunda standalone WAR“

Alternativ zu einem vorgefertigten Docker-Image von Camunda können Sie Tomcat selbst vorbereiten (z. B. auf Basis der offiziellen Docker-Tomcat-Images) und dann Camunda als eine der sogenannten WAR-Dateien hineinkopieren.

Verwendung von Camunda für einfache Orchestrierung basierend auf REST und Workflow Engine (kein Java)

Wenn Sie viele zusätzliche Anforderungen haben und eine Java-Build-Umgebung einrichten können, können Sie auch Camunda Standalone einrichten. Richten Sie einen Maven-Build wie in diesen Beispielen ein: build Maven mit Kriegskonfiguration oder Montage Maven mit Overlay.

Starten der Camunda Tomcat-Distribution

Eine andere Möglichkeit besteht darin, einfach die Camunda Tomcat-Distribution herunterzuladen, zu entpacken und auszuführen. Hierzu ist lediglich die Installation der Java Runtime Environment (JRE) auf Ihrem Computer erforderlich. Es kann leicht sein hier herunterladen.

Verwendung von Camunda für einfache Orchestrierung basierend auf REST und Workflow Engine (kein Java)

Um die Datenbank zu ändern oder etwas anderes zu tun, müssen Sie Tomcat wie konfigurieren in der Dokumentation beschrieben. Ich weiß, Tomcat mag kompliziert klingen, aber es ist eigentlich sehr einfach. Und Google kennt die Antworten auf alles, was dabei erforderlich sein kann.

Camunda mit Tomcat ausführen

Die letzte Alternative besteht darin, Tomcat selbst einzurichten und Camunda darin zu installieren. Folgen Sie der Installationsbeschreibung. Dadurch haben Sie die Möglichkeit, die von Ihnen bevorzugte Version von Tomcat zu verwenden oder sie beispielsweise als Windows-Dienst zu installieren.

Einführung von Camunda in die Produktion

Dies erfordert normalerweise eine abschließende Einrichtung, um Camunda auszuführen. Es gibt Richtlinien in Camunda, die dies ausführlich beschreiben, auf die ich in diesem Artikel aber nicht näher eingehen möchte – ich nenne nur ein Beispiel: Die REST-API der Distribution ist standardmäßig nicht für die Authentifizierung konfiguriert. Möglicherweise möchten Sie dies ändern.

Zusammenfassend-up

Wie Sie sehen, ist der Einstieg in Camunda sehr einfach, unabhängig von der verwendeten Sprache. Der entscheidende Punkt ist, dass die gesamte Interaktion über die REST-API erfolgt. Auch die Installation ist recht einfach, insbesondere bei Verwendung von Docker.

Source: habr.com

Kommentar hinzufügen