Συχνά συζητώ την αρχιτεκτονική microservice με άτομα που δεν είναι Java: προγραμματιστές C#, προγραμματιστές Node.JS/JavaScript ή λάτρεις του Golang. Όλοι αντιμετωπίζουν το γεγονός ότι χρειάζονται έναν μηχανισμό ενορχήστρωσης σε μια αρχιτεκτονική microservice, ή απλώς ένα εργαλείο για τον εξορθολογισμό της ροής εργασίας και την απόκτηση της δυνατότητας παραγγελίας, διαχείρισης χρονικών ορίων, Saga και αντιστάθμισης συναλλαγών.
Πλατφόρμα BPM με ανοιχτού κώδικα από την Camunda εξαιρετικό για τέτοιες εργασίες. Η φιλικότητα προς τους προγραμματιστές είναι ένα από τα βασικά χαρακτηριστικά του προϊόντος. Αλλά αν κοιτάξετε την τεκμηρίωσή του, ίσως έχετε την εντύπωση ότι η «φιλικότητα» της Camunda απευθύνεται κυρίως σε προγραμματιστές Java. Η πλατφόρμα παρέχει πολλές επιλογές για τη σύνδεση των δικών σας λειτουργιών και επεκτάσεων, αλλά όλα γίνονται σε Java. Είναι αλήθεια;
Οχι! Στην πραγματικότητα, μπορείτε εύκολα να εκτελέσετε το Camunda χωρίς καμία γνώση Java και να ρυθμίσετε την αρχιτεκτονική για τον κώδικα σε οποιαδήποτε γλώσσα της επιλογής σας. Σε αυτό το άρθρο, θα εξετάσουμε:
βασική αρχιτεκτονική?
REST API
συμβουλές για υπάρχουσες βιβλιοθήκες πελατών για γλώσσες άλλες εκτός της Java.
παράδειγμα χρησιμοποιώντας C# και Node.JS;
τρόποι εκκίνησης του διακομιστή Camunda (Docker ή Tomcat).
Αρχιτεκτονική
Το Camunda είναι γραμμένο σε Java και χρειάζεται μια εικονική μηχανή Java (JVM) για να εκτελεστεί. Η Camunda παρέχει ένα REST API που σας επιτρέπει να γράφετε σε οποιαδήποτε γλώσσα θέλετε και να χρησιμοποιείτε το REST με το Camunda:
Οι ροές εργασίας στο Camunda ορίζονται στο BPMN, το οποίο είναι βασικά ένα αρχείο XML. Μπορεί να μοντελοποιηθεί με Camunda Modeler.
Εκτέλεση του Camunda μέσω μιας προ-ενσωματωμένης εικόνας Docker
Ο ευκολότερος τρόπος για να εκτελέσετε το Camunda είναι να χρησιμοποιήσετε το Docker. Εναλλακτικοί τρόποι εκκίνησης του Camunda περιγράφονται παρακάτω σε αυτό το άρθρο.
Σε αυτήν την περίπτωση, απλώς εκτελέστε:
docker run -d -p 8080:8080 camunda/camunda-bpm-platform:latest
Δεν χρειάζεται να ανησυχείτε για Linux, JVM ή Tomcat. Dockerfiles και βασική τεκμηρίωση (για παράδειγμα, οδηγίες για τη σύνδεση με τις απαιτούμενες βάσεις δεδομένων) είναι διαθέσιμα στη διεύθυνση Github.
Εάν θέλετε να εκτελέσετε την Camunda Enterprise Edition, μπορείτε εύκολα να αλλάξετε Dockerfile.
Ωστόσο, η εκτέλεση του Camunda με το Docker έχει ένα μειονέκτημα: θα καταλήξετε με μια έκδοση του Tomcat που δεν περιλαμβάνει πάντα τις πιο πρόσφατες διορθώσεις. Για να το αντιμετωπίσετε, μπορείτε να δημιουργήσετε τη δική σας εικόνα Docker με βάση την επιθυμητή διανομή Tomcat, όπως φαίνεται σε αυτό το παράδειγμα, ή να χρησιμοποιήσετε μία από τις λύσεις που περιγράφονται παρακάτω.
Ανάπτυξη μοντέλου διαδικασίας
Ας δούμε ένα παράδειγμα χρησιμοποιώντας το πρότυπο Saga για μια κλασική κράτηση ταξιδιού, όπου θέλετε να ενεργοποιήσετε τρεις ενέργειες στη σειρά και να αντισταθμίσετε με χάρη τις επιτυχώς ολοκληρωμένες ενέργειες σε περίπτωση μεταγενέστερης αποτυχίας. Αντιπροσωπεύεται στη μορφή BPMN, μοιάζει με αυτό:
Τώρα μπορείτε να χρησιμοποιήσετε REST API για ανάπτυξη μοντέλου διεργασίας. Ας υποθέσουμε ότι το αποθηκεύσατε ως trip.bpmn και εκτελείτε το Camunda μέσω Docker, ώστε να είναι διαθέσιμο στο localhost:8080:
Τώρα μπορείτε να τρέξετε νέες περιπτώσεις ροής εργασίας χρησιμοποιώντας το REST API και μεταβιβάστε τα δεδομένα που θέλετε να δείτε ως μεταβλητές παρουσίας ροής εργασίας:
Η επόμενη ενδιαφέρουσα ερώτηση είναι: πώς καλεί ο Καμούντα διαδικασίες όπως η κράτηση αυτοκινήτου; Η Camunda δεν μπορεί μόνο να καλέσει υπηρεσίες αμέσως (Push-Principle) χρησιμοποιώντας κάποιο ενσωματωμένο συνδετήρες, αλλά και βάλτε τα είδη εργασίας σε ένα είδος ενσωματωμένης σειράς. Ο εργαζόμενος μπορεί στη συνέχεια να ανακτήσει αντικείμενα εργασίας μέσω REST, να εκτελέσει την εργασία και να πει στον Camunda να ολοκληρώσει (Pull-Principle).
Άρα πρώτα πρέπει να εκτελέσετε fetchAndLock (επειδή άλλοι εργαζόμενοι μπορούν να λάβουν εργασίες ταυτόχρονα για να κλιμακώσουν το σύστημα):
Τότε πες το στην Καμούντα εργάτης ολοκλήρωσε την εργασία (σημειώστε ότι πρέπει να εισαγάγετε το εξωτερικό αναγνωριστικό εργασίας που λάβατε στο πρώτο αίτημα):
Αυτό ήταν - ακόμα δεν χρειάζεστε Java, σωστά; Και αυτό είναι αρκετό για να ξεκινήσετε!
Βιβλιοθήκες πελατών
Η κλήση ενός REST API είναι εύκολη σε οποιαδήποτε γλώσσα προγραμματισμού. Στη JavaScript, αυτό γίνεται εύκολα χρησιμοποιώντας JQuery και σε C#, χρησιμοποιώντας System.Net.Http και Newtonsoft.Json. Αυτό όμως θα πάρει χρόνο. Έτσι, μπορείτε απλώς να χρησιμοποιήσετε κάποια βιβλιοθήκη πελατών.
Αυτή τη στιγμή, αρκετές έτοιμες βιβλιοθήκες πελατών είναι διαθέσιμες:
JavaScript: σύνδεσμος. Υποστηρίζεται από την Camunda.
ΝΤΟ#:σύνδεσμος и σύνδεσμος. Και τα δύο αυτά έργα βρίσκονται σε ενδιάμεση κατάσταση και πρακτικά αδρανοποιημένα, αλλά μπορούν να χρησιμεύσουν ως καλό σημείο εκκίνησης.
PHP: σύνδεσμος - όχι πολύ ολοκληρωμένο και δεν περιλαμβάνει τις τελευταίες αλλαγές API, αλλά γνωρίζω έργα που το χρησιμοποιούν.
Με εξαίρεση την JavaScript και την Java, οι βιβλιοθήκες πελατών δεν αποτελούν μέρος του ίδιου του προϊόντος Camunda. Μην περιμένετε να υποστηρίζουν όλες τις δυνατότητες REST API της Camunda. Ακριβώς επειδή μια βιβλιοθήκη δεν παρέχει μια συγκεκριμένη λειτουργία δεν σημαίνει ότι δεν είναι εκεί, ελέγχετε πάντα το REST API της Camunda. Τα έργα αναφοράς χρησιμοποιούν βιβλιοθήκες ως σημείο εκκίνησης και πρότυπο.
Παράδειγμα C#
Χρησιμοποιώντας την παραπάνω βιβλιοθήκη πελάτη, μπορούμε απλά να γράψουμε:
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", "..." }
});
Μπορείτε να βρείτε τον πηγαίο κώδικα που λειτουργεί πλήρως στο διαδίκτυο: σύνδεσμος. Ένα άλλο παράδειγμα είναι διαθέσιμο στο σύνδεσμος.
Περισσότερες πληροφορίες μπορείτε να βρείτε στον ιστότοπο Github.com
Εναλλακτικοί τρόποι εκκίνησης του Camunda
Προσαρμοσμένη εικόνα Docker με "Camunda standalone WAR"
Ως εναλλακτική λύση σε μια προκατασκευασμένη εικόνα Docker από την Camunda, μπορείτε να προετοιμάσετε μόνοι σας το Tomcat (για παράδειγμα, με βάση τις επίσημες εικόνες Docker Tomcat) και στη συνέχεια να αντιγράψετε το Camunda σε αυτό ως ένα από τα λεγόμενα αρχεία WAR.
Εάν έχετε πολλές πρόσθετες απαιτήσεις και μπορείτε να ρυθμίσετε ένα περιβάλλον δημιουργίας Java, μπορείτε επίσης να ρυθμίσετε το Camunda Standalone war. Ρυθμίστε μια έκδοση Maven όπως σε αυτά τα παραδείγματα: build Maven with war config ή συναρμολόγηση Maven με Overlay.
Έναρξη της διανομής Camunda Tomcat
Μια άλλη επιλογή είναι απλώς να κάνετε λήψη της διανομής Camunda Tomcat, να την αποσυμπιέσετε και να την εκτελέσετε. Αυτό απαιτεί μόνο το Java Runtime Environment (JRE) εγκατεστημένο στον υπολογιστή σας. Μπορεί να είναι εύκολα κατεβάστε από εδώ.
Για να αλλάξετε τη βάση δεδομένων ή να κάνετε οτιδήποτε άλλο, πρέπει να διαμορφώσετε το Tomcat like περιγράφεται στην τεκμηρίωση. Ξέρω ότι το Tomcat μπορεί να ακούγεται περίπλοκο, αλλά στην πραγματικότητα είναι πολύ απλό. Και η Google γνωρίζει τις απαντήσεις σε όλα όσα μπορεί να απαιτηθούν στη διαδικασία.
Τρέχοντας την Camunda χρησιμοποιώντας Tomcat
Η τελευταία εναλλακτική είναι να εγκαταστήσετε το Tomcat μόνοι σας και να εγκαταστήσετε το Camunda σε αυτό, ακολουθώντας την περιγραφή εγκατάστασης. Αυτό θα σας δώσει την επιλογή να χρησιμοποιήσετε όποια έκδοση του Tomcat προτιμάτε ή να την εγκαταστήσετε ως υπηρεσία Windows, για παράδειγμα.
Ξεκινώντας την Camunda στην παραγωγή
Αυτό συνήθως απαιτεί κάποια τελική ρύθμιση για την εκτέλεση του Camunda. Υπάρχουν οδηγίες στο Camunda που το περιγράφουν με μεγάλη λεπτομέρεια, αλλά δεν θα αναφερθώ σε αυτές σε αυτό το άρθρο - θα αναφέρω μόνο ένα παράδειγμα: το REST API της διανομής δεν έχει ρυθμιστεί για έλεγχο ταυτότητας από προεπιλογή. Μπορεί να θέλετε να το αλλάξετε αυτό.
Συνοψίζοντας-up
Όπως μπορείτε να δείτε, είναι πολύ εύκολο να ξεκινήσετε με την Camunda, ανεξάρτητα από τη γλώσσα που χρησιμοποιείτε. Το βασικό σημείο είναι ότι όλη η αλληλεπίδραση γίνεται μέσω του REST API. Η εγκατάσταση είναι επίσης αρκετά εύκολη, ειδικά όταν χρησιμοποιείτε το Docker.