Anleitung zu Spring 5 WebFlux

1. Übersicht

Spring WebFlux ist Teil von Spring 5 und bietet reaktive Programmierunterstützung für Webanwendungen.

In diesem Tutorial erstellen wir eine kleine reaktive REST-Anwendung mit den reaktiven Webkomponenten RestController und WebClient.

Wir werden auch untersuchen, wie wir unsere reaktiven Endpunkte mit Spring Security sichern können.

2. Spring WebFlux Framework

Spring WebFlux verwendet intern Project Reactor und seine Publisher-Implementierungen - Flux und Mono .

Das neue Framework unterstützt zwei Programmiermodelle:

  • Anmerkungsbasierte reaktive Komponenten
  • Funktionelles Routing und Handling

Wir werden uns auf die auf Anmerkungen basierenden reaktiven Komponenten konzentrieren, da wir den Funktionsstil bereits untersucht haben - Routing und Handhabung in einem anderen Tutorial.

3. Abhängigkeiten

Beginnen wir mit der Spring-Boot-Starter-Webflux- Abhängigkeit, die alle anderen erforderlichen Abhängigkeiten berücksichtigt :

  • Spring-Boot und Spring-Boot-Starter für die grundlegende Einrichtung der Spring Boot-Anwendung
  • Spring-Webflux- Framework
  • Reaktorkern , den wir für reaktive Ströme und auch Reaktor-Netty benötigen
 org.springframework.boot spring-boot-starter-webflux 2.2.6.RELEASE 

Der neueste Spring-Boot-Starter-Webflux kann von Maven Central heruntergeladen werden.

4. Reaktive REST-Anwendung

Wir werden jetzt eine sehr einfache reaktive REST EmployeeManagement- Anwendung erstellen - mit Spring WebFlux:

  • Wir werden ein einfache Domain - Modell verwenden - Mitarbeiter mit einer ID und einem Namensfeld
  • Wir erstellen eine REST-API mit einem RestController , um Mitarbeiterressourcen als einzelne Ressource und als Sammlung zu veröffentlichen
  • Wir werden mit WebClient einen Client erstellen , um dieselbe Ressource abzurufen
  • Mit WebFlux und Spring Security erstellen wir einen gesicherten reaktiven Endpunkt

5. Reaktiver RestController

Spring WebFlux unterstützt annotationsbasierte Konfigurationen auf dieselbe Weise wie das Spring Web MVC-Framework.

Zunächst erstellen wir auf dem Server einen mit Anmerkungen versehenen Controller, der einen reaktiven Stream der Mitarbeiterressource veröffentlicht .

Erstellen wir unseren kommentierten EmployeeController :

@RestController @RequestMapping("/employees") public class EmployeeController { private final EmployeeRepository employeeRepository; // constructor... }

EmployeeRepository kann ein beliebiges Datenrepository sein, das nicht blockierende reaktive Streams unterstützt.

5.1. Einzelne Ressource

Erstellen wir in unserem Controller einen Endpunkt, der eine einzelne Mitarbeiterressource veröffentlicht :

@GetMapping("/{id}") private Mono getEmployeeById(@PathVariable String id) { return employeeRepository.findEmployeeById(id); }

Wir verpacken eine einzelne Mitarbeiterressource in ein Mono, da wir höchstens einen Mitarbeiter zurückgeben.

5.2. Sammlungsressource

Fügen wir außerdem einen Endpunkt hinzu, der die Erfassungsressource aller Mitarbeiter veröffentlicht :

@GetMapping private Flux getAllEmployees() { return employeeRepository.findAllEmployees(); }

Für die Sammlungsressource verwenden wir einen Flux vom Typ Employee - da dies der Herausgeber für 0. .n-Elemente ist.

6. Reaktiver Webclient

Der in Spring 5 eingeführte WebClient ist ein nicht blockierender Client mit Unterstützung für reaktive Streams.

Wir können WebClient verwenden , um einen Client zum Abrufen von Daten von den vom EmployeeController bereitgestellten Endpunkten zu erstellen .

Erstellen wir einen einfachen EmployeeWebClient :

public class EmployeeWebClient { WebClient client = WebClient.create("//localhost:8080"); // ... }

Hier haben wir einen WebClient mit seiner Factory-Methode create erstellt . Es wird auf localhost: 8080 verweisen, damit wir oder relative URLs für Aufrufe dieser Clientinstanz verwenden können.

6.1. Abrufen einer einzelnen Ressource

So rufen Sie eine einzelne Ressource vom Typ Mono vom Endpunkt / employee / {id} ab :

Mono employeeMono = client.get() .uri("/employees/{id}", "1") .retrieve() .bodyToMono(Employee.class); employeeMono.subscribe(System.out::println);

6.2. Abrufen einer Sammlungsressource

So rufen Sie eine Sammlungsressource vom Typ Flux vom Endpunkt / den Mitarbeitern ab :

Flux employeeFlux = client.get() .uri("/employees") .retrieve() .bodyToFlux(Employee.class); employeeFlux.subscribe(System.out::println);

Wir haben auch einen ausführlichen Artikel zum Einrichten und Arbeiten mit WebClient .

7. Spring WebFlux Security

Wir können Spring Security verwenden, um unsere reaktiven Endpunkte zu sichern.

Nehmen wir an, wir haben einen neuen Endpunkt in unserem EmployeeController. Dieser Endpunkt aktualisiert die Mitarbeiterdetails und sendet den aktualisierten Mitarbeiter zurück.

Da Benutzer auf diese Weise vorhandene Mitarbeiter ändern können, möchten wir diesen Endpunkt nur auf Benutzer mit ADMIN- Rollen beschränken.

Fügen wir unserem EmployeeController eine neue Methode hinzu :

@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.

Schließlich ist der vollständige Quellcode, der in diesem Tutorial verwendet wird, auf Github verfügbar.