1. Información general
Spring WebFlux es parte de Spring 5 y proporciona soporte de programación reactiva para aplicaciones web.
En este tutorial, crearemos una pequeña aplicación REST reactiva utilizando los componentes web reactivos RestController y WebClient.
También veremos cómo proteger nuestros puntos finales reactivos utilizando Spring Security.
2. Spring WebFlux Framework
Spring WebFlux utiliza internamente Project Reactor y sus implementaciones de editor: Flux y Mono .
El nuevo marco admite dos modelos de programación:
- Componentes reactivos basados en anotaciones
- Enrutamiento y manejo funcional
Nos centraremos en los componentes reactivos basados en anotaciones, como ya exploramos el estilo funcional: enrutamiento y manejo en otro tutorial.
3. Dependencias
Comencemos con la dependencia spring-boot-starter-webflux , que atrae todas las demás dependencias requeridas:
- spring-boot y spring-boot-starter para la configuración básica de la aplicación Spring Boot
- marco spring-webflux
- reactor-núcleo que necesitamos para corrientes reactivas y también reactor-netty
org.springframework.boot spring-boot-starter-webflux 2.2.6.RELEASE
El último spring-boot-starter-webflux se puede descargar desde Maven Central.
4. Aplicación REST reactiva
Ahora crearemos una aplicación REST EmployeeManagement reactiva muy simple , utilizando Spring WebFlux:
- Usaremos un modelo de dominio simple: empleado con una identificación y un campo de nombre
- Construiremos una API REST con un RestController para publicar los recursos de los empleados como un solo recurso y como una colección.
- Construiremos un cliente con WebClient para recuperar el mismo recurso.
- Crearemos un punto final reactivo seguro usando WebFlux y Spring Security
5. Reactive RestController
Spring WebFlux admite configuraciones basadas en anotaciones de la misma manera que el marco Spring Web MVC.
Para empezar, en el servidor, creamos un controlador anotado que publica un flujo reactivo del recurso Empleado .
Creemos nuestro EmployeeController anotado :
@RestController @RequestMapping("/employees") public class EmployeeController { private final EmployeeRepository employeeRepository; // constructor... }
EmployeeRepository puede ser cualquier repositorio de datos que admita flujos reactivos sin bloqueo.
5.1. Recurso único
Creemos un punto final en nuestro controlador que publique un único recurso de empleado :
@GetMapping("/{id}") private Mono getEmployeeById(@PathVariable String id) { return employeeRepository.findEmployeeById(id); }
Empaquetamos un solo recurso de Empleado en un Mono porque devolvemos como máximo un empleado.
5.2. Recurso de colección
Agreguemos también un punto final que publique el recurso de recopilación de todos los empleados :
@GetMapping private Flux getAllEmployees() { return employeeRepository.findAllEmployees(); }
Para el recurso de colección, usamos un Flux de tipo Empleado , ya que es el editor de los elementos 0. .n.
6. Cliente web reactivo
WebClient introducido en Spring 5 es un cliente sin bloqueo con soporte para flujos reactivos.
Podemos usar WebClient para crear un cliente para recuperar datos de los puntos finales proporcionados por EmployeeController.
Creemos un EmployeeWebClient simple :
public class EmployeeWebClient { WebClient client = WebClient.create("//localhost:8080"); // ... }
Aquí hemos creado un WebClient usando su método de fábrica create . Apuntará a localhost: 8080 para que podamos usar o URL relativas para las llamadas realizadas por esta instancia de cliente.
6.1. Recuperar un solo recurso
Para recuperar un solo recurso de tipo Mono de endpoint / employee / {id} :
Mono employeeMono = client.get() .uri("/employees/{id}", "1") .retrieve() .bodyToMono(Employee.class); employeeMono.subscribe(System.out::println);
6.2. Recuperar un recurso de colección
Del mismo modo, para recuperar un recurso de colección de tipo Flux desde el punto final / empleados :
Flux employeeFlux = client.get() .uri("/employees") .retrieve() .bodyToFlux(Employee.class); employeeFlux.subscribe(System.out::println);
También tenemos un artículo detallado sobre cómo configurar y trabajar con WebClient .
7. Seguridad de Spring WebFlux
Podemos usar Spring Security para asegurar nuestros puntos finales reactivos.
Supongamos que tenemos un nuevo punto final en nuestro EmployeeController. Este punto final actualiza los detalles del empleado y devuelve el empleado actualizado .
Dado que esto permite que los usuarios cambien a los empleados existentes, queremos restringir este punto final a los usuarios de rol ADMIN solamente.
Agreguemos un nuevo método a nuestro EmployeeController :
@PostMapping("/update") private Mono updateEmployee(@RequestBody Employee employee) { return employeeRepository.updateEmployee(employee); }
Now, to restrict access to this method let's create SecurityConfig and define some path-based rules to only allow ADMIN users:
@EnableWebFluxSecurity public class EmployeeWebSecurityConfig { // ... @Bean public SecurityWebFilterChain springSecurityFilterChain( ServerHttpSecurity http) { http.csrf().disable() .authorizeExchange() .pathMatchers(HttpMethod.POST, "/employees/update").hasRole("ADMIN") .pathMatchers("/**").permitAll() .and() .httpBasic(); return http.build(); } }
This configuration will restrict access to the endpoint /employees/update. Therefore only users having a role ADMIN will be able to access this endpoint and update an existing Employee.
Finally, the annotation @EnableWebFluxSecurity adds Spring Security WebFlux support with some default configurations.
We also have a detailed article on configuring and working with Spring WebFlux security.
8. Conclusion
In this article, we've explored how to create and work with reactive web components as supported by the Spring WebFlux framework. As an example, we've built a small Reactive REST application.
We learned how to use RestController and WebClient to publish and consume reactive streams.
We also looked into how to create a secured reactive endpoint with the help of Spring Security.
Other than Reactive RestController and WebClient, the WebFlux framework also supports reactive WebSocket and the corresponding WebSocketClient for socket style streaming of Reactive Streams.
We have a detailed article focused on working with Reactive WebSocket with Spring 5.
Finalmente, el código fuente completo utilizado en este tutorial está disponible en Github.