Χρησιμοποιώντας το Camunda για εύκολη ενορχήστρωση με βάση το REST και το Workflow Engine (χωρίς Java)

Γεια σου Χαμπρ! Σας παρουσιάζω τη μετάφραση του άρθρου "Χρησιμοποιήστε την Camunda ως μια εύχρηστη μηχανή ενορχήστρωσης και ροής εργασίας που βασίζεται σε REST (χωρίς να αγγίζετε την Java)" από τον Bernd Rücker.

07.07.2020/XNUMX/XNUMX, μετάφραση Άρθρο Μπερντ Ράκερ

Χρησιμοποιώντας το Camunda για εύκολη ενορχήστρωση με βάση το REST και το Workflow Engine (χωρίς Java)

Συχνά συζητώ την αρχιτεκτονική 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 για εύκολη ενορχήστρωση με βάση το REST και το Workflow Engine (χωρίς Java)

Οι ροές εργασίας στο Camunda ορίζονται στο BPMN, το οποίο είναι βασικά ένα αρχείο XML. Μπορεί να μοντελοποιηθεί με Camunda Modeler.

Εκτέλεση του Camunda μέσω μιας προ-ενσωματωμένης εικόνας Docker

Ο ευκολότερος τρόπος για να εκτελέσετε το Camunda είναι να χρησιμοποιήσετε το Docker. Εναλλακτικοί τρόποι εκκίνησης του Camunda περιγράφονται παρακάτω σε αυτό το άρθρο.

Χρησιμοποιώντας το Camunda για εύκολη ενορχήστρωση με βάση το REST και το Workflow Engine (χωρίς Java)

Σε αυτήν την περίπτωση, απλώς εκτελέστε:

  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, μοιάζει με αυτό:

Χρησιμοποιώντας το Camunda για εύκολη ενορχήστρωση με βάση το REST και το Workflow Engine (χωρίς Java)

Τώρα μπορείτε να χρησιμοποιήσετε REST API για ανάπτυξη μοντέλου διεργασίας. Ας υποθέσουμε ότι το αποθηκεύσατε ως trip.bpmn και εκτελείτε το Camunda μέσω Docker, ώστε να είναι διαθέσιμο στο localhost:8080:

  curl -w "n" 
-H "Accept: application/json" 
-F "deployment-name=trip" 
-F "enable-duplicate-filtering=true" 
-F "deploy-changed-only=true" 
-F "[email protected]" 
http://localhost:8080/engine-rest/deployment/creat

Τώρα μπορείτε να τρέξετε νέες περιπτώσεις ροής εργασίας χρησιμοποιώντας το REST API και μεταβιβάστε τα δεδομένα που θέλετε να δείτε ως μεταβλητές παρουσίας ροής εργασίας:

  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

Η επόμενη ενδιαφέρουσα ερώτηση είναι: πώς καλεί ο Καμούντα διαδικασίες όπως η κράτηση αυτοκινήτου; Η Camunda δεν μπορεί μόνο να καλέσει υπηρεσίες αμέσως (Push-Principle) χρησιμοποιώντας κάποιο ενσωματωμένο συνδετήρες, αλλά και βάλτε τα είδη εργασίας σε ένα είδος ενσωματωμένης σειράς. Ο εργαζόμενος μπορεί στη συνέχεια να ανακτήσει αντικείμενα εργασίας μέσω REST, να εκτελέσει την εργασία και να πει στον Camunda να ολοκληρώσει (Pull-Principle).

Χρησιμοποιώντας το Camunda για εύκολη ενορχήστρωση με βάση το REST και το Workflow Engine (χωρίς Java)

Άρα πρώτα πρέπει να εκτελέσετε 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

Τότε πες το στην Καμούντα εργάτης ολοκλήρωσε την εργασία (σημειώστε ότι πρέπει να εισαγάγετε το εξωτερικό αναγνωριστικό εργασίας που λάβατε στο πρώτο αίτημα):

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

Αυτό ήταν - ακόμα δεν χρειάζεστε Java, σωστά; Και αυτό είναι αρκετό για να ξεκινήσετε!

Βιβλιοθήκες πελατών

Η κλήση ενός REST API είναι εύκολη σε οποιαδήποτε γλώσσα προγραμματισμού. Στη JavaScript, αυτό γίνεται εύκολα χρησιμοποιώντας JQuery και σε C#, χρησιμοποιώντας System.Net.Http και Newtonsoft.Json. Αυτό όμως θα πάρει χρόνο. Έτσι, μπορείτε απλώς να χρησιμοποιήσετε κάποια βιβλιοθήκη πελατών.

Αυτή τη στιγμή, αρκετές έτοιμες βιβλιοθήκες πελατών είναι διαθέσιμες:

  • JavaScript: σύνδεσμος. Υποστηρίζεται από την Camunda.
  • Java: σύνδεσμος. Υποστηρίζεται από την 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", "..." }
    });

Μπορείτε να βρείτε τον πηγαίο κώδικα που λειτουργεί πλήρως στο διαδίκτυο: σύνδεσμος. Ένα άλλο παράδειγμα είναι διαθέσιμο στο σύνδεσμος.

Παράδειγμα με το 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 + " - added something";
    callback(null, {
      variables: {
        someNewData: someNewData
      }
    });
  });
  
  workers.shutdown();

Περισσότερες πληροφορίες μπορείτε να βρείτε στον ιστότοπο Github.com

Εναλλακτικοί τρόποι εκκίνησης του Camunda

Προσαρμοσμένη εικόνα Docker με "Camunda standalone WAR"

Ως εναλλακτική λύση σε μια προκατασκευασμένη εικόνα Docker από την Camunda, μπορείτε να προετοιμάσετε μόνοι σας το Tomcat (για παράδειγμα, με βάση τις επίσημες εικόνες Docker Tomcat) και στη συνέχεια να αντιγράψετε το Camunda σε αυτό ως ένα από τα λεγόμενα αρχεία WAR.

Χρησιμοποιώντας το Camunda για εύκολη ενορχήστρωση με βάση το REST και το Workflow Engine (χωρίς Java)

Εάν έχετε πολλές πρόσθετες απαιτήσεις και μπορείτε να ρυθμίσετε ένα περιβάλλον δημιουργίας Java, μπορείτε επίσης να ρυθμίσετε το Camunda Standalone war. Ρυθμίστε μια έκδοση Maven όπως σε αυτά τα παραδείγματα: build Maven with war config ή συναρμολόγηση Maven με Overlay.

Έναρξη της διανομής Camunda Tomcat

Μια άλλη επιλογή είναι απλώς να κάνετε λήψη της διανομής Camunda Tomcat, να την αποσυμπιέσετε και να την εκτελέσετε. Αυτό απαιτεί μόνο το Java Runtime Environment (JRE) εγκατεστημένο στον υπολογιστή σας. Μπορεί να είναι εύκολα κατεβάστε από εδώ.

Χρησιμοποιώντας το Camunda για εύκολη ενορχήστρωση με βάση το REST και το Workflow Engine (χωρίς Java)

Για να αλλάξετε τη βάση δεδομένων ή να κάνετε οτιδήποτε άλλο, πρέπει να διαμορφώσετε το Tomcat like περιγράφεται στην τεκμηρίωση. Ξέρω ότι το Tomcat μπορεί να ακούγεται περίπλοκο, αλλά στην πραγματικότητα είναι πολύ απλό. Και η Google γνωρίζει τις απαντήσεις σε όλα όσα μπορεί να απαιτηθούν στη διαδικασία.

Τρέχοντας την Camunda χρησιμοποιώντας Tomcat

Η τελευταία εναλλακτική είναι να εγκαταστήσετε το Tomcat μόνοι σας και να εγκαταστήσετε το Camunda σε αυτό, ακολουθώντας την περιγραφή εγκατάστασης. Αυτό θα σας δώσει την επιλογή να χρησιμοποιήσετε όποια έκδοση του Tomcat προτιμάτε ή να την εγκαταστήσετε ως υπηρεσία Windows, για παράδειγμα.

Ξεκινώντας την Camunda στην παραγωγή

Αυτό συνήθως απαιτεί κάποια τελική ρύθμιση για την εκτέλεση του Camunda. Υπάρχουν οδηγίες στο Camunda που το περιγράφουν με μεγάλη λεπτομέρεια, αλλά δεν θα αναφερθώ σε αυτές σε αυτό το άρθρο - θα αναφέρω μόνο ένα παράδειγμα: το REST API της διανομής δεν έχει ρυθμιστεί για έλεγχο ταυτότητας από προεπιλογή. Μπορεί να θέλετε να το αλλάξετε αυτό.

Συνοψίζοντας-up

Όπως μπορείτε να δείτε, είναι πολύ εύκολο να ξεκινήσετε με την Camunda, ανεξάρτητα από τη γλώσσα που χρησιμοποιείτε. Το βασικό σημείο είναι ότι όλη η αλληλεπίδραση γίνεται μέσω του REST API. Η εγκατάσταση είναι επίσης αρκετά εύκολη, ειδικά όταν χρησιμοποιείτε το Docker.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο