Wykorzystanie Camundy do wygodnej orkiestracji opartej na REST i silnika workflow (bez Javy)

Cześć, Habr! Przedstawiam wam tłumaczenie artykułu „Użyj Camunda jako łatwego w użyciu silnika orkiestracji i przepływu pracy opartego na REST (bez dotykania Javy)“ autora Bernda Rückera.

07.07.2020 r., tłumaczenie artykułu Bernd Rücker

Wykorzystanie Camundy do wygodnej orkiestracji opartej na REST i silnika workflow (bez Javy)

Często rozmawiam o architekturze mikrousług z osobami, które nie mają doświadczenia w Javie: programistami C#, Node.JS/JavaScript lub zwolennikami Golanga. Wszyscy oni stają przed potrzebą mechanismu orkiestracji w architekturze mikrousług lub po prostu szukają narzędzia do optymalizacji przepływu pracy i zarządzania procesami, czasami również transakcji Saga i transakcji kompensacyjnych.

Platforma BPM o otwartym kodzie źródłowym od Camunda doskonale nadaje się do takich zadań. Przyjazność dla programisty to jedna z kluczowych cech produktu. Ale gdy spojrzysz na jego dokumentację, może się wydawać, że całe to „przyjazne” podejście Camunda skierowane jest głównie do programistów Javy. Platforma oferuje wiele możliwości do włączania własnych funkcji i rozszerzeń, ale wszystko to odbywa się w Javie. Czy to naprawdę prawda?

Nie! W rzeczywistości można łatwo uruchomić Camunda bez jakiejkolwiek wiedzy o Javie i dostosować architekturę dla kodu w dowolnym preferowanym języku. W tym artykule przyjrzymy się:

  • podstawowej architekturze;
  • REST API;
  • wskazówki dotyczące istniejących bibliotek klienckich dla języków innych niż Java;
  • przykładom użycia C# i Node.JS;
  • sposobom uruchamiania serwera Camunda (Docker lub Tomcat).

Architektura

Camunda jest napisana w Javie i potrzebuje maszyny wirtualnej Javy (JVM) do uruchomienia. Camunda udostępnia REST API, które pozwala pisać w dowolnym preferowanym języku i korzystać z REST z Camunda:

Wykorzystanie Camundy do wygodnej orkiestracji opartej na REST i silnika workflow (bez Javy)

Przepływy pracy w Camunda są definiowane w BPMN, który w zasadzie stanowi plik XML. Można go modelować za pomocą Camunda Modeler.

Uruchamianie Camunda za pomocą wcześniej stworzonego obrazu Docker

Najprostszym sposobem uruchomienia Camunda jest użycie Dockera. Alternatywne metody uruchamiania Camunda opisano poniżej w tym artykule.

Wykorzystanie Camundy do wygodnej orkiestracji opartej na REST i silnika workflow (bez Javy)

W tym przypadku wystarczy po prostu uruchomić:

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

Nie musisz martwić się o Linuxa, maszyny wirtualne Javy ani Tomcaty. Dockerfiles oraz główna dokumentacja (np. instrukcje łączenia z bazami danych) są dostępne na Podróż, którą przeszedłem, okazała się fascynującą wyprawą w przeszłość i cieszę się, że w końcu znalazłem rozwiązanie. Poza tym:.

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

Jednak uruchomienie Camunda za pomocą Dockera ma jedną wadę: otrzymasz wersję Tomcat, która nie zawsze zawiera najnowsze poprawki. Aby to obejść, możesz stworzyć obraz Docker oparty na wymaganej dystrybucji Tomcat, jak pokazano w tym przykładzie, lub skorzystać z jednego z rozwiązań opisanych poniżej.

Wdrożenie modelu procesu

Przyjrzyjmy się przykładzie, używając wzoru Saga dla klasycznej rezerwacji podróży, gdzie chcesz wywołać trzy działania jedno po drugim i poprawnie skompensować pomyślnie wykonane działania w przypadku późniejszej awarii. Przedstawiony w formie BPMN wygląda następująco:

Wykorzystanie Camundy do wygodnej orkiestracji opartej na REST i silnika workflow (bez Javy)

Teraz możesz używać REST API do wdrażania modelu procesu. Załóżmy, że zapisałeś go jako trip.bpmn i uruchomiłeś Camunda przez Docker, aby był dostępny pod adresem 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

Teraz możesz uruchamiać nowe instancje procesu za pomocą REST API i przekazywać dane, które chcesz widzieć jako zmienne instancji procesu:

  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

Następne interesujące pytanie: jak Camunda wywołuje procedury, takie jak rezerwacja samochodu? Camunda może nie tylko natychmiast wywoływać usługi (zasada Push), korzystając z niektórych wbudowanych łączników, ale także umieszczać elementy robocze w swego rodzaju wewnętrznej kolejności. Następnie worker może pobierać elementy robocze przez REST, wykonać pracę i powiadomić Camunda o zakończeniu (zasada Pull).

Wykorzystanie Camundy do wygodnej orkiestracji opartej na REST i silnika workflow (bez Javy)

Zatem najpierw musisz wykonać fetchAndLock (ponieważ inni workerzy mogą jednocześnie 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

Następnie powiedz Camunda, że worker zakończył pracę (zwróć uwagę, że musisz podać identyfikator zadania zewnętrznego, uzyskany 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 — wciąż nie potrzebujesz żadnej Javy, prawda? I to wystarczy, aby rozpocząć pracę!

Biblioteki klienckie

Łatwo jest wywołać REST API w dowolnym języku programowania. W JavaScript można to wygodnie zrobić za pomocą JQuery, a w C# — przy użyciu System.Net.Http i Newtonsoft.Json. Ale to zajmie trochę czasu. Dlatego możesz po prostu skorzystać z jakiejś biblioteki klienckiej.

Obecnie dostępnych jest kilka gotowych bibliotek klienckich:

  • JavaScript: link. Camunda jest wspierana;
  • Java: link. Camunda jest wspierana;
  • C#:link i link. Oba te projekty są w stanie wstępnym i praktycznie nieaktywnym, ale mogą być dobrą bazą wyjściową;
  • PHP: link — niezbyt kompletna i nie obejmująca najnowszych zmian API biblioteka, ale znam projekty, które ją wykorzystują.

Z wyjątkiem JavaScript i Javy, biblioteki klienckie nie są częścią samego produktu Camunda. Nie oczekuj, że będą wspierać wszystkie możliwości REST API Camunda. Jeśli biblioteka nie oferuje jakiejś funkcji, to nie znaczy, że jej tam nie ma, zawsze sprawdzaj REST API Camunda. Typowe projekty używają bibliotek jako bazy wyjściowej i szablonu.

Przykład z C#

Używając wcześniej wspomnianej biblioteki klienckiej, możemy po prostu napisać:

  var camunda = new CamundaEngineClient("http://localhost:8080/engine-rest/engine/default/", null, null);
  // Wdrażanie pliku BPMN XML z zasobów
  camunda.RepositoryService.Deploy("trip-booking", new List {
        FileParameter.FromManifestResource(Assembly.GetExecutingAssembly(), "FlowingTripBookingSaga.Models.FlowingTripBookingSaga.bpmn")
     });
  
  // Rejestracja pracowników
  registerWorker("reserve-car", externalTask => {
    // tutaj możesz zrobić to, co trzeba! Na przykład sysout :-)
    Console.WriteLine("Rezerwacja samochodu...");
    camunda.ExternalTaskService.Complete(workerId, externalTask.Id);
  });
  registerWorker("cancel-car", externalTask => {
    Console.WriteLine("Anulowanie samochodu...");
    camunda.ExternalTaskService.Complete(workerId, externalTask.Id);
  });
  registerWorker("book-hotel", externalTask => {
    Console.WriteLine("Rezerwacja hotelu...");
    camunda.ExternalTaskService.Complete(workerId, externalTask.Id);
  });
  // Rejestracja kolejnych pracowników...
  
  StartPolling();
  
  string processInstanceId = camunda.BpmnWorkflowService.StartProcessInstance("FlowingTripBookingSaga", new Dictionary()
    {
      {"someBookingData", "..." }
    });

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

Пример с 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 + " - dodano coś";
    callback(null, {
      variables: {
        someNewData: someNewData
      }
    });
  });
  
  workers.shutdown();

Szczegółowe informacje można znaleźć na stronie github.com

Alternatywne sposoby uruchomienia Camunda

Obraz Docker z 'Camunda standalone WAR'

Zamiast gotowego obrazu Docker z Camunda, można samodzielnie przygotować Tomcat (na przykład na podstawie oficjalnych obrazów Docker Tomcat) i następnie skopiować do niego Camunda jako jeden z tzw. plików WAR.

Wykorzystanie Camundy do wygodnej orkiestracji opartej na REST i silnika workflow (bez Javy)

Jeśli masz wiele dodatkowych wymagań i możesz dostosować środowisko budowy Java, możesz również skonfigurować Camunda Standalone war. Skonfiguruj budowę Maven zgodnie z tymi przykładami: budowa Maven z konfiguracją war lub budowa Maven z Overlay.

Uruchamianie dystrybucji Camunda Tomcat

Inna opcja to po prostu pobranie dystrybucji Camunda Tomcat, rozpakowanie jej i uruchomienie. Wymaga to tylko Java Runtime Environment (JRE) zainstalowanego na twoim komputerze. Można go łatwo pobrać stąd.

Wykorzystanie Camundy do wygodnej orkiestracji opartej na REST i silnika workflow (bez Javy)

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

Uruchamianie Camunda z użyciem Tomcat

Ostatnia alternatywa to samodzielne skonfigurowanie Tomcat i zainstalowanie w nim Camunda, postępując zgodnie z opisem instalacji. To pozwoli używać dowolnej wersji Tomcat, którą preferujesz, lub na przykład zainstalować ją jako usługę Windows.

Uruchamianie Camunda w produkcji

Zazwyczaj będzie konieczne wykonanie pewnych ostatecznych konfiguracji przed uruchomieniem Camunda. Camunda ma zalecenia, które szczegółowo to opisują, ale nie będę ich poruszał w tym artykule — wspomnę tylko o jednym przykładzie: domyślnie REST API dystrybucji nie jest skonfigurowane do weryfikacji tożsamości. Możliwe, że zechcesz to zmienić.

Podsumowanie

Jak mogłeś zauważyć, rozpoczęcie pracy z Camunda jest bardzo proste, niezależnie od języka, którego używasz. Kluczowym punktem jest to, że wszystkie interakcje odbywają się za pośrednictwem REST API. Instalacja też jest dość prosta, szczególnie przy użyciu Docker.

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster