W artykule o tworzeniu aplikacji reaktywnych w Spring Boot zapoznaliśmy się z paradygmatami programowania reaktywnego oraz przedstawiony został PoC (Proof of concept) z użyciem moduły WebFlux. Bazując na zdobytej wiedzy chciałbym w bieżącym wpisie zrobić wprowadzenie do wykorzystania reaktywnych mikrousług dla REST API.


Cezary Rejczyk. Senior Java Developer w Capsilon. Od prawie 11 lat pracuje jako programista, głównie w sektorze bankowym. Jest zwolennikiem programowania mistrzowskiego i ekstremalnego. Pasjonat gór, skitouring i biegów górskich.


 

Czym jest mikrousługa?

Przykład aplikacji opartej o mikrousługi

Wśród projektantów architektury oprogramowania coraz popularniejsza staje się koncepcja mikroserwisów. Stanowi ona alternatywę dla monolitycznego podejścia do tworzenia aplikacji. Stosowana jest m.in. przez takich graczy jak Amazon, Spotify czy Netflix. Mikrousługi są stylem architektonicznym, zgodnie z którym powstające oprogramowanie składa się z zestawu mikrousług. Powinien on odpowiadać celom biznesowym i zachowywać swoją niezależność. Mikrousługi komunikują się ze sobą za pomocą lekkich protokołów komunikacyjnych, np. HTTP. Każda mikrousługa może być napisana w innym języku programowania oraz wdrażania niezależnie od innych.

Oczywiście mikrousługi nie są panaceum na wszystkie problemy związane z wytwarzaniem oprogramowania. Coraz częściej słyszy się o tzw. ‘microservice dependency hell’. Dlatego solidna analiza wymagań projektu musi być stawiana wyżej niż aktualne trendy i moda.

Redis

Redis (Remote Dictionary Service) jest pamięciową bazą NoSQL przechowującą dane jako pary kluczy, zapewnia wysoką skalowalność, niezawodność i wydajność. Redis to znacznie więcej niż rozproszona pamięć podręczna, przechowuje nie tylko pary klucz-wartość, ale także kolekcje, mapy i inne typy danych. Redis przechowuje zakodowane dane w pamięci, dzięki czemu można przechowywać dużą ilość danych przy minimalnym zużyciu pamięci. Redis może być również skonfigurowany do zapisu danych do pliku dla tolerancji błędu w oparciu o czas i częstotliwość zapisu.

Redis stosuje replikacją master-slave, co oznacza, że ​​można mieć jednego master’a i wiele slave’ów. Umożliwia dystrybucję obciążenia między maszynami i korzystanie z pamięci wszystkich komputerów w klastrze.

Docker

Docker jest narzędziem, które pozwala umieścić i uruchomić aplikację w lekkim, przenośnym wirtualnym kontenerze. Zdecydowaną przewagą Docker’a nad wirtualizacją jest brak konieczności emulowania całej warstwy sprzętowej i systemu operacyjnego. Docker uruchamia w kontenerze tylko procesy aplikacji, co przenosi się na lepsze wykorzystania zasobów sprzętowych.

Wirtualizacja vs Kontener

Jakie zatem korzyści przynosi programistom Docker? Pozwala wykorzystywać gotowe obrazy systemów, aplikacji i baz danych, które zostały przygotowane i umieszczone w publicznym repozytorium. Możemy pobrać Redis, Nginx lub inny obraz z repozytorium lub przygotować własny obraz. Dostarczanie własnych aplikacji w postaci obrazów znacznie upraszcza proces wdrażania aplikacji. Bez względu na technologię wykorzystaną w aplikacji, obraz kontenera będzie dostarczany w identyczny sposób.

Docker działa tylko na jądrze Linux i pozwala uruchamiać aplikacje przeznaczone dla Linux’a. Dla użytkowników Windows i Mac przygotowano narzędzia, które pozwalają zainstalować Docker’a.

REST API z reaktywnymi mikrousługami

Na potrzeby publikacji stworzona została prosta aplikacja, która dostępna jest pod adresem. Aplikacja udostępnia dwa mikroserwisy realizujące określone cele biznesowe. ExpertService odpowiedzialny jest za obsługę specjalistów udostępniających usługi dla klientów. Natomiast ExpertServiceBooking stworzony został do zarządzania rezerwacjami usług wykonywanych przez specjalistów. Pozostałe dwa moduły odpowiedzialne są za wspólny model danych oraz konfigurację dostępu do bazy danych.

Asynchroniczna komunikacja

Redis oferuje asynchroniczny transfer danych między aplikacją korzystającą z wzorca publish/subscribe, który umożliwia jednej aplikacji publikowanie na kanale, a innej subskrypcję tego kanału i wykonywanie działań po odebraniu zdarzenia.

1. Publisher (kod)
2. Listener (kod)

Używanie Mavena do budowania obrazów Docker’a

Maven jest narzędziem do budowania projektów, dzięki użyciu wtyczki dockerfile-maven może być on także użyty do budowania obrazów Dockera. Pod tym linkiem znajduje się przykładowy Dockerfile, czyli dokument tekstowym, który zawiera wszystkie polecenia, aby ‘złożyć obraz. W celu stworzenia obrazu wystarczy wywołać komendę:

$ mvn clean install

Budowanie systemu w oparciu o Docker’a

Docker Compose to narzędzie do definiowania i uruchamiania aplikacji Docker z wieloma kontenerami. Wpisując poniższe komendy w głównym katalogu aplikacji zostaną przygotowane wszystkie obrazy:

$ docker-compose build

Następnie można użyć komendy, aby uruchomić wszystkie kontenery:

$ docker-compose up -d

Poszczególne aplikacje można przeskalować za pomocą następującego polecenia:

$ doker-compose up --scale <APP_NAME> = 2 -d

Podsumowanie

Zdaje sobie sprawę, że w powyższym tekście wiele tematów zostało zaledwie liźniętych. Wynika to głównie z liczby poruszonych technologii. Czytelników zainteresowanych zgłębieniem wiedzy, odsyłam oczywiście do dokumentacji Redis lub Docker’a. Głównym celem publikacji było pokazanie kompleksowego rozwiązania, które może stanowić bazę pod budowę aplikacji w oparciu o mikrousługi.

Zapraszamy do dyskusji
Nie ma więcej wpisów

Send this to a friend