Guide til Spring 5 WebFlux

1. Oversikt

Spring WebFlux er en del av Spring 5 og gir reaktiv programmeringsstøtte for webapplikasjoner.

I denne opplæringen lager vi et lite reaktivt REST-program ved hjelp av de reaktive webkomponentene RestController og WebClient.

Vi vil også se på hvordan vi kan sikre våre reaktive endepunkter ved hjelp av Spring Security.

2. Våren WebFlux Framework

Spring WebFlux bruker Project Reactor internt og dets publisistimplementeringer internt - Flux og Mono.

Det nye rammeverket støtter to programmeringsmodeller:

  • Kommentarbaserte reaktive komponenter
  • Funksjonell ruting og håndtering

Vi vil fokusere på kommentarbaserte reaktive komponenter, ettersom vi allerede har utforsket den funksjonelle stilen - ruting og håndtering i en annen opplæring.

3. Avhengigheter

La oss starte med spring-boot-starter-webflux avhengighet, som trekker inn alle andre nødvendige avhengigheter:

  • vårstøvel og spring-boot-starter for grunnleggende Spring Boot applikasjonsoppsett
  • vår-webflux rammeverk
  • reaktorkjerne som vi trenger for reaktive strømmer og også reaktor-netty
 org.springframework.boot spring-boot-starter-webflux 2.2.6.RELEASE 

Den siste vår-boot-starter-webflux kan lastes ned fra Maven Central.

4. Reaktiv REST-applikasjon

Vi bygger nå en veldig enkel reaktiv REST Ansattes ledelse applikasjon - ved hjelp av Spring WebFlux:

  • Vi bruker en enkel domenemodell - Ansatt med en id og en Navn felt
  • Vi bygger et REST API med en RestController å publisere Ansatt ressurser som en enkelt ressurs og som en samling
  • Vi bygger en klient med WebClient for å hente den samme ressursen
  • Vi oppretter et sikret reaktivt sluttpunkt ved hjelp av WebFlux og vårsikkerhet

5. Reaktiv RestController

Spring WebFlux støtter merknader-baserte konfigurasjoner på samme måte som Spring Web MVC-rammeverket.

Til å begynne med, på serveren lager vi en kommentert kontroller som publiserer en reaktiv strøm av Ansatt ressurs.

La oss lage vår kommenterte EmployeeController:

@RestController @RequestMapping ("/ ansatte") offentlig klasse EmployeeController {private final EmployeeRepository employeeRepository; // konstruktør ...}

Ansattes depot kan være et hvilket som helst datalager som støtter ikke-blokkerende reaktive strømmer.

5.1. Enkel ressurs

La oss lage et endepunkt i kontrolleren vår som publiserer en singel Ansattes ressurs:

@GetMapping ("/ {id}") privat Mono getEmployeeById (@PathVariable Streng-id) {retur medarbeiderRepository.findEmployeeById (id); }

Vi pakker inn en singel Ansatt ressurs i en Mono fordi vi maksimalt returnerer en ansatt.

5.2. Samlingsressurs

La oss også legge til et sluttpunkt som publiserer samlingsressursen til alle Ansatte:

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

For innsamlingsressursen bruker vi a Flux av typen Ansatt - siden det er forlaget for 0..n elementer.

6. Reaktiv nettklient

WebClient introdusert våren 5 er en ikke-blokkerende klient med støtte for reaktive strømmer.

Vi kan bruke WebClient for å opprette en klient for å hente data fra sluttpunktene som tilbys av EmployeeController.

La oss lage en enkel EmployeeWebClient:

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

Her har vi laget en WebClient ved hjelp av fabrikkmetoden skape. Det vil peke på lokal vert: 8080 slik at vi kan bruke eller relative URL-er for samtaler foretatt av denne klientforekomsten.

6.1. Henter en enkelt ressurs

Å hente en enkelt ressurs av typen Mono fra endepunktet /Ansatt ID}:

Mono-ansattMono = client.get () .uri ("/ ansatte / {id}", "1") .hent () .bodyToMono (ansatt.klasse); medarbeiderMono.abonnement (System.out :: println);

6.2. Henter en samlingsressurs

Tilsvarende for å hente en samlingsressurs av typen Flux fra endepunktet / ansatte:

Flux medarbeiderFlux = client.get () .uri ("/ ansatte") .hent () .bodyToFlux (ansatt.klasse); employeeFlux.subscribe (System.out :: println);

Vi har også en detaljert artikkel om konfigurering og arbeid med WebClient.

7. Våren WebFlux Security

Vi kan bruke Spring Security for å sikre våre reaktive endepunkter.

La oss anta at vi har et nytt endepunkt i vårt EmployeeController. Dette endepunktet oppdateres Ansatt detaljer og sender det oppdaterte tilbake Ansatt.

Siden dette tillater brukere å endre eksisterende ansatte, vil vi begrense dette endepunktet til ADMIN bare rollebrukere.

La oss legge til en ny metode i vår EmployeeController:

@PostMapping ("/ update") privat Mono updateEmployee (@RequestBody Employee ansatte) {return medarbeiderRepository.updateMedarbeider (ansatt); }

Nå, for å begrense tilgangen til denne metoden, la oss lage SecurityConfig og definere noen banebaserte regler for bare å tillate ADMIN-brukere:

@EnableWebFluxSecurity offentlig klasse EmployeeWebSecurityConfig {// ... @Bean public SecurityWebFilterChain springSecurityFilterChain (ServerHttpSecurity http) {http.csrf (). Disable () .authorizeExchange () .pathMatchers (HttpMethod.POST, /). ("ADMIN") .pathMatchers ("/ **"). PermitAll () .and () .httpBasic (); returner http.build (); }}

Denne konfigurasjonen vil begrense tilgangen til sluttpunktet / ansatte / oppdatering. Derfor er det bare brukere som har en rolle ADMIN vil kunne få tilgang til dette endepunktet og oppdatere et eksisterende Ansatt.

Endelig kommentaren @EnableWebFluxSecurity legger til Spring Security WebFlux-støtte med noen standardkonfigurasjoner.

Vi har også en detaljert artikkel om konfigurering og samarbeid med Spring WebFlux-sikkerhet.

8. Konklusjon

I denne artikkelen har vi utforsket hvordan du oppretter og jobber med reaktive webkomponenter som støttet av Spring WebFlux-rammeverket. Som et eksempel har vi bygget et lite Reactive REST-program.

Vi lærte å bruke RestController og WebClient å publisere og konsumere reaktive strømmer.

Vi så også på hvordan vi kan skape et sikret reaktivt endepunkt ved hjelp av Spring Security.

Annet enn reaktivt RestController og WebClient, den WebFlux rammeverk støtter også reaktive WebSocket og det tilsvarende WebSocketClient for stikkontaktstilstrømming av reaktive strømmer.

Vi har en detaljert artikkel som fokuserer på å jobbe med Reactive WebSocket med Spring 5.

Til slutt er den komplette kildekoden som brukes i denne opplæringen, tilgjengelig på Github.


$config[zx-auto] not found$config[zx-overlay] not found