Certificado de Spring Reactive WebFlux

10h 0m

Aprende programación reactiva con Spring WebFlux para aplicaciones Spring Boot de alto rendimiento y máxima eficiencia.

Empezar curso

Spring WebFlux representa la evolución natural del desarrollo de aplicaciones web en el ecosistema Spring, introduciendo un paradigma completamente nuevo basado en programación reactiva

Esta tecnología surge como respuesta a las limitaciones del modelo tradicional de programación imperativa, especialmente cuando se trata de manejar grandes volúmenes de peticiones concurrentes y operaciones de entrada/salida intensivas.

Fundamentos de la programación reactiva

La programación reactiva se basa en el concepto de flujos de datos asincrónicos y la propagación de cambios. A diferencia del modelo tradicional donde el código se ejecuta de forma secuencial y bloqueante, el paradigma reactivo permite que las operaciones se ejecuten de manera no bloqueante, liberando recursos del sistema para atender otras peticiones mientras se esperan respuestas de operaciones lentas como consultas a bases de datos o llamadas a servicios externos.

Spring WebFlux implementa la especificación Reactive Streams, que define un estándar para el procesamiento asíncrono de flujos de datos con contrapresión (backpressure). Esta característica permite que los consumidores controlen la velocidad a la que reciben datos, evitando problemas de memoria y garantizando un comportamiento predecible del sistema bajo carga.

// Ejemplo básico de flujo reactivo
Flux<String> nombres = Flux.just("Ana", "Carlos", "María")
    .map(String::toUpperCase)
    .filter(nombre -> nombre.length() > 3);

nombres.subscribe(System.out::println);

Arquitectura y componentes principales

Spring WebFlux se construye sobre Project Reactor, la implementación de referencia de Reactive Streams para la JVM. Los tipos fundamentales son Mono y Flux, que representan flujos de 0-1 y 0-N elementos respectivamente. Estos tipos proporcionan una API rica para transformar, combinar y procesar datos de forma asíncrona.

La arquitectura de WebFlux soporta dos modelos de programación distintos. El modelo basado en anotaciones mantiene la familiaridad con Spring MVC, permitiendo a los desarrolladores utilizar anotaciones como @RestController y @RequestMapping mientras aprovechan las capacidades reactivas. El modelo funcional ofrece un enfoque más declarativo utilizando funciones lambda y un DSL específico para definir rutas y manejadores.

// Modelo basado en anotaciones
@RestController
public class UsuarioController {
    
    @GetMapping("/usuarios")
    public Flux<Usuario> obtenerUsuarios() {
        return usuarioService.findAll();
    }
    
    @GetMapping("/usuarios/{id}")
    public Mono<Usuario> obtenerUsuario(@PathVariable String id) {
        return usuarioService.findById(id);
    }
}

Integración con bases de datos reactivas

La persistencia de datos en aplicaciones reactivas requiere un enfoque diferente al tradicional. Spring Data R2DBC (Reactive Relational Database Connectivity) proporciona acceso no bloqueante a bases de datos relacionales, manteniendo la naturaleza asíncrona de toda la cadena de procesamiento. R2DBC utiliza un protocolo completamente nuevo que permite operaciones de base de datos verdaderamente asíncronas.

Los repositorios reactivos extienden las interfaces ReactiveCrudRepository o ReactiveRepository, devolviendo tipos Mono y Flux en lugar de objetos o colecciones tradicionales. Esta integración permite que las consultas a la base de datos se ejecuten de forma no bloqueante, liberando hilos para atender otras peticiones.

public interface UsuarioRepository extends ReactiveCrudRepository<Usuario, String> {
    
    Flux<Usuario> findByNombreContaining(String nombre);
    
    Mono<Usuario> findByEmail(String email);
    
    @Query("SELECT * FROM usuarios WHERE activo = true")
    Flux<Usuario> findUsuariosActivos();
}

Operadores y transformaciones de flujos

Los operadores reactivos constituyen el corazón de la programación con WebFlux. Estos operadores permiten transformar, filtrar, combinar y procesar flujos de datos de manera declarativa. Los operadores básicos como map, filter, flatMap y merge proporcionan las herramientas fundamentales para manipular datos, mientras que operadores más avanzados como window, buffer, retry y timeout ofrecen capacidades sofisticadas para casos de uso complejos.

La composición de operadores permite crear pipelines de procesamiento complejos de forma legible y mantenible. Cada operador devuelve un nuevo flujo, permitiendo el encadenamiento de operaciones sin efectos secundarios.

// Pipeline de procesamiento complejo
Flux<PedidoDTO> procesarPedidos = pedidoRepository.findAll()
    .filter(pedido -> pedido.getEstado() == Estado.PENDIENTE)
    .flatMap(this::validarPedido)
    .map(this::convertirADTO)
    .onErrorContinue((error, pedido) -> 
        log.error("Error procesando pedido: {}", pedido, error))
    .delayElements(Duration.ofMillis(100));

Cliente HTTP reactivo

WebClient representa el cliente HTTP reactivo de Spring, diseñado para reemplazar RestTemplate en aplicaciones reactivas. WebClient mantiene la naturaleza no bloqueante de las operaciones, permitiendo realizar múltiples llamadas HTTP concurrentes sin bloquear hilos. Su API fluida facilita la configuración de peticiones complejas, manejo de errores y transformación de respuestas.

La integración con el ecosistema reactivo permite combinar múltiples llamadas a servicios externos de forma eficiente, utilizando operadores como zip, merge o flatMap para coordinar operaciones asíncronas.

WebClient client = WebClient.builder()
    .baseUrl("https://api.ejemplo.com")
    .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
    .build();

Mono<Usuario> usuario = client.get()
    .uri("/usuarios/{id}", userId)
    .retrieve()
    .bodyToMono(Usuario.class)
    .timeout(Duration.ofSeconds(5))
    .retry(3);

Integración con sistemas de mensajería

La integración con Apache Kafka en aplicaciones WebFlux permite construir arquitecturas de microservicios verdaderamente reactivas. Spring Kafka proporciona soporte reactivo para productores y consumidores, manteniendo la naturaleza asíncrona del procesamiento de mensajes. Esta integración es especialmente valiosa en arquitecturas basadas en eventos donde los servicios necesitan reaccionar a cambios en tiempo real.

Los flujos reactivos pueden conectarse directamente con topics de Kafka, permitiendo el procesamiento continuo de streams de datos con capacidades de contrapresión y manejo de errores sofisticado.

Testing y validación

El testing de aplicaciones reactivas requiere herramientas y técnicas específicas debido a la naturaleza asíncrona de los flujos. Spring proporciona WebTestClient para pruebas de integración de endpoints reactivos, mientras que StepVerifier de Project Reactor permite verificar el comportamiento de flujos reactivos de forma determinista.

Las pruebas deben considerar aspectos como la temporización, el manejo de errores asincrónicos y la verificación de secuencias de eventos. El testing reactivo enfatiza la verificación del comportamiento del flujo completo más que estados puntuales.

@Test
void deberiaRetornarUsuarios() {
    webTestClient.get()
        .uri("/usuarios")
        .exchange()
        .expectStatus().isOk()
        .expectBodyList(Usuario.class)
        .hasSize(3);
}

Seguridad en aplicaciones reactivas

La seguridad JWT en aplicaciones WebFlux requiere un enfoque adaptado al paradigma reactivo. Spring Security WebFlux proporciona filtros reactivos que procesan tokens JWT de forma no bloqueante, manteniendo la eficiencia del sistema. La validación de tokens, autorización y autenticación se integran naturalmente con los flujos reactivos.

Los filtros de seguridad reactivos operan sobre flujos de ServerWebExchange, permitiendo transformaciones y validaciones asíncronas sin bloquear el procesamiento de peticiones. Esta integración garantiza que la seguridad no comprometa el rendimiento de la aplicación reactiva.

La implementación de seguridad reactiva considera aspectos como la propagación del contexto de seguridad a través de operadores asíncronos y el manejo de errores de autenticación en flujos no bloqueantes, proporcionando una experiencia de seguridad robusta y eficiente.

Empezar curso

Otros cursos de programación con certificado

Supera todos los retos de Spring Reactive WebFlux y obtén estos certificados de superación para mejorar tu currículum y tu empleabilidad.

Tecnologías que aprenderás

Spring Reactive WebFlux

Al finalizar este curso obtendrás

Certificado de superación en Spring Reactive WebFlux

Certificado de superación en Spring Reactive WebFlux

Tras completar todas las lecciones y ejercicios del curso Spring Reactive WebFlux se te genera un enlace con tu certificado para que lo puedas descargar o compartir directamente en cualquier plataforma, siempre accesible.

Accede a todas certificaciones