Gids voor Spring 5 WebFlux

1. Overzicht

Spring WebFlux is onderdeel van Spring 5 en biedt reactieve programmeerondersteuning voor webapplicaties.

In deze zelfstudie maken we een kleine reactieve REST-applicatie met behulp van de reactieve webcomponenten RestController en Web cliënt.

We zullen ook bekijken hoe we onze reactieve eindpunten kunnen beveiligen met Spring Security.

2. Spring WebFlux Framework

Spring WebFlux gebruikt intern Project Reactor en zijn uitgeversimplementaties - Flux en Mono.

Het nieuwe raamwerk ondersteunt twee programmeermodellen:

  • Op annotaties gebaseerde reactieve componenten
  • Functionele routing en afhandeling

We zullen ons concentreren op de op annotaties gebaseerde reactieve componenten, aangezien we de functionele stijl - routing en afhandeling al hebben onderzocht in een andere tutorial.

3. Afhankelijkheden

Laten we beginnen met de spring-boot-starter-webflux afhankelijkheid, die alle andere vereiste afhankelijkheden binnenhaalt:

  • veerboot en spring-boot-starter voor de basisinstellingen van de Spring Boot-applicatie
  • lente-webflux kader
  • reactorkern die we nodig hebben voor reactieve stromen en ook reactor-netty
 org.springframework.boot spring-boot-starter-webflux 2.2.6.RELEASE 

De nieuwste spring-boot-starter-webflux kan worden gedownload vanaf Maven Central.

4. Reactieve REST-applicatie

We gaan nu een heel eenvoudige reactieve REST bouwen Werknemersbeheer applicatie - met Spring WebFlux:

  • We gebruiken een eenvoudig domeinmodel - Werknemer Met een ID kaart en een naam veld-
  • We bouwen een REST API met een RestController publiceren Werknemer bronnen als een enkele bron en als een verzameling
  • We bouwen een klant met Web cliënt om dezelfde bron op te halen
  • We zullen een beveiligd reactief eindpunt maken met behulp van WebFlux en Spring Security

5. Reactief RestController

Spring WebFlux ondersteunt op annotaties gebaseerde configuraties op dezelfde manier als het Spring Web MVC-framework.

Beginnen met, op de server maken we een geannoteerde controller die een reactieve stroom van het Werknemer bron.

Laten we onze geannoteerde WerknemerController:

@RestController @RequestMapping ("/ workers") openbare klasse EmployeeController {privé definitieve EmployeeRepository employeeRepository; // constructor ...}

WerknemerRepository kan elke gegevensopslagplaats zijn die niet-blokkerende reactieve streams ondersteunt.

5.1. Eén bron

Laten we een eindpunt maken in onze controller dat een single publiceert Medewerker resource:

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

We pakken er een in Werknemer resource in een Mono omdat we maximaal één medewerker terugsturen.

5.2. Collectiebron

Laten we ook een eindpunt toevoegen dat de verzamelingsbron van allemaal publiceert Werknemers:

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

Voor het verzamelmiddel gebruiken we een Flux van het type Werknemer - aangezien dat de uitgever is voor 0..n elementen.

6. Reactieve webclient

Web cliënt geïntroduceerd in Spring 5 is een niet-blokkerende client met ondersteuning voor reactieve streams.

We kunnen gebruiken Web cliënt om een ​​client te maken om gegevens op te halen van de eindpunten die door de WerknemerController.

Laten we een eenvoudig maken EmployeeWebClient:

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

Hier hebben we een Web cliënt volgens de fabrieksmethode creëren. Het zal verwijzen naar localhost: 8080 zodat we of relatieve URL's kunnen gebruiken voor oproepen die door deze clientinstantie worden gedaan.

6.1. Een enkele bron ophalen

Om een ​​enkele bron van het type op te halen Mono vanaf eindpunt / medewerker / {id}:

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

6.2. Ophalen van een verzamelingsresource

Evenzo om een ​​verzamelingsresource van het type op te halen Flux vanaf eindpunt / medewerkers:

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

We hebben ook een uitgebreid artikel over het instellen van en werken met WebClient.

7. Spring WebFlux-beveiliging

We kunnen Spring Security gebruiken om onze reactieve eindpunten te beveiligen.

Stel dat we een nieuw eindpunt hebben in ons WerknemerController. Dit eindpunt wordt bijgewerkt Werknemer details en stuurt het bijgewerkte Werknemer.

Omdat gebruikers hierdoor bestaande medewerkers kunnen wijzigen, willen we dit eindpunt beperken tot BEHEERDER alleen rolgebruikers.

Laten we een nieuwe methode toevoegen aan onze WerknemerController:

@PostMapping ("/ update") privé Mono updateEmployee (@RequestBody Werknemer werknemer) {return employeeRepository.updateEmployee (werknemer); }

Om de toegang tot deze methode te beperken, maken we SecurityConfig en definieer enkele padgebaseerde regels om alleen ADMIN-gebruikers toe te staan:

@EnableWebFluxSecurity openbare klasse EmployeeWebSecurityConfig {// ... @Bean openbare SecurityWebFilterChain springSecurityFilterChain (ServerHttpSecurity http) {http.csrf (). Disable () .authorizeExchange () .pathMatchers (HttpMethod.POST, "/employees.POST," / ("ADMIN") .pathMatchers ("/ **"). AllowAll () .en () .httpBasic (); retourneer http.build (); }}

Deze configuratie beperkt de toegang tot het eindpunt / medewerkers / update. Daarom hebben alleen gebruikers een rol BEHEERDER zal toegang hebben tot dit eindpunt en een bestaand Werknemer.

Eindelijk de annotatie @EnableWebFluxSecurity voegt Spring Security WebFlux-ondersteuning toe met enkele standaardconfiguraties.

We hebben ook een gedetailleerd artikel over het configureren van en werken met Spring WebFlux-beveiliging.

8. Conclusie

In dit artikel hebben we onderzocht hoe we reactieve webcomponenten kunnen maken en gebruiken, zoals ondersteund door het Spring WebFlux-framework. Als voorbeeld hebben we een kleine Reactive REST-applicatie gebouwd.

We hebben geleerd hoe te gebruiken RestController en Web cliënt om reactieve streams te publiceren en te consumeren.

We hebben ook gekeken hoe we een beveiligd reactief eindpunt kunnen maken met behulp van Spring Security.

Anders dan reactief RestController en Web cliënt, de WebFlux framework ondersteunt ook reactief WebSocket en de daarbij behorende WebSocketClient voor streaming in socketstijl van Reactive Streams.

We hebben een gedetailleerd artikel gericht op het werken met Reactive WebSocket met Spring 5.

Ten slotte is de volledige broncode die in deze tutorial wordt gebruikt, beschikbaar op Github.