Ciao, Habr! Vi presento la traduzione dell'articolo autore Bernd Rücker.
07.07.2020, traduzione Bernd Rücker

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 è 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:

I workflow in Camunda sono definiti in BPMN, che è fondamentalmente un file XML. Può essere modellato con .
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.

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 .
Se desideri eseguire Camunda Enterprise Edition, puoi facilmente modificarlo .
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:

Ora puoi utilizzare . 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 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, Quindi, per prima cosa devi eseguire

fetchAndLock 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 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: . Camunda è supportata;
- Java: . Camunda è supportata;
- C#: e . Entrambi questi progetti si trovano in uno stato intermedio e sono praticamente inattivi, ma possono servire come un buon punto di partenza;
- PHP: — 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 ListIl codice sorgente completamente funzionante può essere trovato su Internet: . Un altro esempio è disponibile all'indirizzo .
Пример с 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
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.

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 o build .
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 .

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