Going Reactive with Spring 5jug.mk/presentations/javaskop18/reactive.pdf · Spring Framework 5...
Transcript of Going Reactive with Spring 5jug.mk/presentations/javaskop18/reactive.pdf · Spring Framework 5...
![Page 1: Going Reactive with Spring 5jug.mk/presentations/javaskop18/reactive.pdf · Spring Framework 5 Another major release, became GA in September 2017 A lots of improvements and new concepts](https://reader036.fdocuments.in/reader036/viewer/2022081521/5ec5f103d2b31741e6002cc1/html5/thumbnails/1.jpg)
Going Reactive with Spring 5
JavaSkop’18
![Page 2: Going Reactive with Spring 5jug.mk/presentations/javaskop18/reactive.pdf · Spring Framework 5 Another major release, became GA in September 2017 A lots of improvements and new concepts](https://reader036.fdocuments.in/reader036/viewer/2022081521/5ec5f103d2b31741e6002cc1/html5/thumbnails/2.jpg)
Who am I?
Java Technical Lead at Seavus
17 years in the industry
Spring Certified Professional
You can find me at:● [email protected]● @drazenis● programminghints.com
![Page 3: Going Reactive with Spring 5jug.mk/presentations/javaskop18/reactive.pdf · Spring Framework 5 Another major release, became GA in September 2017 A lots of improvements and new concepts](https://reader036.fdocuments.in/reader036/viewer/2022081521/5ec5f103d2b31741e6002cc1/html5/thumbnails/3.jpg)
Changing Requirements (then and now)
10 years ago Now
Server nodes 10’s 1000’s
Response times seconds milliseconds
Maintenance downtimes hours none
Data volume GBs TBs → PBs
![Page 4: Going Reactive with Spring 5jug.mk/presentations/javaskop18/reactive.pdf · Spring Framework 5 Another major release, became GA in September 2017 A lots of improvements and new concepts](https://reader036.fdocuments.in/reader036/viewer/2022081521/5ec5f103d2b31741e6002cc1/html5/thumbnails/4.jpg)
Solution?
EASY: Just spin up more threads!
![Page 5: Going Reactive with Spring 5jug.mk/presentations/javaskop18/reactive.pdf · Spring Framework 5 Another major release, became GA in September 2017 A lots of improvements and new concepts](https://reader036.fdocuments.in/reader036/viewer/2022081521/5ec5f103d2b31741e6002cc1/html5/thumbnails/5.jpg)
Reactive Programming
Event-driven systems
Moves imperative logic to:● asynchronous● non-blocking● functional-style code
Allows stable, scalable access to external systems
Example use-cases:
Monitoring stock pricesStreaming videosSpreadsheetsFraud detection
![Page 6: Going Reactive with Spring 5jug.mk/presentations/javaskop18/reactive.pdf · Spring Framework 5 Another major release, became GA in September 2017 A lots of improvements and new concepts](https://reader036.fdocuments.in/reader036/viewer/2022081521/5ec5f103d2b31741e6002cc1/html5/thumbnails/6.jpg)
When to Use Reactive?
● Handling networking issues, like latency or failures● Scalability concerns● Clients getting overwhelmed by the sent messages
(handling backpressure)● Highly concurrent operations
![Page 8: Going Reactive with Spring 5jug.mk/presentations/javaskop18/reactive.pdf · Spring Framework 5 Another major release, became GA in September 2017 A lots of improvements and new concepts](https://reader036.fdocuments.in/reader036/viewer/2022081521/5ec5f103d2b31741e6002cc1/html5/thumbnails/8.jpg)
Reactive Streams Specificationpublic interface Publisher<T> { public void subscribe(Subscriber<? super T> s);}
public interface Subscriber<T> { public void onSubscribe(Subscription s); public void onNext(T t); public void onError(Throwable t); public void onComplete();}
public interface Subscription { public void request(long n); public void cancel();}
public interface Processor<T, R> extends Subscriber<T>, Publisher<R> {}
![Page 9: Going Reactive with Spring 5jug.mk/presentations/javaskop18/reactive.pdf · Spring Framework 5 Another major release, became GA in September 2017 A lots of improvements and new concepts](https://reader036.fdocuments.in/reader036/viewer/2022081521/5ec5f103d2b31741e6002cc1/html5/thumbnails/9.jpg)
How it works?Reactive Streams Implementations for Java:
RxJava
Project Reactor
Akka Streams
Ratpack
Vert.x 3
![Page 10: Going Reactive with Spring 5jug.mk/presentations/javaskop18/reactive.pdf · Spring Framework 5 Another major release, became GA in September 2017 A lots of improvements and new concepts](https://reader036.fdocuments.in/reader036/viewer/2022081521/5ec5f103d2b31741e6002cc1/html5/thumbnails/10.jpg)
Spring Framework 5Another major release, became GA in September 2017
A lots of improvements and new concepts introduced:● Support for JDK 9● Support Java EE 8 API (e.g. Servlet 4.0)● Integration with Project Reactor 3.1● JUnit 5● Comprehensive support for Kotlin language● Dedicated reactive web framework - Spring WebFlux
![Page 11: Going Reactive with Spring 5jug.mk/presentations/javaskop18/reactive.pdf · Spring Framework 5 Another major release, became GA in September 2017 A lots of improvements and new concepts](https://reader036.fdocuments.in/reader036/viewer/2022081521/5ec5f103d2b31741e6002cc1/html5/thumbnails/11.jpg)
Project Reactor: Mono<T>
Publisher which emits 0 or 1 element (successfully or with an error)
![Page 12: Going Reactive with Spring 5jug.mk/presentations/javaskop18/reactive.pdf · Spring Framework 5 Another major release, became GA in September 2017 A lots of improvements and new concepts](https://reader036.fdocuments.in/reader036/viewer/2022081521/5ec5f103d2b31741e6002cc1/html5/thumbnails/12.jpg)
Project Reactor: Flux<T>
Publisher which emits 0 to N elements (successfully or with an error)
![Page 13: Going Reactive with Spring 5jug.mk/presentations/javaskop18/reactive.pdf · Spring Framework 5 Another major release, became GA in September 2017 A lots of improvements and new concepts](https://reader036.fdocuments.in/reader036/viewer/2022081521/5ec5f103d2b31741e6002cc1/html5/thumbnails/13.jpg)
Various Reactor Operators
![Page 14: Going Reactive with Spring 5jug.mk/presentations/javaskop18/reactive.pdf · Spring Framework 5 Another major release, became GA in September 2017 A lots of improvements and new concepts](https://reader036.fdocuments.in/reader036/viewer/2022081521/5ec5f103d2b31741e6002cc1/html5/thumbnails/14.jpg)
Various Reactor Operators
![Page 15: Going Reactive with Spring 5jug.mk/presentations/javaskop18/reactive.pdf · Spring Framework 5 Another major release, became GA in September 2017 A lots of improvements and new concepts](https://reader036.fdocuments.in/reader036/viewer/2022081521/5ec5f103d2b31741e6002cc1/html5/thumbnails/15.jpg)
Various Reactor Operators
![Page 16: Going Reactive with Spring 5jug.mk/presentations/javaskop18/reactive.pdf · Spring Framework 5 Another major release, became GA in September 2017 A lots of improvements and new concepts](https://reader036.fdocuments.in/reader036/viewer/2022081521/5ec5f103d2b31741e6002cc1/html5/thumbnails/16.jpg)
Reactor Pipeline
● Lazy evaluated● Nothing is produced until there is a subscriber
userService.getFavorites(userId) .timeout(Duration.ofMillis(800)) .onErrorResume(cacheService.cachedFavoritesFor(userId)) .flatMap(favoriteService::getDetails) .switchIfEmpty(suggestionService.getSuggestions()) .take(5) .publishOn(UiUtils.uiThreadScheduler())
.subscribe(uiList::show, UiUtils::errorPopup);
![Page 17: Going Reactive with Spring 5jug.mk/presentations/javaskop18/reactive.pdf · Spring Framework 5 Another major release, became GA in September 2017 A lots of improvements and new concepts](https://reader036.fdocuments.in/reader036/viewer/2022081521/5ec5f103d2b31741e6002cc1/html5/thumbnails/17.jpg)
Spring 5 Reactive Web
![Page 18: Going Reactive with Spring 5jug.mk/presentations/javaskop18/reactive.pdf · Spring Framework 5 Another major release, became GA in September 2017 A lots of improvements and new concepts](https://reader036.fdocuments.in/reader036/viewer/2022081521/5ec5f103d2b31741e6002cc1/html5/thumbnails/18.jpg)
Annotation-based Programming Model@RestControllerpublic class PersonController {
private final PersonRepository repository;public PersonController(PersonRepository repository) {
this.repository = repository;}
@GetMapping("/person")Flux<Person> list() {
return this.repository.findAll();}
@GetMapping("/person/{id}")Mono<Person> findById(@PathVariable String id) {
return this.repository.findOne(id);}
}
![Page 19: Going Reactive with Spring 5jug.mk/presentations/javaskop18/reactive.pdf · Spring Framework 5 Another major release, became GA in September 2017 A lots of improvements and new concepts](https://reader036.fdocuments.in/reader036/viewer/2022081521/5ec5f103d2b31741e6002cc1/html5/thumbnails/19.jpg)
Functional Programming Model - Handler public class PersonHandler { ... public Mono<ServerResponse> listPeople(ServerRequest request) { Flux<Person> people = repository.allPeople(); return ServerResponse.ok().contentType(APPLICATION_JSON).body(people, Person.class); }
public Mono<ServerResponse> createPerson(ServerRequest request) { Mono<Person> person = request.bodyToMono(Person.class); return ServerResponse.ok().build(repository.savePerson(person)); }
public Mono<ServerResponse> getPerson(ServerRequest request) { int personId = Integer.valueOf(request.pathVariable("id")); Mono<ServerResponse> notFound = ServerResponse.notFound().build(); Mono<Person> personMono = this.repository.getPerson(personId); return personMono .then(person -> ServerResponse.ok().contentType(APPLICATION_JSON).body(fromObject(person))) .otherwiseIfEmpty(notFound); } }
![Page 20: Going Reactive with Spring 5jug.mk/presentations/javaskop18/reactive.pdf · Spring Framework 5 Another major release, became GA in September 2017 A lots of improvements and new concepts](https://reader036.fdocuments.in/reader036/viewer/2022081521/5ec5f103d2b31741e6002cc1/html5/thumbnails/20.jpg)
Functional Programming Model - RouterPersonRepository repository = ...PersonHandler handler = new PersonHandler(repository);
RouterFunction<ServerResponse> personRoute = route(GET("/person/{id}").and(accept(APPLICATION_JSON)), handler::getPerson) .andRoute(GET("/person").and(accept(APPLICATION_JSON)), handler::listPeople) .andRoute(POST("/person").and(contentType(APPLICATION_JSON)), handler::createPerson);
// Run in Reactor NettyHttpHandler httpHandler = RouterFunctions.toHttpHandler(route);ReactorHttpHandlerAdapter adapter = new ReactorHttpHandlerAdapter(httpHandler);HttpServer server = HttpServer.create(HOST, PORT);server.newHandler(adapter).block();
// Run in TomcatHttpHandler httpHandler = RouterFunctions.toHttpHandler(route);HttpServlet servlet = new ServletHttpHandlerAdapter(httpHandler);Tomcat server = new Tomcat();Context rootContext = server.addContext("", System.getProperty("java.io.tmpdir"));Tomcat.addServlet(rootContext, "servlet", servlet);rootContext.addServletMapping("/", "servlet");tomcatServer.start();
![Page 21: Going Reactive with Spring 5jug.mk/presentations/javaskop18/reactive.pdf · Spring Framework 5 Another major release, became GA in September 2017 A lots of improvements and new concepts](https://reader036.fdocuments.in/reader036/viewer/2022081521/5ec5f103d2b31741e6002cc1/html5/thumbnails/21.jpg)
Functional Reactive Client
WebClient client = WebClient.create("http://example.com");
Mono<Account> account = client.get() .url("/accounts/{id}", 1L) .accept(APPLICATION_JSON) .exchange(request) .then(response -> response.bodyToMono(Account.class));
![Page 22: Going Reactive with Spring 5jug.mk/presentations/javaskop18/reactive.pdf · Spring Framework 5 Another major release, became GA in September 2017 A lots of improvements and new concepts](https://reader036.fdocuments.in/reader036/viewer/2022081521/5ec5f103d2b31741e6002cc1/html5/thumbnails/22.jpg)
Functional Reactive WebSocket Client
WebSocketClient webSocketClient = new ReactorNettyWebSocketClient();webSocketClient.execute(new URI("wss://echo.websocket.org"), session -> session.send(input.map(session::textMessage)) .thenMany(session .receive() .map(WebSocketMessage::getPayloadAsText) .log()) .then())
![Page 23: Going Reactive with Spring 5jug.mk/presentations/javaskop18/reactive.pdf · Spring Framework 5 Another major release, became GA in September 2017 A lots of improvements and new concepts](https://reader036.fdocuments.in/reader036/viewer/2022081521/5ec5f103d2b31741e6002cc1/html5/thumbnails/23.jpg)
Spring Data Reactive
public interface BookRepository extends ReactiveCrudRepository<Book, String> {
Flux<Book> findByAuthor(String author);}
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb-reactive</artifactId></dependency>
![Page 24: Going Reactive with Spring 5jug.mk/presentations/javaskop18/reactive.pdf · Spring Framework 5 Another major release, became GA in September 2017 A lots of improvements and new concepts](https://reader036.fdocuments.in/reader036/viewer/2022081521/5ec5f103d2b31741e6002cc1/html5/thumbnails/24.jpg)
WebFlux Spring Security@EnableWebFluxSecuritypublic class HelloWebfluxSecurityConfig {
@Beanpublic MapReactiveUserDetailsService userDetailsService() {
UserDetails user = User.withDefaultPasswordEncoder().username("user").password("user").roles("USER").build();
return new MapReactiveUserDetailsService(user);}
}
![Page 25: Going Reactive with Spring 5jug.mk/presentations/javaskop18/reactive.pdf · Spring Framework 5 Another major release, became GA in September 2017 A lots of improvements and new concepts](https://reader036.fdocuments.in/reader036/viewer/2022081521/5ec5f103d2b31741e6002cc1/html5/thumbnails/25.jpg)
Reactive Method Security @EnableWebFluxSecurity@EnableReactiveMethodSecuritypublic class SecurityConfig { @Bean public MapReactiveUserDetailsService userDetailsService() {...}}
@Componentpublic class HelloWorldMessageService { @PreAuthorize("hasRole('ADMIN')") public Mono<String> findMessage() { return Mono.just("Hello World!"); }}
![Page 26: Going Reactive with Spring 5jug.mk/presentations/javaskop18/reactive.pdf · Spring Framework 5 Another major release, became GA in September 2017 A lots of improvements and new concepts](https://reader036.fdocuments.in/reader036/viewer/2022081521/5ec5f103d2b31741e6002cc1/html5/thumbnails/26.jpg)
DEMO
https://github.com/drazen-nikolic/reactive-spring-5-demo
![Page 27: Going Reactive with Spring 5jug.mk/presentations/javaskop18/reactive.pdf · Spring Framework 5 Another major release, became GA in September 2017 A lots of improvements and new concepts](https://reader036.fdocuments.in/reader036/viewer/2022081521/5ec5f103d2b31741e6002cc1/html5/thumbnails/27.jpg)
Questions?
![Page 28: Going Reactive with Spring 5jug.mk/presentations/javaskop18/reactive.pdf · Spring Framework 5 Another major release, became GA in September 2017 A lots of improvements and new concepts](https://reader036.fdocuments.in/reader036/viewer/2022081521/5ec5f103d2b31741e6002cc1/html5/thumbnails/28.jpg)
References & AttributionsReactive Streams Specification for the JVM
Reactive Spring - Josh Long, Mark Heckler
Reactive Programming by Venkat Subramaniam
What is Reactive Programming by Martin Oderski
Reactive Streams: Handling Data-Flow the Reactive Way by Roland Kuhn
What Are Reactive Streams in Java? by John Thompson
Spring Boot Reactive Tutorial by Mohit Sinha
Doing Reactive Programming with Spring 5 by Eugen Paraschiv
![Page 29: Going Reactive with Spring 5jug.mk/presentations/javaskop18/reactive.pdf · Spring Framework 5 Another major release, became GA in September 2017 A lots of improvements and new concepts](https://reader036.fdocuments.in/reader036/viewer/2022081521/5ec5f103d2b31741e6002cc1/html5/thumbnails/29.jpg)
Be proactive, go Reactive!Spring will help you on this journey!
Thank you
Where applicable...