Utilizzo di Camunda per una facile orchestrazione basata su REST e Workflow Engine (no Java)

Ehi Habr! Presento alla vostra attenzione la traduzione dell'articolo "Utilizza Camunda come motore di orchestrazione e flusso di lavoro basato su REST di facile utilizzo (senza toccare Java)" di Bernd Rücker.

07.07.2020/XNUMX/XNUMX, traduzione articoli Bernd Rucker

Utilizzo di Camunda per una facile orchestrazione basata su REST e Workflow Engine (no Java)

Discuto spesso dell'architettura dei microservizi con persone non Java: sviluppatori C#, sviluppatori Node.JS/JavaScript o appassionati di Golang. Tutti si trovano di fronte al fatto di aver bisogno di un meccanismo di orchestrazione in un'architettura di microservizi, o semplicemente di uno strumento per semplificare il flusso di lavoro e acquisire la capacità di ordinare, gestire timeout, Saga e transazioni di compensazione.

Piattaforma BPM con open source da Camunda ottimo per tali compiti. La facilità d'uso per gli sviluppatori è una delle caratteristiche principali del prodotto. Ma se guardi la sua documentazione, potresti avere l'impressione che la "cordialità" di Camunda sia rivolta principalmente agli sviluppatori Java. La piattaforma offre molte opzioni per connettere le tue funzioni ed estensioni, ma è tutto fatto in Java. É davvero?

NO! In effetti, puoi facilmente eseguire Camunda senza alcuna conoscenza di Java e impostare l'architettura per il codice in qualsiasi linguaggio di tua scelta. In questo articolo, esamineremo:

  • architettura di base;
  • API REST
  • consulenza su librerie client esistenti per linguaggi diversi da Java;
  • esempio utilizzando C# e Node.JS;
  • modi per avviare il server Camunda (Docker o Tomcat).

Architettura

Camunda è scritto in Java e necessita di una Java Virtual Machine (JVM) per funzionare. Camunda fornisce un'API REST che ti consente di scrivere in qualsiasi lingua tu voglia e utilizzare REST con Camunda:

Utilizzo di Camunda per una facile orchestrazione basata su REST e Workflow Engine (no Java)

I flussi di lavoro in Camunda sono definiti in BPMN, che è fondamentalmente un file XML. Può essere modellato con Modellatore Camunda.

Esecuzione di Camunda tramite un'immagine Docker predefinita

Il modo più semplice per eseguire Camunda è utilizzare Docker. Modi alternativi per avviare Camunda sono descritti più avanti in questo articolo.

Utilizzo di Camunda per una facile orchestrazione basata su REST e Workflow Engine (no Java)

In questo caso, esegui semplicemente:

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

Non devi preoccuparti di Linux, JVM o Tomcats. I Dockerfile e la documentazione di base (ad esempio, le istruzioni per la connessione ai database richiesti) sono disponibili all'indirizzo Github.

Se vuoi eseguire Camunda Enterprise Edition puoi facilmente cambiare Dockerfile.

Tuttavia, c'è uno svantaggio nell'esecuzione di Camunda utilizzando Docker: ti ritroverai con una versione di Tomcat che non sempre include le correzioni più recenti. Per aggirare in qualche modo questo problema, puoi creare tu stesso un'immagine Docker in base alla distribuzione Tomcat desiderata, come mostrato in questo esempio, oppure utilizzare una delle soluzioni descritte di seguito.

Distribuzione del modello di processo

Diamo un'occhiata a un esempio utilizzando il modello Saga per una prenotazione di viaggio classica in cui desideri attivare tre azioni di seguito e compensare con grazia le azioni completate con successo in caso di un successivo fallimento. Rappresentato in forma BPMN, appare così:

Utilizzo di Camunda per una facile orchestrazione basata su REST e Workflow Engine (no Java)

Ora puoi usare API REST per la distribuzione del modello di processo. Diciamo che l'hai salvato come trip.bpmn e hai eseguito Camunda tramite Docker in modo che fosse disponibile su 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

Ora puoi correre nuove istanze del flusso di lavoro utilizzando l'API REST e passa i dati che desideri visualizzare come variabili dell'istanza del flusso di lavoro:

  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

La prossima domanda interessante è: in che modo Camunda chiama le procedure come la prenotazione di un'auto? Camunda non solo può chiamare i servizi immediatamente (Push-Principle) utilizzando alcuni built-in connettori, ma anche inserire gli elementi di lavoro in una sorta di ordine integrato. Il lavoratore può quindi recuperare gli elementi di lavoro tramite REST, eseguire il lavoro e dire a Camunda di completarlo (Principio Pull).

Utilizzo di Camunda per una facile orchestrazione basata su REST e Workflow Engine (no Java)

Quindi prima devi eseguire fetchAndLock (perché altri lavoratori possono ricevere attività contemporaneamente per ridimensionare il sistema):

  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

Allora dillo a Camunda il lavoratore ha completato il lavoro (nota che devi inserire l'ID dell'attività esterna ricevuta nella prima richiesta):

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

Questo è tutto: non hai ancora bisogno di Java, giusto? E questo è sufficiente per iniziare!

Biblioteche clienti

Chiamare un'API REST è facile in qualsiasi linguaggio di programmazione. In JavaScript, questa operazione viene eseguita comodamente utilizzando JQuery e in C# utilizzando System.Net.Http e Newtonsoft.Json. Ma questo richiederà tempo. Quindi puoi semplicemente usare qualche libreria client.

Al momento sono disponibili diverse librerie client già pronte:

  • JavaScript: collegamento. Supportato da Camunda;
  • Giava: collegamento. Supportato da Camunda;
  • C #:collegamento и collegamento. Entrambi questi progetti sono in uno stato intermedio e praticamente dormienti, ma possono rappresentare un buon punto di partenza;
  • PHP: collegamento non è una libreria molto completa e non include le ultime modifiche API, ma conosco progetti che la utilizzano.

Ad eccezione di JavaScript e Java, le librerie client non fanno parte del prodotto Camunda stesso. Non aspettarti che supportino tutte le funzionalità dell'API REST di Camunda. Solo perché una libreria non fornisce una determinata funzione non significa che non sia presente, controlla sempre l'API REST di Camunda. I progetti di riferimento utilizzano le librerie come punto di partenza e modello.

Esempio in C#

Utilizzando la libreria client sopra, possiamo semplicemente scrivere:

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

Il codice sorgente completamente funzionante può essere trovato online: collegamento. Un altro esempio è disponibile su collegamento.

Esempio con 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();

Ulteriori informazioni sono disponibili sul sito Web. github.com

Modi alternativi per avviare Camunda

Immagine Docker personalizzata con "Camunda standalone WAR"

In alternativa a un'immagine Docker precostruita da Camunda, puoi preparare tu stesso Tomcat (ad esempio, basandoti sulle immagini ufficiali Docker Tomcat) e quindi copiarvi Camunda come uno dei cosiddetti file WAR.

Utilizzo di Camunda per una facile orchestrazione basata su REST e Workflow Engine (no Java)

Se hai molti requisiti aggiuntivi e puoi configurare un ambiente di compilazione Java, puoi anche configurare Camunda Standalone War. Configura una build Maven come in questi esempi: build Maven con configurazione di guerra o assemblaggio Maven con sovrapposizione.

Avvio della distribuzione Camunda Tomcat

Un'altra opzione è semplicemente scaricare la distribuzione Camunda Tomcat, decomprimerla ed eseguirla. Per fare ciò, hai solo bisogno di Java Runtime Environment (JRE) installato sul tuo computer. Può essere facilmente scarica da qui.

Utilizzo di Camunda per una facile orchestrazione basata su REST e Workflow Engine (no Java)

Per modificare il database o fare qualsiasi altra cosa è necessario configurare Tomcat come descritto nella documentazione. So che Tomcat può sembrare complicato, ma in realtà è molto semplice. E Google conosce le risposte a tutto ciò che potrebbe essere necessario nel processo.

Eseguire Camunda utilizzando Tomcat

L'ultima alternativa è configurare Tomcat da soli e installarvi Camunda, seguendo la descrizione dell'installazione. Questo ti darà la possibilità di utilizzare la versione di Tomcat che preferisci o di installarla, ad esempio, come servizio Windows.

Avvio della produzione di Camunda

Questo di solito richiederà una configurazione finale per eseguire Camunda. Ci sono linee guida in Camunda che descrivono questo in grande dettaglio, ma non le approfondirò in questo articolo: nominerò solo un esempio: l'API REST della distribuzione non è configurata per l'autenticazione per impostazione predefinita. Potresti voler cambiare questo.

Riassumendo-up

Come puoi vedere, è molto semplice iniziare con Camunda, indipendentemente dalla lingua che stai utilizzando. Il punto chiave è che tutta l'interazione avviene tramite l'API REST. Anche l'installazione è piuttosto semplice, soprattutto quando si utilizza Docker.

Fonte: habr.com

Aggiungi un commento