Spring WebFlux – programowanie reaktywne

Spring WebFlux – programowanie reaktywne

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:

spring-mvc-and-webflux-venn
Spring MVC oraz Spring WebFlux. Źródło: docs.spring.io

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:

Źródło: własne.

istnieje również możliwość dodania tej biblioteki na etapie tworzenia projektu w docelowym środowisku:

Źródło: bykowski.pl

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

 

Dodaj komentarz

two × four =

Close Menu