que presentar, ¡ven a presentar con nosotros! Programación Funcional, DevOps, Cloud Computing, IaaS, Desarrollo Web, React, WebGL, ReasonML y cualquier cosa interesante [email protected]
y Flux<T> • Rutas funcionales con Spring WebFlux • Demo • Conexión reactiva a una base de datos relacional - PostgreSQL • ¿Cómo probamos código functional y reactivo? (tests)
que nos permite construir aplicaciones asíncronas 100% no-bloqueantes. Interactúa directamente con el API funcional de Java. Reactor ofrece 2 APIs reactivas componibles: Mono [0|1] y Flux [N] ¿Qué quiere decir Reactivo o “Reactive Streams”? - Reactive Streams es una iniciativa que proporciona un estándar para el procesamiento de flujos asíncronos no-bloqueantes con contrapresión (backpressure).
el flujo de data Ambos implemetan Publisher<T> de ReactCore Flux lleva de 0 a N datos. Mono lleva 0 o 1 Flux<String> just = Flux.just("1", "2", "3"); Mono<String> just = Mono.just("foo"); Flux<String> empty = Flux.empty(); Mono<String> empty = Mono.empty(); ¿Por qué no solo Flux? - Cardinalidad y contra presión (backpressure)
contenedor de data: Mono<T> Flux<T> • Crear o inicializar: .empty(...), .just(...), .create(...), .fromSupplier(...) • Transformar los datos: .map(...), .filter(...), .flatMap(...), .zip(...) • Controlar errores y vacíos: .doOnError(...), .switchIfEmpty(...), .or(...) • Concatenar con la señal de otros Publisher<T>: .and(...), .then(...) • Convertir el tipo de los datos: .cast(...) • Generar logs y metricas: .log(...), .metrics() • Suscripción e hilos: .subscribe(...), .subscribeOn(...), .delaySubscription(...) • Y mas...
- Podemos utilizar @RestController para crear rutas. Que tan funcional/reactivo sería esto? WebFlux provee RouterFunction<T extends ServerResponse>: - Es libre de efectos secundarios. Retornamos la respuesta. - Es funcional, podemos concatenar rutas, aplicar filtros, etc. sin código imperativo. - Es reactivo, se ejecutan de manera asíncrona. Permite alta concurrencia sin bloquear Podemos extender la configuración implementando WebFluxConfigurer: - Conversión de mensajes: configureHttpMessageCodecs(ServerCodecConfigurer configurer) - Configuración de CORS: addCorsMappings(CorsRegistry registry) - Resolución de vistas: configureViewResolvers(ViewResolverRegistry registry)
inicialmente pensado para trabajar con bases de datos no relacionales ◦ Existen implementaciones de repositorios de datos reactivos para Mongo, Cassandra, Redis, Couchbase. • ¿Qué hay de JDBC y JPA? Son reactivas? • El proyecto Spring Data R2DBC (Reactive Relational Database Connectivity): ◦ Implementaciones reactivas de bases de datos relaciones: PostgreSQL, H2, MSSQL ◦ Se basan en la idea del popular Hibernate ◦ Con todos los beneficios de Spring Boot y JPA ◦ Spring Data R2DBC no es un ORM, está orientado a ser conceptualmente simple
Spring Boot nos trae: 1. Parámetros de conexión a nuestra base de datos (application.yml) 2. Entidad(es) que aten nuestras tablas con objetos Java 3. Repositorio(s) que abstraen la interacción con la base de datos Opcional: • Control de versión de base de datos: Spring DDLs, Flyway, Liquibase
Person("Paul", "McCartney", new Date(...)), new Person("Bob", "Dylan", new Date(...)), new Person("Keith", "Richards", new Date(...)) ) ) .subscribe(); Mono<Long> total = personRepo.count(); personRepo.findAll() .doOnNext(person -> { log.info(person.toString()); }) .subscribe(); Mono<Person> paul = personRepo.findById(1L); Mono<Person> keith = personRepo.findByLastname("Richards");
Código es no bloqueante, asíncrono y funcional. No podemos probarlo de forma imperativa. Bloquear en hilos de ReactorCore no es permitido Probar el flujo de datos (Mono y Flux)
Reactor StepVerifier API que nos ayuda a verificar de manera declarativa y paso a paso las secuencias asíncronas Ambiente controlado para manejar un reloj virtual (evadir pruebas largas) Verificar que completó o finalizó con un error esperado Cancelar la subscripción para finalizar (rollback)
funcional? Pruebas de integración Spring trae la abstracción WebTestClient API permite usar el contexto de la aplicación en las pruebas. El contexto contiene las rutas funcionales