Cześć!
Na wstępie chciałbym zaznaczyć, że jeśli nie przeczytałeś pierwszego wpisu na temat programowania reaktywnego, to kliknij tutaj aby przeczytać ten artykuł. Jest on niezbędny i zawiera niezbędne elementy do zrozumienia dzisiejszego artykułu.
Dzisiaj wspólnie omówimy sobie jedno z najpopularniejszych rozwiązań reaktywnych jeśli chodzi o język Java – czyli Spring WebFlux. Do dzieła!
Definicja
Spring WebFlux to w pełni reaktywny framework dodany do Springa 5.0. Pozwala na wykorzystanie nieblokujących strumieni reaktywnych, takich jak Netty czy Undertow.
Spring MVC a WebFlux
W rzeczywistości oba te artefakty ze sobą współpracują. Zarówno Spring MVC oraz WebFlux został zaprojektowany z myślą o ciągłości oraz spójności ze sobą. Mogą się ze sobą komunikować. Warto spojrzeć na poniższy diagram, który wyszczególnia powiązania oraz cechy wspólne:
Konfiguracja
Spring Boot zapewnia pełne wsparcie dla programowania reaktywnego. W celu konfiguracji WebFluxa, do istniejącego projektu wystarczy dodać odpowiednią zależność w pom.xml:
istnieje również możliwość dodania tej biblioteki na etapie tworzenia projektu w docelowym środowisku:
po wykonaniu tej akcji nasza aplikacja będzie gotowa do tego, by tworzyć w niej oprogramowanie reaktywne. Warto również zaznaczyć, że nasza aplikacja domyślnie uruchomi się w nieblokującym strumieniu reaktywnym Netty. Niemniej jednak istnieje możliwośc przełączyć to na klasycznego Tomcata, Jetty lub Undertow, zmieniając odpowiednie zależności w Maven lub Gradle. Spring Boot domyślnie korzysta z Netty, ponieważ jest szerzej używany w asynchronicznej przestrzeni oraz pozwala serwerowi na współdzielanie zasobów.
Tomcat oraz Jetty mogą być używane zarówno w artefakcie Spring MVC jak i WebFlux. Należy jednak pamiętać, ze ich sposób użycia się trochę różni. Spring MVC opiera sie na podejściu blokującym wejścia oraz wyjścia. Spring WebFlux opiera się na podejściu nieblokującym.
Flux oraz Mono – wyjaśnienie oraz różnice
Spring WebFlux oferuje w swoim pakiecie dwa podstawowe strumienie, które umożliwiają na asynchroniczną i nieblokującą pracę emitowania danych, które nazywamy Publisherami.
Flux
Flux reprezentuje strumień z elementami od 0 do N. Przykładowo:
public Flux<Car> findAll() { return Flux.just( new Car("Audi", "A5"), new Car("Audi", "A7") ).subscribe(); }
Oczywiście wykorzystując Fluxa, można również wykorzystywać różne ciekawe operacje funkcyjne, przykładowo:
public Flux<Car> findAll() { return Flux.just( new Car("Audi", "A5"), new Car("Audi", "A7"), new Car("BMW", "M5"), ).filter(car -> car.StartsWith("Audi")).subscribe(); }
Ważna w tym wszystkim jest metoda subscribe(). Nawiązując do pierwszego artykułu, gdyby nie subksrypcja, to nie zostałaby wykonana żadna akcja. W celu wyemitowania danych, po “drugiej stronie” musi znajdować się co najmniej jeden konsument usługi, czyli nasz Subscriber.
Mono
Mono reprezentuje strumień z 1 lub 0 elementami. Działa na tej samej zasadzie co Flux z różnicą, że do strumienia Mono możemy przekazać jedynie jeden lub zero elementów. Przykładowo:
public Mono<Car> findCurrentCar() { if (isAuthenticated()) return Mono.just(new Car("Audi", "A5")).subscribe(); else return Mono.empty(); }
No dobra, to po co to rozdzielać skoro Flux i Mono robią praktycznie to samo?
Odpowiedź jest bardzo prosta. W przypadku przesyłania Mono, możemy zasugerować odbiorcy, że może spodziewa się nie więcej niż jednego elementu – najczęściej jest to pojedynczy obiekt. W przypadku Fluxa możemy pozwolić sobie na zbiór elementów, na przykład tablicę.
Podsumowanie
Mam nadzieję, że SpringWebflux przedstawiłem w sposób jasny i przejrzysty i zamiast zniechęcać do korzystania, to wręcz przeciwnie – zachęciłem większość czytających ten post. Myslę, że najważniejsze co trzeba po prostu zapamiętać jest to, że Spring WebFlux to framework do budowania reaktywnych i niebolokujących aplikacji internetowych. Na etapie samej implementacji i tak pewnie jak każdy z nas skorzysta z oficjalnej dokumentacji Springa. Warto dodać, że drugą najpopularniejszą biblioteką programowania reaktywnego w Javie jest RxJava i również można skonfigurować ją razem z Springiem. Dajcie znać, czy wykorzystywaliście kiedyś Spring WebFlux i co o tym sądzicie 🙂
Pozdrawiam serdecznie,
biegajacyprogramista.pl
Źródła:
bykowski.pl
docs.spring.io