Leitfaden für Spring 5 WebFlux

1. Überblick

  • Das Spring WebFlux-Framework ist Teil von Spring 5 und bietet reaktive Programmierunterstützung für Webanwendungen. **

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

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

2. Spring WebFlux Framework

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

Das neue Framework unterstützt zwei Programmiermodelle:

  • Annotationsbasierte reaktive Komponenten

  • Funktionelles Routing und Handling

Hier werden wir uns auf die Annotations-basierten reaktiven Komponenten konzentrieren, da wir bereits den https://www.baeldung.com/spring-5-functional-web-Funktionsstil - Routing und Handling]untersucht haben.

3. Abhängigkeiten

Beginnen wir mit der Abhängigkeit von spring-boot-starter-webflux , die tatsächlich alle anderen erforderlichen Abhängigkeiten berücksichtigt:

  • spring-boot und spring-boot-starter für Spring Spring

Anwendungssetup ** __spring-webflux __framework

  • reactor-core , den wir für reaktive Ströme und auch benötigen

reactor-netty

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
    <version>2.0.3.RELEASE</version>
</dependency>

4. Reaktive REST-Anwendung

  • Wir erstellen jetzt eine sehr einfache Reactive REST EmployeeManagement -Anwendung - mit Spring WebFlux: **

  • Wir verwenden ein einfaches Domänenmodell - Employee mit einer id und einem name

Feld ** Wir erstellen REST-APIs zum Veröffentlichen und Abrufen von Single sowie von

Sammlung Mitarbeiter Ressourcen mit _RestController und WebClient_ ** Und wir werden auch einen sicheren reaktiven Endpunkt mit WebFlux erstellen

und Frühlingssicherheit

5. Reaktiver RestController

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

Zunächst erstellen wir auf der Serverseite einen kommentierten Controller, der unsere reaktiven Streams von Employee veröffentlicht.

Erstellen Sie unseren kommentierten EmployeeController :

@RestController
@RequestMapping("/employees")
public class EmployeeReactiveController {

    private final EmployeeRepository employeeRepository;

   //constructor...
}

__EmployeeRepository __kann ein beliebiges Datenrepository sein, das nicht blockierende reaktive Streams unterstützt.

5.1. Einzelne Ressource

Erstellen Sie einen Endpunkt in unserem Controller, der eine einzelne __Employee-Ressource veröffentlicht:

@GetMapping("/{id}")
private Mono<Employee> getEmployeeById(@PathVariable String id) {
    return employeeRepository.findEmployeeById(id);
}
  • Für eine einzelne Employee -Ressource haben wir einen Mono vom Typ Employee verwendet, da er höchstens ein Element ausgeben wird.

5.2. Sammelressource

Fügen wir in unserem Controller auch einen Endpunkt hinzu, der die Erfassungsressource aller Employees veröffentlicht:

@GetMapping
private Flux<Employee> getAllEmployees() {
    return employeeRepository.findAllEmployees();
}
  • Für die Sammlungsressource haben wir Flux vom Typ Employee verwendet - da sich der Herausgeber darauf konzentriert hat, __0.

6. Reaktiver Webclient

WebClient , eingeführt in Spring 5, ist ein nicht blockierender Client mit Unterstützung für Reactive Streams.

  • Auf der Clientseite verwenden wir WebClient , um Daten von unseren in EmployeeController erstellten Endpunkten abzurufen . **

Erstellen Sie einen einfachen EmployeeWebClient :

public class EmployeeWebClient {

    WebClient client = WebClient.create("http://localhost:8080");

   //...
}

Hier haben wir einen WebClient mit seiner Factory-Methode create erstellt.

Es wird auf ____localhost: 8080 für relative URLs verwiesen.

6.1. Einzelne Ressource abrufen

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

Mono<Employee> employeeMono = client.get()
  .uri("/employees/{id}", "1")
  .retrieve()
  .bodyToMono(Employee.class);

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

6.2. Sammlungsressource abrufen

Auf ähnliche Weise können Sie eine Erfassungsressource vom Typ Flux vom Endpunkt /mitarbeiter abrufen:

Flux<Employee> employeeFlux = client.get()
  .uri("/employees")
  .retrieve()
  .bodyToFlux(Employee.class);

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

Auf https://www.baeldung.com/spring-5-webclient ist ein ausführlicher Artikel enthalten.

7. Spring WebFlux Security

  • Wir können Spring Security verwenden, um unsere reaktiven Endpunkte abzusichern. **

Nehmen wir an, wir haben einen neuen Endpunkt in unserem _EmployeeController. Dieser Endpunkt aktualisiert Employee -Details und sendet den aktualisierten Employee._ zurück.

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

Fügen wir unserem EmployeeController eine neue Methode hinzu:

@PostMapping("/update")
private Mono<Employee> updateEmployee(@RequestBody Employee employee) {
    return employeeRepository.updateEmployee(employee);
}

Um den Zugriff auf diese Methode einzuschränken, erstellen Sie SecurityConfig und definieren einige pfadbasierte Regeln, um nur ADMIN-Benutzer zuzulassen:

@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();
    }
}

Diese Konfiguration beschränkt den Zugriff auf den Endpunkt /employee/update . Daher können nur Benutzer mit der Rolle ADMIN auf diesen Endpunkt zugreifen und einen vorhandenen Employee aktualisieren.

Die Anmerkung _ @ EnableWebFluxSecurity _ fügt die Spring Security WebFlux-Unterstützung bei einigen Standardkonfigurationen hinzu.

Wir haben auch einen ausführlichen Artikel über https://www.baeldung.com/spring-security-5-reactive__timereine Konfiguration und Arbeit mit Spring WebFlux Security].

8. Schlussfolgerung

In diesem Artikel haben wir untersucht, wie Sie reaktive Webkomponenten erstellen und verwenden, die vom Spring WebFlux-Framework unterstützt werden, indem Sie eine kleine Reactive-REST-Anwendung erstellen.

Wir haben gelernt, mit RestController und _WebClient _ reaktive Streams zu veröffentlichen bzw. zu verbrauchen.

Wir haben auch untersucht, wie Sie mithilfe von Spring Security einen sicheren reaktiven Endpunkt erstellen.

Abgesehen von Reactive RestController und WebClient unterstützt das WebFlux -Framework auch reaktives WebSocket und entsprechendes WebSocketClient für das Socket-Streaming von Reactive Streams.

Wir haben einen ausführlichen Artikel über https://www.baeldung.com/spring-5-reactive-websockets , der mit Reactive WebSocket mit Spring 5 arbeitet].

Der vollständige Quellcode, der in diesem Lernprogramm verwendet wird, ist verfügbar unter over on Github .