Camunda gebruiken voor eenvoudige orkestratie op basis van REST en Workflow Engine (geen Java)

Hallo, Habr! Ik presenteer onder uw aandacht een vertaling van het artikel “Gebruik Camunda als een gebruiksvriendelijke, op REST gebaseerde orkestratie- en workflow-engine (zonder Java aan te raken)” van Bernd Rücker.

07.07.2020/XNUMX/XNUMX, vertaling Artikel Bernd Rücker

Camunda gebruiken voor eenvoudige orkestratie op basis van REST en Workflow Engine (geen Java)

Ik bespreek de microservice-architectuur vaak met niet-Java-mensen: C#, Node.JS/JavaScript-ontwikkelaars of Golang-enthousiastelingen. Ze worden allemaal geconfronteerd met het feit dat ze een orkestratie-engine nodig hebben in een microservice-architectuur of gewoon een tool om de workflow te optimaliseren en de mogelijkheid te krijgen om te bestellen, time-outs af te handelen, Saga te verwerken en transacties te compenseren.

BPM-platform met open source van Camunda geweldig voor dit soort taken. Ontwikkelaarvriendelijkheid is een van de belangrijkste kenmerken van het product. Maar als je de documentatie bekijkt, krijg je misschien de indruk dat Camunda's vriendelijkheid vooral gericht is op Java-ontwikkelaars. Het platform biedt veel mogelijkheden om eigen functies en uitbreidingen aan te sluiten, maar het gebeurt allemaal in Java. Is het echt?

Nee! In feite kunt u Camunda eenvoudig draaien zonder enige Java-kennis en de architectuur configureren om in elke taal van uw keuze te coderen. In dit artikel zullen we kijken naar:

  • basisarchitectuur;
  • REST-API;
  • advies over bestaande clientbibliotheken voor andere talen dan Java;
  • voorbeeld van het gebruik van C# en Node.JS;
  • manieren om de Camunda-server (Docker of Tomcat) te gebruiken.

Architectuur

Camunda is geschreven in Java en vereist een Java Virtual Machine (JVM) om te kunnen draaien. Camunda biedt een REST API waarmee je in elke gewenste taal kunt schrijven en REST kunt gebruiken met Camunda:

Camunda gebruiken voor eenvoudige orkestratie op basis van REST en Workflow Engine (geen Java)

Workflows in Camunda worden gedefinieerd in BPMN, wat in feite een XML-bestand is. Het kan worden gemodelleerd met behulp van Camunda-modelleur.

Camunda uitvoeren via een vooraf gebouwde Docker-image

De eenvoudigste manier om Camunda te gebruiken is door Docker te gebruiken. Alternatieve manieren om Camunda uit te voeren worden verderop in dit artikel beschreven.

Camunda gebruiken voor eenvoudige orkestratie op basis van REST en Workflow Engine (geen Java)

Voer in dit geval gewoon het volgende uit:

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

U hoeft zich geen zorgen te maken over Linux, Java Virtual Machines of Tomcats. Dockerfiles en basisdocumentatie (bijvoorbeeld instructies voor het verbinden met de vereiste databases) zijn beschikbaar op GitHub.

Als u Camunda Enterprise Edition wilt gebruiken, kunt u dit eenvoudig wijzigen Dockerfile.

Er is echter één nadeel aan het uitvoeren van Camunda met Docker: je krijgt uiteindelijk een versie van Tomcat die niet altijd de nieuwste oplossingen bevat. Om dit op de een of andere manier te omzeilen, kunt u zelf een Docker-image maken op basis van de gewenste Tomcat-distributie, zoals weergegeven in dit voorbeeld, of een van de hieronder beschreven oplossingen gebruiken.

Een procesmodel implementeren

Laten we eens kijken naar een voorbeeld waarbij we de Saga-sjabloon gebruiken voor een klassieke reisboeking, waarbij u drie acties achter elkaar wilt activeren en succesvolle acties netjes wilt compenseren in het geval van een latere mislukking. Gepresenteerd in BPMN-vorm ziet het er als volgt uit:

Camunda gebruiken voor eenvoudige orkestratie op basis van REST en Workflow Engine (geen Java)

Nu kunt u gebruiken REST API voor implementatie van procesmodellen. Laten we zeggen dat je het hebt opgeslagen als trip.bpmn en Camunda via Docker hebt uitgevoerd, zodat het beschikbaar was 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 "[email protected]" 
http://localhost:8080/engine-rest/deployment/creat

Nu kun je rennen nieuwe werkstroominstanties met behulp van de REST API en het doorgeven van de gegevens die u wilt zien als workflow-instantievariabelen:

  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 activeert Camunda procedures zoals het boeken van een auto? Camunda kan niet alleen direct diensten bellen (Push-principe), met behulp van enkele ingebouwde diensten connectoren, maar plaats ook werkitems in een soort ingebouwde wachtrij. De werknemer kan vervolgens via REST werkitems ontvangen, het werk uitvoeren en de voltooiing ervan melden aan Camunda (Pull-principe).

Camunda gebruiken voor eenvoudige orkestratie op basis van REST en Workflow Engine (geen Java)

Dus eerst moet je doen ophalenAndLock (aangezien andere werknemers tegelijkertijd taken kunnen ontvangen 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

Vertel dat dan aan Camunda werknemer zijn werk heeft voltooid (merk op dat u de externe taak-ID moet invoeren die u bij de eerste aanvraag heeft 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. Tot nu toe heb je nog geen Java nodig gehad, 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 met JQuery te doen, en in C# kun je System.Net.Http en Newtonsoft.Json gebruiken. Maar dit zal tijd vergen. U kunt dus gewoon een clientbibliotheek gebruiken.

Er zijn momenteel verschillende kant-en-klare clientbibliotheken beschikbaar:

  • javascript: link. Ondersteund door Camunda;
  • Java: link. Ondersteund door Camunda;
  • C #:link и link. Beide projecten bevinden zich in een tussenfase en hebben vrijwel geen activiteit, maar kunnen als een goed startpunt dienen;
  • PHP: link is geen erg complete bibliotheek en bevat niet de nieuwste API-wijzigingen, maar ik ken projecten die er gebruik van maken.

Met uitzondering van JavaScript en Java maken clientbibliotheken geen deel uit van het Camunda-product zelf. Verwacht niet dat ze alle REST API-functies van Camunda ondersteunen. Het feit dat een bibliotheek een bepaalde functie niet biedt, betekent niet dat deze er niet is. Controleer altijd de Camunda REST API. Typische projecten gebruiken bibliotheken als uitgangspunt en sjabloon.

Voorbeeld met C#

Met behulp van de bovenstaande clientbibliotheek kunnen we eenvoudigweg schrijven:

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

De volledige werkende broncode is online te vinden: link. Een ander voorbeeld is beschikbaar op link.

Voorbeeld met 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();

Meer informatie vindt u op de website github.com

Alternatieve manieren om Camunda te starten

Aangepaste Docker-image met "Camunda standalone WAR"

Als alternatief voor de vooraf gebouwde Docker-image van Camunda kun je Tomcat zelf voorbereiden (bijvoorbeeld op basis van de officiële Docker Tomcat-images) en vervolgens Camunda daarin kopiëren als een van de zogenaamde WAR-bestanden.

Camunda gebruiken voor eenvoudige orkestratie op basis van REST en Workflow Engine (geen Java)

Als u veel aanvullende vereisten heeft en een Java-bouwomgeving kunt aanpassen, kunt u ook Camunda Standalone war configureren. Zet een Maven-build op zoals in deze voorbeelden: build Maven met oorlogsconfiguratie of montage Maven met overlay.

Lancering van de Camunda Tomcat-distributie

Een andere optie is om eenvoudigweg de Camunda Tomcat-distributie te downloaden, uit te pakken en uit te voeren. Hiervoor heeft u alleen de Java Runtime Environment (JRE) op uw computer nodig. Het kan gemakkelijk zijn downloaden vanaf hier.

Camunda gebruiken voor eenvoudige orkestratie op basis van REST en Workflow Engine (geen Java)

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

Camunda uitvoeren met Tomcat

Het laatste alternatief is om Tomcat zelf te configureren en Camunda daarin te installeren, volgens de installatiebeschrijving. Hierdoor krijgt u de mogelijkheid om elke gewenste versie van Tomcat te gebruiken of bijvoorbeeld als Windows-service te installeren.

Lancering van Camunda in productie

Normaal gesproken vereist dit dat u een aantal laatste instellingen uitvoert om Camunda aan de praat te krijgen. Camunda heeft richtlijnen die dit tot in detail beschrijven, maar ik zal daar in dit artikel niet op ingaan. Ik geef slechts één voorbeeld: de REST API van de distributie is standaard niet geconfigureerd voor authenticatie. Misschien wil je dit veranderen.

Resume

Zoals je misschien hebt gemerkt, is het heel eenvoudig om met Camunda aan de slag te gaan, ongeacht de taal die je gebruikt. Het belangrijkste punt is dat alle communicatie verloopt via de REST API. De installatie is ook vrij eenvoudig, vooral als je Docker gebruikt.

Bron: www.habr.com

Voeg een reactie