Gebruik van Camunda voor eenvoudige orkestratie op basis van REST en Workflow Engine (zonder Java)

Hallo, Habr! Ik presenteer u de vertaling van het artikel «Gebruik Camunda als een gemakkelijk te gebruiken REST-gebaseerde orkestratie- en workflow-engine (zonder Java aan te raken)» auteur Bernd Rücker.

07.07.2020, vertaling artikel Bernd Rücker

Gebruik van Camunda voor eenvoudige orkestratie op basis van REST en Workflow Engine (zonder Java)

Ik bespreek vaak microservices-architectuur met mensen die ver van Java staan: C#-, Node.JS/JavaScript-ontwikkelaars of Golang-adepten. Allen komen voor de uitdaging te staan dat ze een orkestratiemechanisme nodig hebben in een microservices-architectuur of gewoon een hulpmiddel om werkprocessen te optimaliseren en mogelijkheden voor ordering, timeout-beheer, Saga en compensatietransacties te verkrijgen.

BPM-platform met open source van Camunda is uitstekend geschikt voor dergelijke taken. Ontwikkelaarsvriendelijkheid is een van de belangrijkste kenmerken van het product. Maar als je naar de documentatie kijkt, krijg je de indruk dat de 'vriendelijkheid' van Camunda voornamelijk gericht is op Java-ontwikkelaars. Het platform biedt tal van mogelijkheden om eigen functies en extensies toe te voegen, maar dit gebeurt allemaal in Java. Klopt dat echt?

Nee! In werkelijkheid kun je Camunda gemakkelijk draaien zonder enige kennis van Java en de architectuur configureren voor code in elke taal naar keuze. In dit artikel zullen we het volgende bekijken:

  • de basisarchitectuur;
  • REST API;
  • aanbevelingen voor bestaande clientbibliotheken voor talen die van Java verschillen;
  • een voorbeeld van gebruik van C# en Node.JS;
  • manieren om de Camunda-server op te starten (Docker of Tomcat).

Architectuur

Camunda is geschreven in Java en heeft een Java Virtual Machine (JVM) nodig om te draaien. Camunda biedt een REST API die je in staat stelt te coderen in elke taal die je wilt, en REST met Camunda te gebruiken:

Gebruik van Camunda voor eenvoudige orkestratie op basis van REST en Workflow Engine (zonder Java)

Werkprocessen in Camunda worden gedefinieerd in BPMN, dat voornamelijk een XML-bestand is. Het kan gemodelleerd worden met Camunda Modeler.

Camunda opstarten via een vooraf gemaakte Docker-image

De eenvoudigste manier om Camunda te draaien is door Docker te gebruiken. Alternatieve manieren om Camunda te starten worden hieronder in dit artikel beschreven.

Gebruik van Camunda voor eenvoudige orkestratie op basis van REST en Workflow Engine (zonder Java)

In dat geval is het voldoende om gewoon te starten met:

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

Je hoeft je geen zorgen te maken over Linux, Java Virtual Machines of Tomcats. Dockerfiles en de belangrijkste documentatie (zoals instructies voor het verbinden met de juiste databases) zijn beschikbaar op Github.

Als je Camunda Enterprise Edition wilt draaien, kun je dit eenvoudig aanpassen Dockerfile.

Echter, er is één nadeel aan het draaien van Camunda via Docker: je krijgt een versie van Tomcat die niet altijd de laatste patches bevat. Om dit te omzeilen, kun je zelf een Docker-image bouwen op basis van de gewenste distributie van Tomcat, zoals weergegeven in dit voorbeeld, of een van de onderstaande oplossingen gebruiken.

Implementatie van het procesmodel

Laten we een voorbeeld bekijken waarbij we de Saga-sjabloon gebruiken voor een klassieke reisreservering, waarbij je drie acties achtereenvolgens wilt aanroepen en succesvol uitgevoerde acties wilt compenseren in het geval van een latere fout. Het ziet er in BPMN-vorm als volgt uit:

Gebruik van Camunda voor eenvoudige orkestratie op basis van REST en Workflow Engine (zonder Java)

Nu kunt u gebruik maken van REST API voor het implementeren van het procesmodel. Stel dat je het hebt opgeslagen met de naam trip.bpmn en Camunda via Docker hebt gestart, zodat het beschikbaar is op 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

Nu kun je aanroepen nieuwe workflow-instanties via de REST API en de gegevens doorgeven die je als workflow-instantievariabelen wilt zien:

  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

De volgende interessante vraag is: hoe roept Camunda procedures aan zoals het reserveren van een auto? Camunda kan niet alleen direct diensten aanroepen (Push-Principe), met behulp van enkele ingebouwde verbindingen, maar ook werkitems in een soort ingebouwde volgorde plaatsen. Vervolgens kan de worker werkitems via REST ophalen, het werk uitvoeren en Camunda melden dat het is voltooid (Pull-Principe).

Gebruik van Camunda voor eenvoudige orkestratie op basis van REST en Workflow Engine (zonder Java)

Dus, eerst moet je fetchAndLock uitvoeren (omdat andere workers gelijktijdig taken kunnen ophalen om het systeem te schalen):

  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

Geef vervolgens aan Camunda door dat de worker het werk heeft voltooid (let op dat je de ID van de externe taak moet invoeren die je in het eerste verzoek hebt ontvangen):

  curl 
-H "Content-Type: application/json" 
-X POST 
-d '{"workerId":"worker123", "variables": {}}' 
http://localhost:8080/engine-rest/external-task/EXTERNAL_TASK_ID/complete

Dat is alles — je had tot nu toe geen Java nodig, toch? En dat is genoeg om aan de slag te gaan!

Klantbibliotheken

Het aanroepen van de REST API is eenvoudig in elke programmeertaal. In JavaScript is het handig om dit te doen met JQuery, terwijl in C# System.Net.Http en Newtonsoft.Json worden ingezet. Maar dit kost wat tijd. Daarom kun je gewoon een klantbibliotheek gebruiken.

Momenteel zijn er verschillende kant-en-klare klantbibliotheken beschikbaar:

  • JavaScript: link; Camunda wordt ondersteund.
  • Java: link; Camunda wordt ondersteund.
  • C#:link en linkDeze beide projecten zijn in een tussenfase en zijn vrijwel inactief, maar kunnen een goede startpunt zijn.
  • PHP: link — een niet al te uitgebreide bibliotheek die de laatste wijzigingen van de API niet bevat, maar ik ken projecten die deze gebruiken.

Behalve JavaScript en Java maken klantbibliotheken geen deel uit van het product Camunda zelf. Verwacht niet dat ze alle mogelijkheden van de REST API van Camunda ondersteunen. Als de bibliotheek een bepaalde functie niet biedt, betekent dat niet dat deze er niet is; controleer altijd de REST API van Camunda. Standaardprojecten gebruiken bibliotheken als startpunt en sjabloon.

Voorbeeld met C#

Met de hierboven genoemde klantbibliotheek kunnen we eenvoudig schrijven:

  var camunda = new CamundaEngineClient("http://localhost:8080/engine-rest/engine/default/", null, null);
  // Zet het BPMN XML-bestand uit de bronnen in
  camunda.RepositoryService.Deploy("trip-booking", new List {
        FileParameter.FromManifestResource(Assembly.GetExecutingAssembly(), "FlowingTripBookingSaga.Models.FlowingTripBookingSaga.bpmn")
     });
  
  // Registreer werkers
  registerWorker("reserve-car", externalTask => {
    // hier kun je de echte dingen doen! Zoals een sysout :-)
    Console.WriteLine("Auto nu reserveren...");
    camunda.ExternalTaskService.Complete(workerId, externalTask.Id);
  });
  registerWorker("cancel-car", externalTask => {
    Console.WriteLine("Auto nu annuleren...");
    camunda.ExternalTaskService.Complete(workerId, externalTask.Id);
  });
  registerWorker("book-hotel", externalTask => {
    Console.WriteLine("Hotel nu reserveren...");
    camunda.ExternalTaskService.Complete(workerId, externalTask.Id);
  });
  // Registreer meer werkers...
  
  StartPolling();
  
  string processInstanceId = camunda.BpmnWorkflowService.StartProcessInstance("FlowingTripBookingSaga", new Dictionary()
    {
      {"someBookingData", "..." }
    });

De volledig werkende broncode is online te vinden: link; Een ander voorbeeld is beschikbaar op 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 + " - iets toegevoegd";
    callback(null, {
      variables: {
        someNewData: someNewData
      }
    });
  });
  
  workers.shutdown();

Meer informatie is te vinden op de website github.com

Alternatieve manieren om Camunda te starten

Aangepast Docker-afbeelding met "Camunda standalone WAR"

Als alternatief voor de kant-en-klare Docker-afbeelding van Camunda, kunt u Tomcat zelf opzetten (bijvoorbeeld op basis van de officiële Docker Tomcat-afbeeldingen) en vervolgens Camunda kopiëren als een van de zogenaamde WAR-bestanden.

Gebruik van Camunda voor eenvoudige orkestratie op basis van REST en Workflow Engine (zonder Java)

Als u veel extra vereisten heeft en de Java-buildomgeving kunt configureren, kunt u ook de Camunda Standalone WAR configureren. Stel de Maven-build in zoals in deze voorbeelden: build Maven met WAR-configuratie of build Maven met Overlay.

Uitvoering van de Camunda Tomcat-distributie

Een andere optie is om simpelweg de Camunda Tomcat-distributie te downloaden, uit te pakken en te starten. Hiervoor is alleen de Java Runtime Environment (JRE) nodig die op uw computer is geïnstalleerd. Deze kunt u eenvoudig hier downloaden.

Gebruik van Camunda voor eenvoudige orkestratie op basis van REST en Workflow Engine (zonder Java)

Om de database te wijzigen of iets anders te doen, moet u Tomcat configureren zoals beschreven in de documentatie. Ik weet dat Tomcat ingewikkeld kan lijken, maar het is eigenlijk heel eenvoudig. En Google heeft antwoorden op alles wat u nodig kunt hebben tijdens het proces.

Camunda starten met Tomcat

De laatste optie is om Tomcat zelf in te stellen en Camunda daarin te installeren, volgens de installatie-instructies. Dit stelt u in staat om elke versie van Tomcat te gebruiken die u wilt, of om het bijvoorbeeld als een Windows-service te installeren.

Camunda in productie brengen

In de regel is het nodig om enkele laatste aanpassingen te doen voor het starten van Camunda. Camunda heeft aanbevelingen die dit uitgebreid beschrijven, maar ik zal ze in dit artikel niet behandelen — ik noem alleen één voorbeeld: de REST API van de distributie is standaard niet geconfigureerd voor authenticatie. Misschien wilt u dit aanpassen.

Conclusie

Zoals u zelf ook hebt gemerkt, is het heel eenvoudig om met Camunda aan de slag te gaan, ongeacht de taal die u gebruikt. Het belangrijkste punt is dat alle interactie plaatsvindt via de REST API. De installatie is ook vrij eenvoudig, vooral bij het gebruik van Docker.

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers 🔥 Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster