Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Reactive Spring 5

Reactive Spring 5

Reactive Programming with Spring WebFlux and Spring Data in Spring 5.

Corneil du Plessis

July 13, 2018
Tweet

More Decks by Corneil du Plessis

Other Decks in Programming

Transcript

  1. A defnition reactive programming is an asynchronous programming paradigm concerned

    with data streams and the propagation of change Wikipedia
  2. Reactive Programming Models • Windows API • JVM Based •

    NIO • LMAX Disruptor • Akka Actor Model • JavaScript • AJAX • Promises • jQuery • Angular • React • FRP – Functional Reactive Programming • map, reduce, flter • Languages not limited to: • Scala • Kotlin • Haskell • Elm • Groovy • JavaScript • Java 8
  3. Road to Reactive Spring • RxJava – 2011-2012 by Netfix

    • Project Reactor – 2013 by Pivotal • Reactive Streams Specifcation – 2014 collaboration by Netfix, Pivotal, Red Hat, Twitter, Typesafe and more. • reactor-spring • Spring 5
  4. Implementing Technologies HttpHander / WebHander API • Netty • Undertow

    • Tomcat with Servlet 3.1 • Jetty with Servlet 3.1 Reactive Databases • MongoDB Reactive Streams Driver • Reactive Cassandra (RxJava) • Lettuce (Reactive Streams for Redis) • Reactive Couchbase.
  5. Project Reactor • Implements Reactive Streams specifcation • Infuenced by

    RxJava • Infuenced by Java 8 Streams • Improved Developer Experience • Mono<T> - 0 or One • Flux<T> - 0 or More
  6. Project Reactor - Mono static <T> Mono<T> just(T data); static

    <T> Mono<T> fromFuture( CompleteableFuture<? extends T>); Mono<T> log(String category); T block(); T block(Duration timeout); map, flatMap, filter
  7. Project Reactor - Flux static <T> Flux<T> just(T data); static

    <T> Flux<T> just(T … data); static <T> Flux<T> fromStream(Stream<T> s); static <T> Flux<T> fromIterable<Iterable<T> i); Flux<T> log(String category); static <T> Mono<List<T>> collectList(); Mono<T> next(); Iterable<T> toIterable(); Stream<T> toStream(); map, flatMap, filter, reduce
  8. Reactive Spring WebFlux • Annotated Controllers • @Controller or @RestController

    • @RequestMapping / @GetMapping / @PostMapping etc. • Flux instead of Collection • Functional Endpoints • Router Function • Handler Function • HandlerFilter Function
  9. Spring MVC @RestController public class HistoryController { private HistoryInterface locHist;

    public HistoryController(HistoryInterface locHist) { this. locHist = locHist; } @GetMapping(path = "/search") public Collection<LocationHistory> find( @RequestParam("startDate") Date startDate, @RequestParam("endDate") Date endDate) { return locHist.find(startDate, endDate); } }
  10. Reactive Spring WebFlux @RestController public class HistoryController { private HistoryInterface

    locHist; public HistoryController(HistoryInterface locHist) { this. locHist = locHist; } @GetMapping(path = "/search") public Flux<LocationHistory> find( @RequestParam("startDate") Date startDate, @RequestParam("endDate") Date endDate) { return locHist.find(startDate, endDate); } }
  11. Reactive Spring WebFlux (Functional Endpoint) public class HistoryHandler { private

    HistoryInterface locHist; public History HistoryHandler( HistoryInterface locHist) { this. locHist = locHist; } public Mono<ServerResponse> find(ServerRequest request) { Date startDate = DateUtils.from(request.queryParam("startDate")); Date endDate = DateUtils.from(request.queryParam("endDate")); return ServerResponse.ok() .contentType(APPLICATION_JSON) .body(locHist.find(startDate, endDate), LocationHistory.class); } }
  12. Reactive Spring WebFlux (Functional Endpoint) @Configuration @EnableWebFlux public class HistoryConfiguration

    { @Autowire private HistoryHandler histHandler; @Bean RouterFunction<ServerResponse> router() { return route(GET("/search") .and(accept(APPLICATION_JSON)), histHandler::find); } }
  13. Spring Data JPA • Spring Data JPA does not have

    Reactive Support. • Streams will provide best experience until reactive JDBC and JPA is available. // Repository method Stream<LocationHistory> findByDateBetween( Date startDate, Date endDate); // Service method return Flux.fromStream(repository.findByDateBetween(s,e));
  14. Demo Non-reactive • Spring Boot 1.5.8 • Spring MVC •

    Spring Data MongoDB Reactive • Spring Boot 2.0.3 • Spring WebFlux • Spring Data Reactive MongoDB
  15. Call timing Non-reactive • 0.000 >> controller • 0.000 >>

    service • 0.409 << service • 0.409 << controller Reactive • 0.000 >> controller • 0.000 >> service • 0.001 << service • 0.001 << controller
  16. Network timing Non-reactive Type Time Name lookup 0.004 Connect 0.005

    Pre transfer 0.005 Start Transfer 0.419 Total 0.532 Reactive Type Time Name lookup 0.004 Connect 0.005 Pre transfer 0.005 Start Transfer 0.385 Total 0.425
  17. More aspects of Reactive Programming • Error handling • Back

    pressure • Retry • Timeouts • Transactions
  18. Thoughts on Reactive Spring • Pros • Great documentation •

    Preserves program structure • Safer concurrency • Simpler abstraction than RxJava without sacrifcing the power. • Facilitates good practice • Kotlin support in Core • Cons • Debugging complexity • Could not fnd any other negative comments
  19. See Also • ReactiveX • Languages • RxJava • RxKotlin

    • RxGroovy • RxClojure • RxSwift • Rx.Net (C#) and more… • Platforms • RxAndroid • RxCocoa • RxNetty • Akka & Akka Streams • Ratpack • Vert.x • Play Framework • Languages • Reactor Scala Extensions • Reactor Kotlin Extensions (now in core) • Messaging Communication • Reactor Kafka • Reactor RabbitMQ • Reactor Aeron • Reactor Netty
  20. Finally • Contact: @corneil • Source - https://github.com/corneil/reactive-spring-5 • Resources

    • Project Reactor Site - https://projectreactor.io/ • David Karnok's Blog - http://akarnokd.blogspot.co.za/ • WebFlux vs Servlet https://dzone.com/articles/raw-performance-numbers-spring-boot-2-webfux-vs-s Questions?