Utilizzo di Camunda per un'orchestrazione semplice basata su REST e Workflow Engine (senza Java)

Ciao, Habr! Ti presento la traduzione di un articolo «Utilizza Camunda come un motore di orchestrazione e workflow semplice basato su REST (senza toccare Java)» autore Bernd Rücker.

07.07.2020, traduzione articolo Bernd Rücker

Utilizzo di Camunda per un'orchestrazione semplice basata su REST e Workflow Engine (senza Java)

Discutendo frequentemente dell'architettura a microservizi con persone che non hanno familiarità con Java: sviluppatori C#, Node.JS/JavaScript o sostenitori di Golang. Tutti si trovano ad affrontare il bisogno di un meccanismo di orchestrazione nell'architettura a microservizi o semplicemente di uno strumento per ottimizzare il flusso di lavoro, permettendo di gestire ordinamenti, timeout, Saga e transazioni compensative.

Piattaforma BPM con codice aperto di Camunda è perfetta per tali compiti. L'ospitalità verso gli sviluppatori è una delle caratteristiche chiave del prodotto. Ma se si guarda alla sua documentazione, può sembrare che principalmente l'«ospitalità» di Camunda sia rivolta agli sviluppatori Java. La piattaforma offre molte opportunità per integrare funzioni ed estensioni personalizzate, ma tutto ciò avviene in Java. È davvero così?

No! In realtà, è possibile avviare Camunda facilmente senza alcuna conoscenza di Java e configurare l'architettura per il codice in qualsiasi linguaggio tu scelga. In questo articolo vedremo:

  • l'architettura di base;
  • l'API REST;
  • consigli sulle librerie client esistenti per linguaggi diversi da Java;
  • un esempio di utilizzo con C# e Node.js;
  • i metodi per avviare il server Camunda (Docker o Tomcat).

Architettura

Camunda è scritta in Java e ha bisogno di una macchina virtuale Java (JVM) per l'esecuzione. Camunda fornisce un'API REST che ti consente di scrivere in qualsiasi linguaggio ti piaccia e di utilizzare REST con Camunda:

Utilizzo di Camunda per un'orchestrazione semplice basata su REST e Workflow Engine (senza Java)

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

Avviare Camunda tramite un'immagine Docker predefinita

Il modo più semplice per avviare Camunda è utilizzare Docker. Altri metodi per eseguire Camunda vengono descritti nelle sezioni seguenti di questo articolo.

Utilizzo di Camunda per un'orchestrazione semplice basata su REST e Workflow Engine (senza Java)

In questo caso, è sufficiente eseguire:

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

Non è necessario preoccuparsi di Linux, macchine virtuali Java o Tomcat. I Dockerfile e la documentazione principale (ad esempio, le istruzioni per connettersi ai database desiderati) sono disponibili su Github.

Se desideri avviare Camunda Enterprise Edition, puoi facilmente modificare Dockerfile.

Tuttavia, avviare Camunda utilizzando Docker presenta uno svantaggio: otterrai una versione di Tomcat che non sempre include le ultime correzioni. Per aggirare questo problema, puoi creare autonomamente un'immagine Docker basata sulla distribuzione di Tomcat desiderata, come mostrato in questo esempio, oppure utilizzare una delle soluzioni descritte di seguito.

Distribuzione del modello di processo

Consideriamo un esempio usando il modello Saga per una prenotazione classica di viaggi, dove desideri chiamare tre azioni consecutivamente e compensare correttamente le azioni riuscite in caso di un guasto successivo. Presentato in forma BPMN appare come segue:

Utilizzo di Camunda per un'orchestrazione semplice basata su REST e Workflow Engine (senza Java)

Ora puoi utilizzare l'API REST per distribuire il modello di processo. Supponiamo che tu l'abbia salvato con il nome trip.bpmn e che tu abbia avviato Camunda tramite Docker, in modo che sia 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 "trip.bpmn=@trip.bpmn" 
http://localhost:8080/engine-rest/deployment/create

Ora puoi avviare nuovi istanze di workflow utilizzando l'API REST e passando i dati che si desidera 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

Una domanda interessante è: come chiama Camunda le procedure, come quella di prenotazione di un'auto? Camunda può non solo chiamare immediatamente i servizi (Principio Push), utilizzando alcuni connettori integrati connettori, ma anche inserire gli elementi di lavoro in una sorta di coda incorporata. Successivamente, il worker può ricevere gli elementi di lavoro tramite REST, completare il lavoro e informare Camunda della conclusione (Principio Pull).

Utilizzo di Camunda per un'orchestrazione semplice basata su REST e Workflow Engine (senza Java)

Quindi, per prima cosa devi eseguire fetchAndLock poiché altri worker possono ricevere compiti contemporaneamente per scalare 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

Poi informa Camunda che il worker ha completato il lavoro (nota che devi inserire l'identificativo del task esterno ricevuto 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

Ecco qua — non hai ancora avuto bisogno di Java, giusto? E questo è sufficiente per iniziare!

Librerie client

Richiamare l'API REST è semplice in qualsiasi linguaggio di programmazione. In JavaScript si può fare comodamente con JQuery, mentre in C# si utilizza System.Net.Http e Newtonsoft.Json. Ma ci vorrà del tempo. Quindi puoi semplicemente usare una delle librerie client disponibili.

Attualmente sono disponibili diverse librerie client pronte all'uso:

  • JavaScript: link. Supporta Camunda;
  • Java: link. Supporta Camunda;
  • C#:link e link. Entrambi questi progetti sono in uno stato intermedio e praticamente inattivi, ma possono servire come un buon punto di partenza;
  • PHP: link — una libreria non molto completa e che non include le ultime modifiche dell'API, ma conosco progetti che la utilizzano.

A parte JavaScript e Java, le librerie client non fanno parte del prodotto Camunda. Non aspettatevi che supportino tutte le funzionalità dell'API REST di Camunda. Se una libreria non fornisce una determinata funzione, non significa che non sia disponibile; controllate sempre l'API REST di Camunda. I progetti standard utilizzano le librerie come punto di partenza e modello.

Esempio in C#

Utilizzando la libreria client sopra indicata, possiamo semplicemente scrivere:

  var camunda = new CamundaEngineClient("http://localhost:8080/engine-rest/engine/default/", null, null);
  // Distribuisci il file BPMN XML dalle risorse
  camunda.RepositoryService.Deploy("trip-booking", new List {
        FileParameter.FromManifestResource(Assembly.GetExecutingAssembly(), "FlowingTripBookingSaga.Models.FlowingTripBookingSaga.bpmn")
     });
  
  // Registra i lavoratori
  registerWorker("reserve-car", externalTask => {
    // qui puoi fare veramente la cosa! Come un sysout :-)
    Console.WriteLine("Prenotando l'auto...");
    camunda.ExternalTaskService.Complete(workerId, externalTask.Id);
  });
  registerWorker("cancel-car", externalTask => {
    Console.WriteLine("Annullando l'auto...");
    camunda.ExternalTaskService.Complete(workerId, externalTask.Id);
  });
  registerWorker("book-hotel", externalTask => {
    Console.WriteLine("Prenotando l'hotel...");
    camunda.ExternalTaskService.Complete(workerId, externalTask.Id);
  });
  // Registrare più lavoratori...
  
  StartPolling();
  
  string processInstanceId = camunda.BpmnWorkflowService.StartProcessInstance("FlowingTripBookingSaga", new Dictionary()
    {
      {"someBookingData", "..." }
    });

Il codice sorgente completamente funzionante è disponibile online: link. Un altro esempio è disponibile all'indirizzo 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 + " - aggiunto qualcosa";
    callback(null, {
      variables: {
        someNewData: someNewData
      }
    });
  });
  
  workers.shutdown();

Maggiori dettagli possono essere trovati sul sito github.com

Metodi alternativi per avviare Camunda

Immagine Docker personalizzata con "Camunda standalone WAR"

In alternativa all'immagine Docker pronta di Camunda, puoi preparare autonomamente Tomcat (ad esempio basandoti sulle immagini ufficiali di Docker Tomcat) e poi copiare Camunda come uno dei cosiddetti file WAR.

Utilizzo di Camunda per un'orchestrazione semplice basata su REST e Workflow Engine (senza Java)

Se hai molte esigenze aggiuntive e puoi configurare l'ambiente di build Java, puoi anche impostare Camunda Standalone WAR. Configura la build Maven come negli esempi seguenti: build Maven con configurazione WAR oppure build Maven con Overlay.

Esecuzione della distribuzione Camunda Tomcat

Un'altra opzione è semplicemente scaricare la distribuzione Camunda Tomcat, decomprimerla e avviarla. Per questo è necessaria solo la Java Runtime Environment (JRE) installata sul tuo computer. Puoi facilmente scaricarla da qui.

Utilizzo di Camunda per un'orchestrazione semplice basata su REST e Workflow Engine (senza Java)

Per modificare il database o fare altro, devi 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ò di cui potresti avere bisogno durante il processo.

Avvio di Camunda utilizzando Tomcat

L'ultima alternativa è configurare Tomcat autonomamente e installarvi Camunda, seguendo la guida all'installazione. Questo ti permette di utilizzare qualsiasi versione di Tomcat tu preferisca, o, ad esempio, di installarla come servizio Windows.

Avviare Camunda in produzione

In genere, sarà necessario eseguire alcune configurazioni finali per avviare Camunda. Camunda fornisce raccomandazioni dettagliate su questo, ma non le tratterò in questo articolo — citerò solo un esempio: l'API REST della distribuzione predefinita non è configurata per la verifica dell'autenticità. Potresti voler modificare questo.

Riepilogare

Come hai potuto notare, è molto semplice iniziare a lavorare con Camunda, indipendentemente dal linguaggio che utilizzi. Il punto chiave è che tutte le interazioni avvengono tramite l'API REST. Anche l'installazione è piuttosto semplice, specialmente utilizzando Docker.

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster