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

Going Reactive with Spring Data (JavaDay UA 2017)

Going Reactive with Spring Data (JavaDay UA 2017)

Introduction to reactive streams, project Reactor and Spring 5 for building end to end reactive applications.

Christoph Strobl

November 04, 2017
Tweet

More Decks by Christoph Strobl

Other Decks in Programming

Transcript

  1. Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a

    Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
    Going with Data.
    Christoph Strobl

    Pivotal Software Inc.

    @stroblchristoph

    View Slide

  2. Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a

    Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
    In a nutshell, reactive programming is about

    non-blocking, event-driven applications

    that scale with a small number of threads

    with back pressure as a key ingredient

    that aims to ensure producers to not overwhelm consumers.
    (Rossen Stoyanchev)

    View Slide

  3. The next 60 Minutes
    Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a

    Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
    - A bit of recent history.
    - Project Reactor / Spring Data Kay / Spring Framework 5.
    - Some Code.

    View Slide

  4. Sept 28
    5.0 GA
    Oct 2nd
    Kay GA
    Sept 25
    3.1 GA
    Sept 21
    9
    Nov 4th
    A bit of recent history.
    Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a

    Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
    2.0 GA
    5.0 M1
    Jul 2016
    Kay M1
    Sept 2016
    Nov 2016
    3.0 GA
    Sept 2015

    View Slide

  5. Imperative Applications
    Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a

    Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/

    View Slide

  6. Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a

    Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
    @RestController

    static class PersonController {


    PersonRepository repository;







    }
    @GetMapping("/")

    List listPersons(String name) {

    return repository.findAllByName(name);

    }


    View Slide

  7. Total Control
    Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a

    Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
    {…}

    View Slide

  8. Batching
    Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a

    Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
    {…}

    View Slide

  9. Async
    Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a

    Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
    {…}
    Dispatcher
    Thread: Worker A
    Thread: Worker B
    Thread: Worker C

    View Slide

  10. Reactive
    Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a

    Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
    {…}
    Subscriber Publisher
    Stream

    View Slide

  11. Iterator.next()
    Future.get()
    Subscriber.onNext(t)
    Remember
    Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a

    Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
    vs

    View Slide

  12. Reactor 3.1
    Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a

    Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/

    View Slide

  13. Reactive Streams
    Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a

    Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
    Provider of a potentially unbounded number of sequenced elements.
    Publisher
    Subscriber
    A processing stage - actually both a Subscriber and a Publisher.
    Processor
    One-to-one lifecycle of a Subscriber subscribing to a Publisher.
    Subscription

    View Slide

  14. Flux findAllByLastname(String lastname)
    Mono findByEmail(String email)
    Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a

    Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
    Mono (0…1)
    Flux (0…n)
    #jürgenized

    View Slide

  15. Reactive Applications with Spring
    Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a

    Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
    Spring Framework

    5
    Project Reactor

    3.1
    Spring Data

    Kay

    View Slide

  16. Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a

    Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
    Apply familiar concepts

    to an new way of expressing functionality.

    With minimal fluff and surprise!

    View Slide

  17. Spring WebFlux
    Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a

    Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
    @RestController

    static class PersonController {


    PersonRepository repository;







    }
    @GetMapping("/")

    Flux fluxPersons(String name) {

    return repository.findAllByName(name);

    }


    View Slide

  18. Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a

    Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/

    View Slide

  19. Spring WebFlux
    Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a

    Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
    @RestController

    static class PersonController {


    PersonRepository repository;







    }
    @GetMapping("/")

    Flux fluxPersons(String name) {

    return repository.findAllByName(name);

    }


    View Slide

  20. Spring Data Reactive
    Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a

    Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
    interface Repo extends ReactiveCrudRepository {
    }
    Flux findAllByLastname(String lastname);
    Flux findAllByLastname(Mono lastname);
    Flux customQuery(String lastname);
    @Query("{lastname : ?0}");
    Flux findAllByLastname(String ln, Pageable page);

    View Slide

  21. Reactive Repository
    Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a

    Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
    Mono save(S entity);
    Mono save(Mono entity);
    Flux saveAll(Iterable entities);
    Flux saveAll(Publisher entities);
    Mono existsById(Mono id);
    Flux findAll();
    Mono count();
    Mono deleteById(ID id);

    View Slide

  22. Reactive Template (MongoDB)
    Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a

    Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
    /**

    * Query for a {@link Flux} of objects of type T from the specified collection.

    *

    * @param entityClass the parametrized type of the returned {@link Flux}.

    * @param collectionName name of the collection to retrieve the objects from

    * @return the converted collection

    */

    Flux findAll(Class entityClass, String collectionName);
    /**

    * Map the results of an ad-hoc query on the collection for the entity class to a 

    * single instance of an object of the

    * specified type.
    *

    * @param query the query class that specifies the criteria 

    * @param entityClass the parametrized type of the returned {@link Mono}.

    * @return the converted object

    */

    Mono findOne(Query query, Class entityClass);

    View Slide

  23. Reactive Streams MongoDB Java Driver
    Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a

    Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
    /**
    * Counts the number of documents in the collection according to the given options.
    *
    * @param filter the query filter
    * @return a publisher with a single element indicating the number of documents
    */
    Publisher count(Bson filter);
    /**
    * Finds all documents in the collection.
    *
    * @param filter the query filter
    * @return the fluent find interface
    */
    FindPublisher find(Bson filter);

    View Slide

  24. Publisher
    Subscriber
    Processor
    Subscription
    .subscribe(Subscriber)
    .onSubscribe(Subscription)
    .request(long)
    .onNext(T)
    Reactive Streams
    Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a

    Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
    1
    2
    3
    4
    5

    View Slide

  25. Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a

    Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
    It’s Demo Time
    https://github.com/christophstrobl/going-reactive-with-spring-data

    View Slide

  26. Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a

    Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
    Reactive is about efficient resource usage.
    Even if backed with familiar concepts and framework support, 

    it is no free lunch.
    The price is complexity.

    View Slide

  27. Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a

    Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
    More Spring / Reactive at
    15:00 Spring Boot 2.0 Web Applications (Stéphane Nicoll)
    16:10 The API Gateway is dead! Long live the API Gateway! (Spencer Gibb)
    17:30 Reactive Mythbusters With Reactor (Simon Basle)
    18:40 Refactor to Reactive with Spring 5 and Project Reactor (Oleh Dokuka)
    12:30 Spring Cloud Stream - a new rick and Morty adventure (Dieter Hubau)
    12:30 Advanced Client Load Balancing with Spring Cloud (Alejsandr Tarasov)
    13:50 A Day in a Life of a Traveling Open Source Developer (Spencer Gibb)
    14:30 Boot yourself, Spring is coming (Evgeniy Borisov, Kirill Tolkachev)
    17:00 Data Microservices with Spring Cloud (Orkhan Gasimov)
    Today
    Tomorrow

    View Slide

  28. Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a

    Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
    Spring Framework

    5
    Project Reactor

    3.1
    Spring Data

    Kay
    Questions ?

    View Slide