3. Meetup Spring Madrid - WebFlux
BIO
Arquitecto Software @ ParadigmaDigital
alberto.grande@gmail.com
@alberto_grande
4. Meetup Spring Madrid - WebFlux
Programación Reactiva
“
In computing, reactive programming is a
declarative programming paradigm
concerned with data streams and the
propagation of change.
”
https://www.reactivemanifesto.org/
5. Meetup Spring Madrid - WebFlux
Reactive Streams
Publisher
También llamados Observables. Estos objetos son los que emiten el
flujo de datos
Subscriber
También llamados Observers. Estos objetos son a los que se les
notifican los cambios en el flujo de datos que emite el Publisher
Subscription
Una suscripción se creará en el lado del ‘Publisher’ y se compartirá
con el ‘Subscriber’
Processor
Un procesador puede ser utilizado entre el ‘Publisher’ y el
‘Subscriber’ para realizar transformaciones
La especificación de ‘Reactive Stream’ es un estándar y desde Java 9
se incluye en el Flow API
Programación Reactiva - Conceptos
6. Meetup Spring Madrid - WebFlux
Es un proyecto que se basa en la especificación de
‘Reactive Stream’ proporcionando una
implementación.
Proporciona dos tipos:
Mono: implementa un Publisher y devuelve 0 o 1
elementos
Flux: implementa un Publisher y devuelve N elementos
En RxJava serían un Flowable o Observable (en función
de la versión)
Project Reactor
¿Qué es?
7. Meetup Spring Madrid - WebFlux
La nueva versión de Spring 5 trae soporte para la
programación reactiva mediante el nuevo módulo
llamado WebFlux.
WebFlux a su vez toma como base la librería del
proyecto Reactor (https://projectreactor.io).
WebFlux permite su uso a través de anotaciones (de
forma similar al modelo de programación de Spring
Web MVC) o de forma funcional (programática)
Spring WebFlux
¿Qué es?
17. Editar el estilo de texto del patrón
Spring MVC y Spring WebFlux
18. Meetup Spring Madrid - WebFlux
Spring WebFlux
Spring MVC Spring WebFlux
Reactive Web API
Reactor, Reactive Streams
Servlet API
Tomcat, Jetty Netty Tomcat, Jetty
Blocking I/O Non - Blocking I/O
Ref: Juergen Hoeller
19. Meetup Spring Madrid - WebFlux
Spring WebFlux
Spring MVC Spring WebFlux
Reactive Web API
Reactor, Reactive Streams
Servlet API
Tomcat, Jetty Netty Tomcat, Jetty
Blocking I/O Non - Blocking I/O
Ref: Juergen Hoeller
1 Thread gestiona toda
llamada, quedando
bloqueado hasta que esta
termina produciendo la
respuesta.
Trabaja con un pool de
threads esperando a recibir
peticiones
20. Meetup Spring Madrid - WebFlux
Spring WebFlux
Spring MVC Spring WebFlux
Reactive Web API
Reactor, Reactive Streams
Servlet API
Tomcat, Jetty Netty Tomcat, Jetty
Blocking I/O Non - Blocking I/O
Ref: Juergen Hoeller
1 Thread gestiona toda
llamada, quedando
bloqueado hasta que esta
termina produciendo la
respuesta.
Trabaja con un pool de
threads esperando a recibir
peticiones
Idóneo si el ‘sistema de
almacenamiento’ es
bloqueante
Llamadas no bloqueantes
Modelo de concurrencia
‘event loop’
Endpoints funcionales
Idóneo si el ‘sistema de
almacenamiento’ es NO
bloqueante
21. Meetup Spring Madrid - WebFlux
Spring WebFlux
@Controller, @RestController
Spring MVC Spring WebFlux
Reactive Web API
Reactor, Reactive Streams
Servlet API
Tomcat, Jetty Netty Tomcat, Jetty
Blocking I/O Non - Blocking I/O
Ref: Juergen Hoeller
22. Meetup Spring Madrid - WebFlux
Spring WebFlux
@Controller, @RestController
Spring MVC Spring WebFlux
Reactive Web API
Reactor, Reactive Streams
Servlet API
Tomcat, Jetty Netty Tomcat, Jetty
Blocking I/O Non - Blocking I/O
Ref: Juergen Hoeller
Router
functions
26. Meetup Spring Madrid - WebFlux
Spring WebFlux
El entorno de ejecución recoge una petición que hace
‘match’ con la URL especificada y la envía al
manejador de la petición
27. Meetup Spring Madrid - WebFlux
Spring WebFlux
El entorno de ejecución recoge una petición que hace
‘match’ con la URL especificada y la envía al
manejador de la petición
Se pasan los parámetros al método del repositorio que
devuelve un ‘Publisher’ para el objeto ‘Message’ si es
posible producirlo
30. Meetup Spring Madrid - WebFlux
Spring WebFlux
Llega una petición
Se pasa al manejador
t
31. Meetup Spring Madrid - WebFlux
Spring WebFlux
Llega una petición
Se pasa al manejador
El manejador identifica los parámetros
t
32. Meetup Spring Madrid - WebFlux
Spring WebFlux
Llega una petición
Se pasa al manejador
El manejador identifica los parámetros
El manejador construye un pipeline para llegar al elemento Mensaje y lo devuelve.
Operación NO BLOQUEANTE
t
33. Meetup Spring Madrid - WebFlux
Spring WebFlux
Llega una petición
Se pasa al manejador
El manejador identifica los parámetros
El manejador construye un pipeline para llegar al elemento Mensaje y lo devuelve.
Operación NO BLOQUEANTE
El entorno de ejecución (en este caso el sistema de ‘event loop’ que proporciona WebFlux) se encarga de
registrar un Subscriber (crear una suscripción) al Publisher (el elemento Mono)
t
34. Meetup Spring Madrid - WebFlux
Spring WebFlux
Llega una petición
Se pasa al manejador
El manejador identifica los parámetros
El manejador construye un pipeline para llegar al elemento Mensaje y lo devuelve.
Operación NO BLOQUEANTE
El entorno de ejecución (en este caso el sistema de ‘event loop’ que proporciona WebFlux) se encarga de
registrar un Subscriber (crear una suscripción) al Publisher (el elemento Mono)
El Publisher (el elemento Mono) comienza a preguntar por el elemento ‘Message’
t
35. Meetup Spring Madrid - WebFlux
Spring WebFlux
Llega una petición
Se pasa al manejador
El manejador identifica los parámetros
El manejador construye un pipeline para llegar al elemento Mensaje y lo devuelve.
Operación NO BLOQUEANTE
El entorno de ejecución (en este caso el sistema de ‘event loop’ que proporciona WebFlux) se encarga de
registrar un Subscriber (crear una suscripción) al Publisher (el elemento Mono)
El Publisher (el elemento Mono) comienza a preguntar por el elemento ‘Message’
El Publisher recibirá el elemento siempre que sea posible producirlo y lo reenviará en la respuesta HTTP
t
36. Editar el estilo de texto del patrón
Spring WebFlux - Programación funcional
37. Meetup Spring Madrid - WebFlux
Spring WebFlux - Funcional
Spring WebFlux - Funcional
38. Meetup Spring Madrid - WebFlux
Spring WebFlux - Funcional
Spring WebFlux - Funcional
39. Meetup Spring Madrid - WebFlux
Spring WebFlux - Funcional - Lambdas
Spring WebFlux - Funcional - Lambdas
40. Editar el estilo de texto del patrón
Spring WebFlux - Server Sent Events
41. Meetup Spring Madrid - WebFlux
Spring WebFlux - Server Sent Events
API basada en HTTP para el envío de información push.
Permite al servidor enviar información al cliente
(comunicación en un único sentido)
¿Diferencia con los webSocket?
Los webSockets son un sistema de comunicación
basado en TCP que permite comunicación
bi-direccional entre cliente y servidor
¿Qué es?
42. Meetup Spring Madrid - WebFlux
Spring WebFlux - Server Sent Events
Spring WebFlux - Server Sent Events
43. Meetup Spring Madrid - WebFlux
Spring WebFlux - Server Sent Events
Spring WebFlux - Server Sent Events
44. Meetup Spring Madrid - WebFlux
Spring WebFlux - Server Sent Events
Cliente - Server Sent Events
Ref: www.w3schools.com
45. Editar el estilo de texto del patrón
Spring WebFlux - WebSockets
46. Meetup Spring Madrid - WebFlux
Spring WebFlux - WebSockets
Spring WebFlux - WebSockets
47. Editar el estilo de texto del patrón
Spring WebFlux - Cliente Reactivo
48. Meetup Spring Madrid - WebFlux
Spring WebFlux - Cliente reactivo
microservicio microservicio microservicio
microservicio
DB DB DB
49. Meetup Spring Madrid - WebFlux
Spring WebFlux - Cliente reactivo
microservicio microservicio microservicio
microservicio
DB DB DB
Non - Blocking I/O
50. Meetup Spring Madrid - WebFlux
Spring WebFlux - Cliente reactivo
microservicio microservicio microservicio
microservicio
DB DB DB
RestTemplate
Non - Blocking I/O
Blocking I/O
51. Meetup Spring Madrid - WebFlux
Spring WebFlux - Cliente reactivo
microservicio microservicio microservicio
microservicio
DB DB DB
WebClient
Non - Blocking I/O
Non - Blocking I/O
52. Meetup Spring Madrid - WebFlux
Spring WebFlux - Cliente reactivo
Spring WebFlux - Cliente reactivo
56. Meetup Spring Madrid - WebFlux
Spring WebFlux - Conclusiones
● Creación de un proyecto con Spring WebFlux
● Diferencias entre Spring WebFlux y Spring MVC y sus respectivos stacks
● Flujo de trabajo
● Creación de servicios REST con Spring WebFlux
● Modelo de programación funcional
● Server Sent Events
● WebSockets
● Cliente reactivo
● Testing
57. Meetup Spring Madrid - WebFlux
Spring WebFlux - Conclusiones
Ref: https://medium.com/@the.raj.saxena
Rendimiento
Spring MVC Spring WebFlux
Spring MVC 1.5.10.RELEASE
Spring WebFlux 2.0.0.RELEASE
2500 users (4 requests/user)
58. Meetup Spring Madrid - WebFlux
Spring WebFlux - Conclusiones
Ref: https://medium.com/@the.raj.saxena
Rendimiento
Spring MVC Spring WebFlux
Spring MVC 1.5.10.RELEASE
Spring WebFlux 2.0.0.RELEASE
5000 users (4 requests/user)
59. Meetup Spring Madrid - WebFlux
Spring WebFlux - Conclusiones
Ref: https://medium.com/@the.raj.saxena
Rendimiento
Spring MVC Spring WebFlux
Spring MVC 1.5.10.RELEASE
Spring WebFlux 2.0.0.RELEASE
10000 users (4 requests/user)