Używanie Camundy do łatwej orkiestracji w oparciu o REST i silnik przepływu pracy (bez Java)

Hej Habro! Zwracam uwagę na tłumaczenie artykułu „Używaj Camundy jako łatwego w obsłudze mechanizmu orkiestracji i przepływu pracy opartego na REST (bez dotykania języka Java)” przez Bernda Rückera.

07.07.2020, tłumaczenie Artykuł Bernda Rückera

Używanie Camundy do łatwej orkiestracji w oparciu o REST i silnik przepływu pracy (bez Java)

Często omawiam architekturę mikrousług z osobami nie znającymi języka Java: programistami C#, programistami Node.JS/JavaScript lub miłośnikami Golang. Wszyscy stają przed faktem, że potrzebują mechanizmu orkiestracji w architekturze mikroserwisowej lub po prostu narzędzia usprawniającego przepływ pracy i zyskującego możliwość zamawiania, obsługi timeoutów, Saga i transakcji kompensacyjnych.

Platforma BPM z open source z Camundy świetny do takich zadań. Przyjazność dla programistów to jedna z kluczowych cech produktu. Ale jeśli spojrzysz na dokumentację, możesz odnieść wrażenie, że „przyjazność” Camundy jest skierowana głównie do programistów Java. Platforma zapewnia wiele możliwości podłączenia własnych funkcji i rozszerzeń, jednak całość odbywa się w Javie. Czy to naprawdę?

NIE! W rzeczywistości możesz łatwo uruchomić Camundę bez znajomości języka Java i skonfigurować architekturę kodu w dowolnym wybranym języku. W tym artykule przyjrzymy się:

  • podstawowa architektura;
  • API RESTOWE
  • doradztwo w zakresie istniejących bibliotek klienckich dla języków innych niż Java;
  • przykład z użyciem C# i Node.JS;
  • sposoby uruchomienia serwera Camunda (Docker lub Tomcat).

Architektura

Camunda jest napisana w Javie i do działania wymaga wirtualnej maszyny Java (JVM). Camunda udostępnia interfejs API REST, który pozwala pisać w dowolnym języku i używać REST z Camundą:

Używanie Camundy do łatwej orkiestracji w oparciu o REST i silnik przepływu pracy (bez Java)

Przepływy pracy w Camunda są zdefiniowane w BPMN, który jest w zasadzie plikiem XML. Można nim modelować Modelarz Camundy.

Uruchamianie Camundy za pomocą gotowego obrazu Dockera

Najłatwiejszym sposobem uruchomienia Camundy jest użycie Dockera. Alternatywne sposoby uruchomienia Camundy opisano w dalszej części tego artykułu.

Używanie Camundy do łatwej orkiestracji w oparciu o REST i silnik przepływu pracy (bez Java)

W takim przypadku po prostu uruchom:

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

Nie musisz się martwić o Linuksa, maszyny JVM ani Tomcats. Pliki Dockerfile i podstawowa dokumentacja (na przykład instrukcje dotyczące łączenia się z wymaganymi bazami danych) są dostępne pod adresem Github.

Jeśli chcesz uruchomić Camunda Enterprise Edition, możesz łatwo to zmienić Dockerfile.

Jednak uruchamianie Camundy z Dockerem ma jedną wadę: otrzymasz wersję Tomcat, która nie zawsze zawiera najnowsze poprawki. Aby obejść ten problem, możesz utworzyć własny obraz Dockera w oparciu o pożądaną dystrybucję Tomcat, jak pokazano w tym przykładzie, lub skorzystać z jednego z rozwiązań opisanych poniżej.

Wdrażanie modelu procesu

Przyjrzyjmy się przykładowi wykorzystania szablonu Saga do klasycznej rezerwacji wycieczki, w której chcesz wywołać trzy akcje z rzędu i z wdziękiem zrekompensować pomyślnie zakończone akcje w przypadku późniejszej porażki. Przedstawiony w formie BPMN wygląda następująco:

Używanie Camundy do łatwej orkiestracji w oparciu o REST i silnik przepływu pracy (bez Java)

Teraz możesz użyć REST API do wdrażania modelu procesu. Powiedzmy, że zapisujesz go jako trip.bpmn i uruchamiasz Camundę za pośrednictwem Dockera, aby była dostępna na 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

Teraz możesz biegać nowe instancje przepływu pracy używając interfejsu API REST i przekaż dane, które chcesz widzieć jako zmienne instancji przepływu pracy:

  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

Kolejne interesujące pytanie brzmi: jak Camunda wywołuje procedury takie jak rezerwacja samochodu? Camunda może nie tylko natychmiast wywoływać usługi (zasada Push), korzystając z wbudowanych rozwiązań złącza, ale także umieszczaj elementy pracy w pewnego rodzaju wbudowanym porządku. Pracownik może następnie pobrać elementy pracy za pośrednictwem protokołu REST, wykonać pracę i nakazać Camundie jej zakończenie (zasada ściągania).

Używanie Camundy do łatwej orkiestracji w oparciu o REST i silnik przepływu pracy (bez Java)

Więc najpierw musisz wykonać pobierz i zablokuj (ponieważ w tym samym czasie inni pracownicy mogą otrzymywać zadania w celu skalowania systemu):

  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

Więc powiedz to Camundzie pracownik zakończył pracę (pamiętaj, że musisz wpisać identyfikator zadania zewnętrznego otrzymany w pierwszym żądaniu):

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

To wszystko — nadal nie potrzebujesz Java, prawda? I to wystarczy, aby zacząć!

Biblioteki klientów

Wywołanie interfejsu API REST jest łatwe w dowolnym języku programowania. W JavaScript można to wygodnie zrobić za pomocą JQuery, a w C# za pomocą System.Net.Http i Newtonsoft.Json. Ale to zajmie trochę czasu. Możesz więc po prostu użyć jakiejś biblioteki klienta.

W tej chwili dostępnych jest kilka gotowych bibliotek klienckich:

  • JavaScript: łącze. Obsługiwane przez Camundę;
  • Jawa: łącze. Obsługiwane przez Camundę;
  • DO#:łącze и łącze. Obydwa projekty są w stanie przejściowym i praktycznie w fazie uśpienia, ale mogą posłużyć jako dobry punkt wyjścia;
  • PHP: łącze - nie jest zbyt kompletny i nie zawiera najnowszych zmian API, ale znam projekty, które z niego korzystają.

Z wyjątkiem JavaScript i Java, biblioteki klienckie nie są częścią samego produktu Camunda. Nie oczekuj, że będą obsługiwać wszystkie funkcje interfejsu API REST Camundy. To, że biblioteka nie udostępnia określonej funkcji, nie oznacza, że ​​jej tam nie ma. Zawsze sprawdzaj interfejs API REST Camundy. Projekty referencyjne wykorzystują biblioteki jako punkt wyjścia i szablon.

Przykład C#

Korzystając z powyższej biblioteki klienta, możemy po prostu napisać:

  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", "..." }
    });

W pełni działający kod źródłowy można znaleźć w Internecie: łącze. Inny przykład jest dostępny pod adresem łącze.

Przykład z 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();

Więcej informacji można znaleźć na stronie internetowej Github.com

Alternatywne sposoby uruchomienia Camundy

Niestandardowy obraz Dockera z „samodzielną wojną Camundy”

Alternatywą dla gotowego obrazu Dockera z Camundy jest możliwość samodzielnego przygotowania Tomcata (np. w oparciu o oficjalne obrazy Dockera Tomcat), a następnie skopiowania do niego Camundy jako jednego z tzw. plików WAR.

Używanie Camundy do łatwej orkiestracji w oparciu o REST i silnik przepływu pracy (bez Java)

Jeśli masz wiele dodatkowych wymagań i możesz skonfigurować środowisko kompilacji Java, możesz także skonfigurować samodzielną wojnę Camunda. Skonfiguruj kompilację Mavena jak w tych przykładach: build Maven z konfiguracją wojenną lub montaż Maven z nakładką.

Rozpoczęcie dystrybucji Camunda Tomcat

Inną opcją jest po prostu pobranie dystrybucji Camunda Tomcat, rozpakowanie jej i uruchomienie. Wymaga to jedynie zainstalowania na komputerze środowiska Java Runtime Environment (JRE). To może być łatwe pobierz stąd.

Używanie Camundy do łatwej orkiestracji w oparciu o REST i silnik przepływu pracy (bez Java)

Aby zmienić bazę danych lub zrobić cokolwiek innego, musisz skonfigurować Tomcat jak opisane w dokumentacji. Wiem, że Tomcat może wydawać się skomplikowany, ale w rzeczywistości jest bardzo prosty. Google zna odpowiedzi na wszystko, co może być wymagane w tym procesie.

Uruchamianie Camundy przy użyciu Tomcata

Ostatnią możliwością jest samodzielne skonfigurowanie Tomcata i zainstalowanie w nim Camundy, zgodnie z opisem instalacji. Dzięki temu będziesz mógł używać dowolnej wersji Tomcata lub zainstalować ją na przykład jako usługę Windows.

Uruchomienie Camundy do produkcji

Zwykle będzie to wymagało ostatecznej konfiguracji, aby uruchomić Camundę. W Camunda są wytyczne, które opisują to bardzo szczegółowo, ale nie będę się nad nimi rozwodzić w tym artykule - podam tylko jeden przykład: interfejs API REST tej dystrybucji nie jest domyślnie skonfigurowany do uwierzytelniania. Być może zechcesz to zmienić.

Sumując

Jak widać, rozpoczęcie pracy z Camundą jest bardzo łatwe, niezależnie od języka, którego używasz. Kluczową kwestią jest to, że cała interakcja odbywa się za pośrednictwem interfejsu API REST. Instalacja jest również dość łatwa, szczególnie w przypadku korzystania z Dockera.

Źródło: www.habr.com

Dodaj komentarz