reactive programming in spring 5

52
Reactive Programming in Spring 5 Arjen Poutsma Pivotal

Upload: poutsma

Post on 06-Jan-2017

2.958 views

Category:

Software


8 download

TRANSCRIPT

Page 1: Reactive Programming in Spring 5

Reactive Programming in Spring 5

Arjen PoutsmaPivotal

Page 2: Reactive Programming in Spring 5

About Arjen

• Twenty years of experience in Enterprise Software Development

• Joined SpringSource in 2005

• Development lead of Spring Web Services, Spring REST support, Spring Scala

• Working on Spring 5

Page 3: Reactive Programming in Spring 5

Agenda

• Reactive Systems

• Reactive Streams

• RxJava

• Reactor

• Reactive Programming in Spring 5

Page 4: Reactive Programming in Spring 5

Reactive Systems

Page 5: Reactive Programming in Spring 5

Reactive Manifesto

Responsive

Message Driven

ResilientElastic

Page 6: Reactive Programming in Spring 5

Reactive Manifesto• Responsive

• Rapid

• Consistent

• Resilient

• Replication

• Isolation

• Elastic

• Scaling

• No bottlenecks

• Message Driven

• Async

• Back-pressure

Page 7: Reactive Programming in Spring 5

Reactive Streams

Page 8: Reactive Programming in Spring 5

Reactive Streams Spec

• Focus on Interoperability

• No operators

• Wide support

• Akka, Vert.x, RxJava, Ratpack

• JDK 9 Flow in java.util.concurrent

Page 9: Reactive Programming in Spring 5

Publisher Subscriber

Page 10: Reactive Programming in Spring 5

Publisher Subscribersubscribe

Page 11: Reactive Programming in Spring 5

Publisher Subscriber

Page 12: Reactive Programming in Spring 5

Publisher Subscriber

Page 13: Reactive Programming in Spring 5

Publisher Subscriber

onSubscribe

Subscription

Page 14: Reactive Programming in Spring 5

Publisher Subscriber

Subscription

Page 15: Reactive Programming in Spring 5

Subscription

Publisher Subscriber

Page 16: Reactive Programming in Spring 5

Subscription

Publisher Subscriber

request

2

Page 17: Reactive Programming in Spring 5

Subscription

Publisher Subscriber

2

Page 18: Reactive Programming in Spring 5

Subscription

Publisher Subscriber

2

Page 19: Reactive Programming in Spring 5

Subscription

Publisher Subscriber

onNext

1

Page 20: Reactive Programming in Spring 5

Subscription

Publisher Subscriber

1

Page 21: Reactive Programming in Spring 5

Subscription

Publisher Subscriber

onNext

0

Page 22: Reactive Programming in Spring 5

Subscription

Publisher Subscriber

0

Page 23: Reactive Programming in Spring 5

Subscription

Publisher Subscriber

request

5

Page 24: Reactive Programming in Spring 5

Subscription

Publisher Subscriber

5

Page 25: Reactive Programming in Spring 5

Subscription

Publisher Subscriber

5

Page 26: Reactive Programming in Spring 5

Subscription

Publisher Subscriber

onNext

4

Page 27: Reactive Programming in Spring 5

Subscription

Publisher Subscriber

4

Page 28: Reactive Programming in Spring 5

Subscription

Publisher Subscriber

onNext

3

Page 29: Reactive Programming in Spring 5

Subscription

Publisher Subscriber

3

Page 30: Reactive Programming in Spring 5

Subscription

Publisher Subscriber

onNext

2

Page 31: Reactive Programming in Spring 5

Subscription

Publisher Subscriber

2

Page 32: Reactive Programming in Spring 5

Subscription

Publisher Subscriber

onComplete

2

Page 33: Reactive Programming in Spring 5

Publisher Subscribersubscribe

onSubscribeSubscription

request

onNext

onComplete

onError

Page 34: Reactive Programming in Spring 5

Hot & Cold

Cold Hot

Passive Active

Publish when subscribed

Publish regardless

Queue Mouse Movement

Page 35: Reactive Programming in Spring 5

Operators

• map, flatMap, take, subscribe, …

• No Operators in Reactive Streams

• Left to implementations

Page 36: Reactive Programming in Spring 5

Reactor

Page 37: Reactive Programming in Spring 5

Project Reactor

• Stream extends Publisher

• Wrap Publisher

Page 38: Reactive Programming in Spring 5

Reactor

Streams.just('a' 'b' 'c') .take(2) .map(Character::toUpperCase) .consume(System.out::println);

Page 39: Reactive Programming in Spring 5

RxJava

Page 40: Reactive Programming in Spring 5

RxJava

• Based On Reactive Extensions

• Ported to many languages

• Rx.NET, RxJava, RxJS, ...

• Native support for Reactive Streams coming in 2.x

Page 41: Reactive Programming in Spring 5

RxJava

Observable.just('a', 'b', 'c') .take(2) .map(Character::toUpperCase) .subscribe(System.out::println)

Page 42: Reactive Programming in Spring 5

RxNetty

• RxJava on top of Netty

• Client/server for TCP and HTTP

• Backpressure support

Page 43: Reactive Programming in Spring 5

Spring 5

Page 44: Reactive Programming in Spring 5

Spring Reactive

• Experimental work for Spring 5

• Non-blocking runtimes:

• Netty, Jetty, Tomcat, (Undertow)

• RxJava, Reactor

https://github.com/spring-projects/spring-reactive

Page 45: Reactive Programming in Spring 5

public interface ServerHttpRequest { HttpMethod getMethod(); URI getURI(); InputStream getBody(); }

public interface ServerHttpResponse { void setStatusCode(HttpStatus status); OutputStream getBody();}

HttpMessage

Page 46: Reactive Programming in Spring 5

public interface ReactiveServerHttpRequest { HttpMethod getMethod(); URI getURI(); Publisher<ByteBuffer> getBody(); }

public interface ServerHttpResponse { void setStatusCode(HttpStatus status); Publisher<void> setBody(Publisher<ByteBuffer> body);}

Reactive HttpMessage

Page 47: Reactive Programming in Spring 5

Reactive Wep App

Web Service Data

Page 48: Reactive Programming in Spring 5

Wanted: Reactiveness• JDBC

• MySQL

• Postgres

• NoSQL

• MongoDB

• HTTP Client

• OkHttp

• Spring 5

• …

Page 49: Reactive Programming in Spring 5

Reactor

@RequestMapping("/capitalize")@ResponseBodypublic Stream<Person> capitalize(

@RequestBody Stream<Person> persons) { return persons.map(person -> { person.setName(person.getName().toUpperCase()); return person; });}

Page 50: Reactive Programming in Spring 5

RxJava

@RequestMapping("/capitalize")@ResponseBodypublic Observable<Person> capitalize(

@RequestBody Observable<Person> persons) { return persons.map(person -> { person.setName(person.getName().toUpperCase()); return person; });}