Written by 16:29 Dobre praktyki

Spring Webflux i programowanie reaktywne

Spring Webflux – odpowiednik Spring MVC. Wprowadzony w Spring 5. Umożliwia pisanie aplikacji w stylu reaktywnym.

Jeśli przetwarzamy dużo danych i mamy wiele użytkowników, potrzebujemy przetwarzania asynchronicznego, ponieważ wtedy aplikacje będą szybsze i wydajniejsze.

W Javie korzystanie z asynchroniczności może być kłopotliwe, ponieważ może sprawić, że kod będzie trudny do czytania i utrzymywania.

Programowanie reaktywne to rozwiązuje.

Programowanie reaktywne polega na asynchronicznym, nieblokującym przetwarzaniu danych.

Operujemy na zdarzeniach.
Jest to programowanie z asynchronicznymi strumieniami danych, ponieważ gdy tylko dane stają się dostępne, wysyłane są do klienta. Część po części. Dlatego umożliwia to programistom pisanie kodu, który może szybko i asynchronicznie reagować na te zmiany stanu, przychodzące z serwera.

Strumienie mogą emitować trzy różne zdarzenia:

  • kolejna wartość
  • błąd
  • sygnał “zakończenia”

Zdarzenia są przechwytywane asynchronicznie, poprzez zdefiniowanie funkcji, która będzie wykonywana po wyemitowaniu zdarzenia w zależności od jego typu.
“Słuchanie” strumienia nazywa się subskrybowaniem, ponieważ definiowane przez nas funkcje tych 3 zdarzeń są obserwatorami. Strumień to obserwowany podmiot.

Publisher – odpowiada za publikowanie zebranych danych.

Subscriber – nasłuchuje czy Publisher wysyła dane i je odczytuje. Subscriber może też przekazać info do Publishera, że nie nadąża z przetwarzaniem. Może też przerwać wysyłanie.

Spring Webflux wykorzystuje Projekt Reactor (biblioteka do programowania reaktywnego). Najważniejsze elementy to Flux i Mono. DlategoWebflux opakowuje je w wygodne interfejsy. Pozwala na wykorzystanie ich w Springu.

Flux – pozwala na przetwarzanie sekwencji od zera do wielu elementów. Jest to Publisher. Mamy do dyspozycji dużo metod działających na zwykłych streamach i nie tylko. Można sprawdzić w dokumentacji: link

Mono – podobne do Flux, ponieważ zwraca uwagę, że może zostać zwrócone zero albo jeden element.

Spring Webflux i modele

Spring Webflux wspiera dwa modele:

  • funkcjonalny routing i handling – tutaj więcej – link
  • tworzenie komponentów reaktywnych przy pomocy adnotacji. W przykładzie poniżej.

Aby programować reaktywnie trzeba korzystać z reaktywnych narzędzi. Aby stworzyć aplikację reaktywną w Springu trzeba dodać zależność spring-boot-starter-webflux. Musimy też korzystać z reaktywnej bazy danych. Możemy użyć np. Reactive MongoDb.

Przykład z: link

Po jednej stronie serwer z reaktywną bazą.
Po drugiej stronie wywołanie endpointa z serwera, subscribe, pobieranie co minutę.

Definiujemy endpoint w stylu reaktywnym. Pobieramy jednego pracownika korzystając z reaktywnej bazy do Mono.

Endpoint. Wiele pracowników. Wykorzystujemy Flux.

Od Springa 5 WebClient jest nie blokującym klientem. Jest dostosowany do programowania reaktywnego. Tworzymy klienta.


Przy pomocy WebClienta wykonujemy zapytanie na wcześniej przygotowany endpoint na serwerze. Pobieramy jeden obiekt, dlatego Mono. Wywołujemy metodę subscribe. Umożliwia pobranie danych z serwera. Subscriber łączy się z Publisherem. Aby wyemitował dane musi być co najmniej jeden Subscriber.

Sygnatury metody subscribe

  • Metoda subscribe ma kilka rodzajów sygnatur. W pełnej sygnaturze przyjmuje, co ma wykonać, gdy:
  • przyjdzie kolejny element
  • wystąpi błąd
  • przetwarzanie zostanie zakończone

Tutaj to samo. Pobieramy całą listę pracowników. Flux.


Programowanie reaktywne podnosi złożoność kodu. Używa się tylko w określonych sytuacjach.

Tutaj video z wykorzystaniem Webfluxa: link

Źródła:

https://www.baeldung.com/spring-webflux
https://bykowski.pl/spring-webflux-programowanie-reaktywne-w-spring/

Tagi: Last modified: 15 stycznia 2022
Close

PRAKTYCZNE WSKAZÓWKI Z PROGRAMOWANIA W JAVIE W PIGUŁCE

Dołącz do 1000+ programistów Java, czytających praktyczne maile o dobrych praktykach programowania, architekturze mikroserwisowej i gorących newsach (1 raz w tygodniu)

Praktyczna Java

Swój Pakiet Powitalny Wypchany Mięsem Dostaniesz Już Za 15 Minut.

Uzupełnienie powyższego pola stanowi zgodę na otrzymywanie od Kamila Michno newslettera zawierającego treści informacyjnych, marketingowych dotyczących portalu praktycznajava.pl. Zgodę można wycofać w każdym czasie. Wycofanie zgody nie ma wpływu na zgodność z prawem przetwarzania dokonanego przed jej wycofaniem.