61 lines
3.0 KiB
Plaintext
61 lines
3.0 KiB
Plaintext
[[spring-reactive-web]]
|
|
= Web on Reactive Stack
|
|
:doc-root: https://docs.spring.io
|
|
:api-spring-framework: {doc-root}/spring-framework/docs/{spring-version}/javadoc-api/org/springframework
|
|
:toc: left
|
|
:toclevels: 3
|
|
|
|
This part of the documentation covers support for reactive stack, web applications built on
|
|
http://www.reactive-streams.org/[Reactive Streams] and adapted to non-blocking runtimes
|
|
such as Netty, Undertow, and Servlet containers via Servlet 3.1 non-blocking I/O.
|
|
Individual chapters cover <<webflux-module, Spring WebFlux>> and its
|
|
<<webflux-fn,functional programming model>>. The previous section covers support for
|
|
<<web.adoc#spring-web,Servlet web>> applications.
|
|
|
|
[[spring-reactive-web-intro]]
|
|
== Introduction
|
|
|
|
|
|
[[spring-reactive-web-intro-reactive-programming]]
|
|
=== What is Reactive Programming?
|
|
|
|
In plain terms reactive programming is about non-blocking applications that are asynchronous
|
|
and event-driven and require a small number of threads to scale vertically (i.e. within the
|
|
JVM) rather than horizontally (i.e. through clustering).
|
|
|
|
A key aspect of reactive applications is the concept of backpressure which is
|
|
a mechanism to ensure producers don't overwhelm consumers. For example in a pipeline
|
|
of reactive components extending from the database to the HTTP response when the
|
|
HTTP connection is too slow the data repository can also slow down or stop completely
|
|
until network capacity frees up.
|
|
|
|
Reactive programming also leads to a major shift from imperative to declarative async
|
|
composition of logic. It is comparable to writing blocking code vs using the
|
|
`CompletableFuture` from Java 8 to compose follow-up actions via lambda expressions.
|
|
|
|
For a longer introduction check the blog series
|
|
https://spring.io/blog/2016/06/07/notes-on-reactive-programming-part-i-the-reactive-landscape["Notes on Reactive Programming"]
|
|
by Dave Syer.
|
|
|
|
|
|
[[spring-reactive-web-intro-reactive-api]]
|
|
=== Reactive API and Building Blocks
|
|
|
|
Spring Framework 5 embraces
|
|
https://github.com/reactive-streams/reactive-streams-jvm#reactive-streams[Reactive Streams]
|
|
as the contract for communicating backpressure across async components and
|
|
libraries. Reactive Streams is a specification created through industry collaboration that
|
|
has also been adopted in Java 9 as `java.util.concurrent.Flow`.
|
|
|
|
The Spring Framework uses https://projectreactor.io/[Reactor] internally for its own
|
|
reactive support. Reactor is a Reactive Streams implementation that further extends the
|
|
basic Reactive Streams `Publisher` contract with the `Flux` and `Mono` composable API
|
|
types to provide declarative operations on data sequences of `0..N` and `0..1`.
|
|
|
|
The Spring Framework exposes `Flux` and `Mono` in many of its own reactive APIs.
|
|
At the application level however, as always, Spring provides choice and fully supports
|
|
the use of RxJava. For more on reactive types check the post
|
|
https://spring.io/blog/2016/04/19/understanding-reactive-types["Understanding Reactive Types"]
|
|
by Sebastien Deleuze.
|
|
|
|
include::web/webflux.adoc[leveloffset=+1] |