Cześć, Habr! Przedstawiam wam tłumaczenie artykułu autora Bernda Rückera.
07.07.2020 r., tłumaczenie Bernd Rücker

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

Przepływy pracy w Camunda są definiowane w BPMN, który w zasadzie stanowi plik XML. Można go modelować za pomocą .
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.

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 .
Jeśli chcesz uruchomić Camunda Enterprise Edition, możesz łatwo dokonać zmiany .
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:

Teraz możesz używać . 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ć 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 , 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).

Zatem najpierw musisz wykonać (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 (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: . Camunda jest wspierana;
- Java: . Camunda jest wspierana;
- C#: i . Oba te projekty są w stanie wstępnym i praktycznie nieaktywnym, ale mogą być dobrą bazą wyjściową;
- PHP: — 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 ListPełny działający kod źródłowy można znaleźć w Internecie: . Inny przykład dostępny jest pod adresem .
Пример с 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
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.

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 lub budowa .
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 .

Aby zmienić bazę danych lub zrobić coś innego, musisz skonfigurować Tomcat, jak . 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, . 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
