Si lo que estás buscando es que tus aplicaciones corran más rápido, Spring Webflux es una excelente opción. Este es un framework que hace posible la programación reactiva no bloqueante en apps web. Se introdujo en Spring 5 y nos ha ayudado a gestionar solicitudes HTTP, principalmente cuando requerimos realizar diversas solicitudes simultáneamente.
El día de hoy queremos explicarte qué es Spring Webflux y cómo funciona para que puedas usarlo en tus proyectos.
¿Qué es Spring WebFlux?
Como ya mencionamos, Spring Webflux es un framework que te permite crear aplicaciones reactivas y no bloqueantes. ¿Qué quiere decir esto¡ Pues que no tienes que esperar a que una solicitud termine, para empezar otra; en vez de eso, puedes gestionar diversos números de solicitudes en el mismo momento, lo que nos permite aprovechar al máximo los recursos del sistema.
En el enfoque tradicional de Spring MVC cada solicitud bloquea un hilo hasta que recibe una respuesta. Por otro lado, Spring WebFlux nos permite manejar un gran número de conexiones en simultánea.
¿Por qué usar Spring WebFlux?
La programación reactiva nos facilita la vida al resolver problemas de bloqueo que surgen en arquitecturas tradicionales. Si aun no estás seguro, te damos algunas razones para usar Spring Webflux en tus proyectos:
- Mejor manejo de recursos: Este framework nos permite manejar varias solicitudes en simultánea con menos recursos, en lugar de bloquear un hilo por cada solicitud.
- Alto rendimiento: Es perfecto para aplicaciones que necesitan escalar horizontalmente, como las que manejan grandes cantidades de tráfico o realizan muchas solicitudes simultáneas.
- Flujos de datos reactivos: Utiliza Reactor, una librería que soporta flujos de datos asincrónicos y que facilita trabajar con grandes volúmenes de información de manera eficiente.
La programación reactiva es un paradigma que permite gestionar múltiples eventos y procesos de manera simultánea sin tener que bloquear hilos.
¿Cómo funciona Spring WebFlux?: Clases Mono y Flux
Spring Webflux ha sido construido sobre el concepto de reactividad y hace uso de dos tipos de clases para gestionar flujos de datos: la clase mono y la clase flux. Veamos un poco más a fondo cada una:
- Mono: La clase mono representa un flujo que produce, ya sea un solo valor o ningún valor. Se puede usar cuando se espera recibir solo una respuesta, como en el caso de consultar un registro de una base de datos:
- Mono monoEjemplo = Mono.just(“Hola, Spring WebFlux!”);
- Flux: La clase Flux representa un flujo que puede o no producir múltiples valores o inclusive ninguno. Es muy común en situaciones donde hay que manejar listas de resultados, como listas de productos o usuarios:
- Flux fluxEjemplo = Flux.just(“Producto1”, “Producto2”, “Producto3”);
En lugar de bloquear el hilo hasta que todos los datos estén disponibles, estos flujos permiten manejar la información de manera asíncrona. Esto es lo que permite que Spring WebFlux sea tan eficiente y no bloqueante.
Spring WebFlux vs Spring MVC [Análisis comparativo]
Si bien Spring MVC se ha convertido en el estándar para crear aplicaciones web con Spring Framework, Webflux nos ofrece soluciones más modernas y sobretodo escalables. Veamos cuáles son los puntos a favor y en contra de cada herramienta:
Ejemplo de aplicación: caso práctico
Te planteamos la siguiente situación: tienes una aplicación que requiere hacer varias solicitudes a distintos servicios REST. Si usáramos el enfoque tradicional de Spring MVC, tendríamos que esperar a que cada petición termine antes de iniciar la siguiente, esto puede ser ineficiente si cada solicitud se tarda unos segundos.
Gracias a Spring WebFlux puedes realizar todas las peticiones al mismo tiempo e igualmente manejarlas en paralelo. Veamos un ejemplo:
- Configuración básica: Primero, añadimos las dependencias necesarias para WebFlux en nuestro archivo
pom.xml
:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
- Controlador reactivo con WebFlux: A continuación, vamos a crear un RestController que maneje peticiones de manera reactiva. En este ejemplo, devolveremos una lista de facturas utilizando un Flux:
@RestController
public class FacturasController {
@GetMapping("/facturas")
public Flux<Factura> obtenerFacturas() {
return Flux.just(
new Factura(1, "Ordenador", 500),
new Factura(2, "Tablet", 300)
).delayElements(Duration.ofSeconds(2)); // Simulamos una demora
}
}
En este código, Flux.just nos devuelve una secuencia de dos facturas y hacemos uso de delayElements para simular una demora de 2 segs antes de devolver cada elemento. Esto nos permite crear una ventaja con String WebFlux, ya que estas demoras no bloquean el hilo principal y permite que otras solicitudes se procesen mientras tanto.
Clientes reactivos: WebClient
Dentro de Spring Webflux, en vez de utilizar el tradicional RestTemplate, usamos el WebClient, una herramienta que nos permite hacer solicitudes HTTP de forma reactiva. Veamos un ejemplo de cliente reactivo:
WebClient webClient = WebClient.create("http://localhost:8080");
Flux<Factura> facturasFlux = webClient.get()
.uri("/facturas")
.retrieve()
.bodyToFlux(Factura.class);
facturasFlux.subscribe(factura -> System.out.println(factura));
Aquí hemos hecho una solicitud HTTP al endpoint /facturas y vamos a obtener un Flux de facturas. El método suscribe es el que nos permite manejar la respuesta de forma asíncrona al imprimir cada factura a medida que llega.
Si quieres seguir aprendiendo sobre técnicas de desarrollo web y cómo convertirte en un gran programador, no te pierdas la oportunidad de aprendizaje con el bootcamp desarrollo web que tenemos en Keepcoding para ti. Aquí dominarás las tecnologías más importantes para que tengas un futuro tecnológico brillante. ¡Inscríbete ya y no pierdas esta oportunidad!