Ciao, Habr! Ti presento la traduzione di un articolo autore Bernd Rücker.
07.07.2020, traduzione Bernd Rücker

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

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

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

Ora puoi utilizzare . 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 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 , 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).

Quindi, per prima cosa devi eseguire 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 (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: . Supporta Camunda;
- Java: . Supporta Camunda;
- C#: e . Entrambi questi progetti sono in uno stato intermedio e praticamente inattivi, ma possono servire come un buon punto di partenza;
- PHP: — 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 ListIl codice sorgente completamente funzionante è disponibile online: . 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();
Maggiori dettagli possono essere trovati sul sito
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.

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

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