Utilizzare Camunda per un'agevole orchestrazione basata su REST e Workflow Engine (senza Java)

Ciao, Habr! Vi presento la traduzione dell'articolo «Utilizzare Camunda come motore di orchestrazione e flusso di lavoro REST facile da usare (senza toccare Java)» autore Bernd Rücker.

07.07.2020, traduzione sul CommunityHelpWiki (sullo stesso dominio Bernd Rücker

Utilizzare Camunda per un'agevole orchestrazione basata su REST e Workflow Engine (senza Java)

Discuterò spesso di architettura a microservizi con persone lontane da Java: sviluppatori C#, Node.JS/JavaScript o sostenitori di Golang. Tutti loro si trovano di fronte alla necessità di un meccanismo di orchestrazione nell'architettura a microservizi o semplicemente a uno strumento per ottimizzare il flusso di lavoro e per ottenere funzionalità di ordinamento, gestione dei timeout, Saga e transazioni compensative.

La piattaforma BPM con codice sorgente aperto di Camunda è perfetta per tali compiti. L'attenzione verso gli sviluppatori è una delle caratteristiche chiave del prodotto. Ma se si guarda alla sua documentazione, si potrebbe avere l'impressione che principalmente l'«attenzione» di Camunda sia rivolta agli sviluppatori Java. La piattaforma offre molte possibilità per collegare funzioni e estensioni personalizzate, ma tutto ciò si fa in Java. È davvero così?

No! In realtà, è possibile avviare facilmente Camunda senza alcuna conoscenza di Java e impostare l'architettura per il codice in qualsiasi linguaggio a tua scelta. In questo articolo esploreremo:

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

Architettura

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

Utilizzare Camunda per un'agevole orchestrazione basata su REST e Workflow Engine (senza Java)

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

Avvio di Camunda tramite un'immagine Docker preconfezionata

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

Utilizzare Camunda per un'agevole orchestrazione basata su REST e Workflow Engine (senza Java)

In questo caso, basta eseguire:

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

Non devi preoccuparti di Linux, macchine virtuali Java o Tomcat. I Dockerfile e la documentazione principale (come le istruzioni per connettersi ai database necessari) sono disponibili su Github.

Se desideri eseguire Camunda Enterprise Edition, puoi facilmente modificarlo Dockerfile.

Tuttavia, l'esecuzione di Camunda tramite Docker presenta un inconveniente: si ottiene una versione di Tomcat che non include sempre le ultime correzioni. Per aggirare questo problema, puoi creare 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

Esaminiamo un esempio utilizzando il modello Saga per la prenotazione classica di viaggi, dove si desidera chiamare tre azioni in sequenza e compensare correttamente le azioni eseguite con successo in caso di un fallimento successivo. Presentato in forma BPMN, appare come segue:

Utilizzare Camunda per un'agevole orchestrazione 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 abbia avviato Camunda tramite Docker, rendendolo accessibile 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 del processo utilizzando l'API REST e passando i dati che desideri visualizzare come variabili dell'istanza del processo:

  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 è: come Camunda chiama procedure come la prenotazione di un'auto? Camunda può non solo chiamare immediatamente i servizi (Principio Push), utilizzando alcuni connettori incorporati, ma anche posizionare i task in una sorta di coda integrata. Dopodiché, il worker può recuperare i task tramite REST, completare il lavoro e informare Camunda del completamento (Principio Pull).Quindi, per prima cosa devi eseguire

Utilizzare Camunda per un'agevole orchestrazione basata su REST e Workflow Engine (senza Java)

fetchAndLock dato che altri worker possono acquisire task in parallelo 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

  Dopo, informi Camunda che

il worker ha completato il lavoro (nota che devi inserire l'ID 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

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

Ecco, per ora non hai ancora avuto bisogno di Java, giusto? E questo è sufficiente per iniziare a lavorare!

Librerie client

Chiamare un'API REST è facile in qualsiasi linguaggio di programmazione. In JavaScript è comodo farlo tramite JQuery, mentre in C# si utilizza System.Net.Http e Newtonsoft.Json. Ma ci vorrà del tempo. Quindi puoi semplicemente usare una libreria client.

Al momento sono disponibili diverse librerie client pronte:

  • JavaScript: link. Camunda è supportata;
  • Java: link. Camunda è supportata;
  • C#:link e link. Entrambi questi progetti si trovano in uno stato intermedio e sono praticamente inattivi, ma possono servire come un buon punto di partenza;
  • PHP: link — una libreria non molto completa e non aggiornata con le ultime modifiche dell'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. Se una libreria non fornisce una certa funzione, non significa che non ci sia, controlla sempre l'API REST di Camunda. I progetti standard utilizzano le librerie come punto di partenza e modello.

Esempio con C#

Utilizzando la libreria client sopra menzionata, 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 il vero lavoro! Come un sysout :-)
    Console.WriteLine("Riservando auto ora...");
    camunda.ExternalTaskService.Complete(workerId, externalTask.Id);
  });
  registerWorker("cancel-car", externalTask => {
    Console.WriteLine("Annullando auto ora...");
    camunda.ExternalTaskService.Complete(workerId, externalTask.Id);
  });
  registerWorker("book-hotel", externalTask => {
    Console.WriteLine("Riservando hotel ora...");
    camunda.ExternalTaskService.Complete(workerId, externalTask.Id);
  });
  \\ Registra più lavoratori...
  
  StartPolling();
  
  string processInstanceId = camunda.BpmnWorkflowService.StartProcessInstance("FlowingTripBookingSaga", new Dictionary()
    {
      {"someBookingData", "..." }
    });

Il codice sorgente completamente funzionante può essere trovato su Internet: 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();

Maggiore informazioni possono essere trovate sul sito github.com

Modi alternativi per avviare Camunda

Immagine Docker personalizzata con "Camunda standalone WAR"

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

Utilizzare Camunda per un'agevole orchestrazione basata su REST e Workflow Engine (senza Java)

Se hai molte ulteriori richieste e puoi configurare l'ambiente di build Java, puoi anche impostare Camunda Standalone war. Imposta la build Maven come in questi esempi: build Maven con configurazione war o build Maven con Overlay.

Avvio della distribuzione Camunda Tomcat

Un'altra opzione è semplicemente scaricare la distribuzione Camunda Tomcat, estrarla e avviarla. Per questo avrai solo bisogno di Java Runtime Environment (JRE), installato sul tuo computer. Puoi facilmente scaricarlo da qui.

Utilizzare Camunda per un'agevole orchestrazione basata su REST e Workflow Engine (senza Java)

Per modificare il database o fare qualcos'altro, è necessario configurare Tomcat, come documentato 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 durante il processo.

Avvio di Camunda utilizzando Tomcat

L'ultima alternativa è configurare autonomamente Tomcat e installare Camunda in esso, seguendo la descrizione dell'installazione. Questo permetterà di utilizzare qualsiasi versione di Tomcat che preferisci, o ad esempio, di installarlo come servizio Windows.

Avvio di Camunda in produzione

In genere, per questo sarà necessario completare alcune impostazioni finali per avviare Camunda. In Camunda ci sono raccomandazioni che lo descrivono con molta attenzione, ma non le tratterò in questo articolo — citerò solo un esempio: l'API REST della distribuzione per impostazione predefinita non è configurata per l'autenticazione. Potresti voler cambiare questo.

Conclusione

Come avrai notato, è molto semplice iniziare a lavorare con Camunda, indipendentemente dal linguaggio che stai utilizzando. Il punto chiave è che tutte le interazioni avvengono tramite l'API REST. L'installazione è anche piuttosto semplice, soprattutto 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