Reactive Programming in Spring 5
Transcript of Reactive Programming in Spring 5
![Page 1: Reactive Programming in Spring 5](https://reader031.fdocuments.in/reader031/viewer/2022012313/586f78aa1a28ab10258b6cc3/html5/thumbnails/1.jpg)
Reactive Programming in Spring 5
Arjen PoutsmaPivotal
![Page 2: Reactive Programming in Spring 5](https://reader031.fdocuments.in/reader031/viewer/2022012313/586f78aa1a28ab10258b6cc3/html5/thumbnails/2.jpg)
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](https://reader031.fdocuments.in/reader031/viewer/2022012313/586f78aa1a28ab10258b6cc3/html5/thumbnails/3.jpg)
Agenda
• Reactive Systems
• Reactive Streams
• RxJava
• Reactor
• Reactive Programming in Spring 5
![Page 4: Reactive Programming in Spring 5](https://reader031.fdocuments.in/reader031/viewer/2022012313/586f78aa1a28ab10258b6cc3/html5/thumbnails/4.jpg)
Reactive Systems
![Page 5: Reactive Programming in Spring 5](https://reader031.fdocuments.in/reader031/viewer/2022012313/586f78aa1a28ab10258b6cc3/html5/thumbnails/5.jpg)
Reactive Manifesto
Responsive
Message Driven
ResilientElastic
![Page 6: Reactive Programming in Spring 5](https://reader031.fdocuments.in/reader031/viewer/2022012313/586f78aa1a28ab10258b6cc3/html5/thumbnails/6.jpg)
Reactive Manifesto• Responsive
• Rapid
• Consistent
• Resilient
• Replication
• Isolation
• Elastic
• Scaling
• No bottlenecks
• Message Driven
• Async
• Back-pressure
![Page 7: Reactive Programming in Spring 5](https://reader031.fdocuments.in/reader031/viewer/2022012313/586f78aa1a28ab10258b6cc3/html5/thumbnails/7.jpg)
Reactive Streams
![Page 8: Reactive Programming in Spring 5](https://reader031.fdocuments.in/reader031/viewer/2022012313/586f78aa1a28ab10258b6cc3/html5/thumbnails/8.jpg)
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](https://reader031.fdocuments.in/reader031/viewer/2022012313/586f78aa1a28ab10258b6cc3/html5/thumbnails/9.jpg)
Publisher Subscriber
![Page 10: Reactive Programming in Spring 5](https://reader031.fdocuments.in/reader031/viewer/2022012313/586f78aa1a28ab10258b6cc3/html5/thumbnails/10.jpg)
Publisher Subscribersubscribe
![Page 11: Reactive Programming in Spring 5](https://reader031.fdocuments.in/reader031/viewer/2022012313/586f78aa1a28ab10258b6cc3/html5/thumbnails/11.jpg)
Publisher Subscriber
![Page 12: Reactive Programming in Spring 5](https://reader031.fdocuments.in/reader031/viewer/2022012313/586f78aa1a28ab10258b6cc3/html5/thumbnails/12.jpg)
Publisher Subscriber
![Page 13: Reactive Programming in Spring 5](https://reader031.fdocuments.in/reader031/viewer/2022012313/586f78aa1a28ab10258b6cc3/html5/thumbnails/13.jpg)
Publisher Subscriber
onSubscribe
Subscription
![Page 14: Reactive Programming in Spring 5](https://reader031.fdocuments.in/reader031/viewer/2022012313/586f78aa1a28ab10258b6cc3/html5/thumbnails/14.jpg)
Publisher Subscriber
Subscription
![Page 15: Reactive Programming in Spring 5](https://reader031.fdocuments.in/reader031/viewer/2022012313/586f78aa1a28ab10258b6cc3/html5/thumbnails/15.jpg)
Subscription
Publisher Subscriber
![Page 16: Reactive Programming in Spring 5](https://reader031.fdocuments.in/reader031/viewer/2022012313/586f78aa1a28ab10258b6cc3/html5/thumbnails/16.jpg)
Subscription
Publisher Subscriber
request
2
![Page 17: Reactive Programming in Spring 5](https://reader031.fdocuments.in/reader031/viewer/2022012313/586f78aa1a28ab10258b6cc3/html5/thumbnails/17.jpg)
Subscription
Publisher Subscriber
2
![Page 18: Reactive Programming in Spring 5](https://reader031.fdocuments.in/reader031/viewer/2022012313/586f78aa1a28ab10258b6cc3/html5/thumbnails/18.jpg)
Subscription
Publisher Subscriber
2
![Page 19: Reactive Programming in Spring 5](https://reader031.fdocuments.in/reader031/viewer/2022012313/586f78aa1a28ab10258b6cc3/html5/thumbnails/19.jpg)
Subscription
Publisher Subscriber
onNext
1
![Page 20: Reactive Programming in Spring 5](https://reader031.fdocuments.in/reader031/viewer/2022012313/586f78aa1a28ab10258b6cc3/html5/thumbnails/20.jpg)
Subscription
Publisher Subscriber
1
![Page 21: Reactive Programming in Spring 5](https://reader031.fdocuments.in/reader031/viewer/2022012313/586f78aa1a28ab10258b6cc3/html5/thumbnails/21.jpg)
Subscription
Publisher Subscriber
onNext
0
![Page 22: Reactive Programming in Spring 5](https://reader031.fdocuments.in/reader031/viewer/2022012313/586f78aa1a28ab10258b6cc3/html5/thumbnails/22.jpg)
Subscription
Publisher Subscriber
0
![Page 23: Reactive Programming in Spring 5](https://reader031.fdocuments.in/reader031/viewer/2022012313/586f78aa1a28ab10258b6cc3/html5/thumbnails/23.jpg)
Subscription
Publisher Subscriber
request
5
![Page 24: Reactive Programming in Spring 5](https://reader031.fdocuments.in/reader031/viewer/2022012313/586f78aa1a28ab10258b6cc3/html5/thumbnails/24.jpg)
Subscription
Publisher Subscriber
5
![Page 25: Reactive Programming in Spring 5](https://reader031.fdocuments.in/reader031/viewer/2022012313/586f78aa1a28ab10258b6cc3/html5/thumbnails/25.jpg)
Subscription
Publisher Subscriber
5
![Page 26: Reactive Programming in Spring 5](https://reader031.fdocuments.in/reader031/viewer/2022012313/586f78aa1a28ab10258b6cc3/html5/thumbnails/26.jpg)
Subscription
Publisher Subscriber
onNext
4
![Page 27: Reactive Programming in Spring 5](https://reader031.fdocuments.in/reader031/viewer/2022012313/586f78aa1a28ab10258b6cc3/html5/thumbnails/27.jpg)
Subscription
Publisher Subscriber
4
![Page 28: Reactive Programming in Spring 5](https://reader031.fdocuments.in/reader031/viewer/2022012313/586f78aa1a28ab10258b6cc3/html5/thumbnails/28.jpg)
Subscription
Publisher Subscriber
onNext
3
![Page 29: Reactive Programming in Spring 5](https://reader031.fdocuments.in/reader031/viewer/2022012313/586f78aa1a28ab10258b6cc3/html5/thumbnails/29.jpg)
Subscription
Publisher Subscriber
3
![Page 30: Reactive Programming in Spring 5](https://reader031.fdocuments.in/reader031/viewer/2022012313/586f78aa1a28ab10258b6cc3/html5/thumbnails/30.jpg)
Subscription
Publisher Subscriber
onNext
2
![Page 31: Reactive Programming in Spring 5](https://reader031.fdocuments.in/reader031/viewer/2022012313/586f78aa1a28ab10258b6cc3/html5/thumbnails/31.jpg)
Subscription
Publisher Subscriber
2
![Page 32: Reactive Programming in Spring 5](https://reader031.fdocuments.in/reader031/viewer/2022012313/586f78aa1a28ab10258b6cc3/html5/thumbnails/32.jpg)
Subscription
Publisher Subscriber
onComplete
2
![Page 33: Reactive Programming in Spring 5](https://reader031.fdocuments.in/reader031/viewer/2022012313/586f78aa1a28ab10258b6cc3/html5/thumbnails/33.jpg)
Publisher Subscribersubscribe
onSubscribeSubscription
request
onNext
onComplete
onError
![Page 34: Reactive Programming in Spring 5](https://reader031.fdocuments.in/reader031/viewer/2022012313/586f78aa1a28ab10258b6cc3/html5/thumbnails/34.jpg)
Hot & Cold
Cold Hot
Passive Active
Publish when subscribed
Publish regardless
Queue Mouse Movement
![Page 35: Reactive Programming in Spring 5](https://reader031.fdocuments.in/reader031/viewer/2022012313/586f78aa1a28ab10258b6cc3/html5/thumbnails/35.jpg)
Operators
• map, flatMap, take, subscribe, …
• No Operators in Reactive Streams
• Left to implementations
![Page 36: Reactive Programming in Spring 5](https://reader031.fdocuments.in/reader031/viewer/2022012313/586f78aa1a28ab10258b6cc3/html5/thumbnails/36.jpg)
Reactor
![Page 37: Reactive Programming in Spring 5](https://reader031.fdocuments.in/reader031/viewer/2022012313/586f78aa1a28ab10258b6cc3/html5/thumbnails/37.jpg)
Project Reactor
• Stream extends Publisher
• Wrap Publisher
![Page 38: Reactive Programming in Spring 5](https://reader031.fdocuments.in/reader031/viewer/2022012313/586f78aa1a28ab10258b6cc3/html5/thumbnails/38.jpg)
Reactor
Streams.just('a' 'b' 'c') .take(2) .map(Character::toUpperCase) .consume(System.out::println);
![Page 39: Reactive Programming in Spring 5](https://reader031.fdocuments.in/reader031/viewer/2022012313/586f78aa1a28ab10258b6cc3/html5/thumbnails/39.jpg)
RxJava
![Page 40: Reactive Programming in Spring 5](https://reader031.fdocuments.in/reader031/viewer/2022012313/586f78aa1a28ab10258b6cc3/html5/thumbnails/40.jpg)
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](https://reader031.fdocuments.in/reader031/viewer/2022012313/586f78aa1a28ab10258b6cc3/html5/thumbnails/41.jpg)
RxJava
Observable.just('a', 'b', 'c') .take(2) .map(Character::toUpperCase) .subscribe(System.out::println)
![Page 42: Reactive Programming in Spring 5](https://reader031.fdocuments.in/reader031/viewer/2022012313/586f78aa1a28ab10258b6cc3/html5/thumbnails/42.jpg)
RxNetty
• RxJava on top of Netty
• Client/server for TCP and HTTP
• Backpressure support
![Page 43: Reactive Programming in Spring 5](https://reader031.fdocuments.in/reader031/viewer/2022012313/586f78aa1a28ab10258b6cc3/html5/thumbnails/43.jpg)
Spring 5
![Page 44: Reactive Programming in Spring 5](https://reader031.fdocuments.in/reader031/viewer/2022012313/586f78aa1a28ab10258b6cc3/html5/thumbnails/44.jpg)
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](https://reader031.fdocuments.in/reader031/viewer/2022012313/586f78aa1a28ab10258b6cc3/html5/thumbnails/45.jpg)
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](https://reader031.fdocuments.in/reader031/viewer/2022012313/586f78aa1a28ab10258b6cc3/html5/thumbnails/46.jpg)
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](https://reader031.fdocuments.in/reader031/viewer/2022012313/586f78aa1a28ab10258b6cc3/html5/thumbnails/47.jpg)
Reactive Wep App
Web Service Data
![Page 48: Reactive Programming in Spring 5](https://reader031.fdocuments.in/reader031/viewer/2022012313/586f78aa1a28ab10258b6cc3/html5/thumbnails/48.jpg)
Wanted: Reactiveness• JDBC
• MySQL
• Postgres
• NoSQL
• MongoDB
• HTTP Client
• OkHttp
• Spring 5
• …
![Page 49: Reactive Programming in Spring 5](https://reader031.fdocuments.in/reader031/viewer/2022012313/586f78aa1a28ab10258b6cc3/html5/thumbnails/49.jpg)
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](https://reader031.fdocuments.in/reader031/viewer/2022012313/586f78aa1a28ab10258b6cc3/html5/thumbnails/50.jpg)
RxJava
@RequestMapping("/capitalize")@ResponseBodypublic Observable<Person> capitalize(
@RequestBody Observable<Person> persons) { return persons.map(person -> { person.setName(person.getName().toUpperCase()); return person; });}
![Page 51: Reactive Programming in Spring 5](https://reader031.fdocuments.in/reader031/viewer/2022012313/586f78aa1a28ab10258b6cc3/html5/thumbnails/51.jpg)
More Spring!
Spring Meetup
http://www.meetup.com/Dutch-Spring-Meetup/
Spring Track GOTO Amsterdam 2016
http://gotoams.com
![Page 52: Reactive Programming in Spring 5](https://reader031.fdocuments.in/reader031/viewer/2022012313/586f78aa1a28ab10258b6cc3/html5/thumbnails/52.jpg)
Q & A
https://github.com/spring-projects/spring-reactive