Spring WebFlux to w pełni reaktywne środowisko, które zostało wprowadzone w Spring 5.0. Pozwala ono na wykorzystywanie strumieni reaktywnych przy zastosowaniu nieblokujących kontenerów webowych takich jak Netty lub Undertow. W tym artykule przybliżę Ci podstawy działania Spring WebFlux i zrealizujemy przykład wykorzystując Spring Boot.
Dla pełnego zrozumienia treści musimy na początku wiedzieć na czym polega programowanie reaktywne, wiec jeśli temat jest dla Ciebie nowy to w pierwszej kolejności odsyłam Cię do artykułu Programowanie Reaktywne – czym jest i kiedy stosować?
Spring Boot i WebFlux
Spring Boot 2 dostarcza pełne wsparcie dla programowania reaktywnego. Warto wspomnieć, że WebFlux bazuje na Project Reactor – czyli bibliotece służącej do programowania reaktywnego w Java. WebFlux dostarcza jedynie wygodne interfejsy i obsługę, która pozwala na wykorzystanie możliwości Reactor’a w Springu.
Aby skonfigurować projekt wystarczy dodać zależność do – Spring Reactive Web.
Wówczas aplikacje staje się od razu gotowa do tworzenia stacku reaktywnego, a nasza aplikacja domyślnie uruchomi się na nieblokującym kontenerze aplikacji Netty:
[main] o.s.b.web.embedded.netty.NettyWebServer : Netty started on port(s): 8080
Apache Tomcat również oferuje możliwość tworzenia rozwiązań reaktywnych, jednak, to Netty, Undertow zostały od początku zaprojektowane z myślą o komunikacji nieblokującej i umożliwiają wydajne skalowanie.
Strumienie reaktywne w Spring WebFlux – Flux i Mono
Spring WebFlux dostarcza dwa strumienie, które umożliwiają na asynchroniczne i nieblokujące emitowanie danych nazywanych Publisher’ami.
Strumień Flux
Flux to strumień umożliwiający na przetwarzanie sekwencji od 0 do N elementów.
Flux<String> names = Flux.just("Joeann", "Trudie", "Brandie", "Sofie");
Wykorzystując programowanie funkcyjne możemy dokonać operacji na strumieniach, przykładowo filtrowanie:
Flux.just("Joeann", "Trudie", "Brandie", "Sofie", "Valaree", "Kennie", "Arabella", "Nisse", "Glory", "Robinett", "Elsie", "Kelbee", "Lianne", "Johan") .filter(name -> name.startsWith("J")) .subscribe();
Jak widzisz na końcu wykorzystałem metodę subscribe(). Umożliwia ona na wykonanie kodu, bez niej nie stałoby się absolutnie nic. Otóż domyślnie strumienie są zimne – nic nie produkują. Dlatego, aby możliwe było był wyemitowanie danych to musi być co najmniej jeden konsument usługi czyli Subscriber.
Strumień Mono
Jest analogicznym strumieniem do Flux’a jest Mono jednak pozwala na przechowywanie 0 lub 1 elementu.
Mono.just("Przemek");
Ponieważ na szkoleniach często jestem pytany – to po co jest Mono skoro to samo realizuje Flux? Od razu rozwiąże tą nurtującą zagadkę.
Flux trzeba traktować jako zbiór elementów – tak jak w Java mamy tablice. Natomiast Mono trzeba interpretować jako opakowanie na pojedynczy obiekt. Jest on wygodniejszy, bo od razu pokazujesz odbiorcy, że może spodziewać się najwyżej jednego elementu.
Spring WebFlux – przykład reaktywnego API
Jeśli temat Cię wciągnął to czas na praktykę – w materiale wideo pokazuje w jaki sposób zbudować Reaktywne API w połączeniu z reaktywną bazą danych:
Sam przykład przykład jest również dostępny na moim GitHubie.
Podsumowanie
Spring WebFlux przyjazny interfejs tworzenia rozwiązań reaktywnych z wykorzystaniem biblioteki Reactor. Oprócz Reactor programiści Java mają również do wykorzystania drugą najpopularniejszą bibliotekę programowania reaktywnego jąka jest RxJava i w Spring również można ją wykorzystać.
Należy pamiętać, że programowanie reaktywne jest korzystne tylko w określonych sytuacjach i jest rozwiązaniem, które podnosi złożoność kodu.
Jeśli interesuje Cię rozwinięcie tematu to zapraszam Cię na moje szkolenie dotyczące programowania reaktywnego, które odbędzie się w jeszcze w maju.
Daj znać czy programujesz reaktywne i czy chcesz więcej materiałów na ten temat 😉