Vodič za Spring 5 WebFlux

1. Pregled

Spring WebFlux dio je Spring 5 i pruža reaktivnu podršku za programiranje web aplikacija.

U ovom uputstvu stvorit ćemo malu reaktivnu REST aplikaciju pomoću reaktivnih web komponenata RestController i WebClient.

Također ćemo razmotriti kako osigurati svoje reaktivne krajnje točke pomoću Spring Securitya.

2. Proljetni WebFlux okvir

Spring WebFlux interno koristi Project Reactor i njegove implementacije izdavača - Fluks i Mono.

Novi okvir podržava dva programska modela:

  • Reaktivne komponente temeljene na bilješkama
  • Funkcionalno usmjeravanje i rukovanje

Usredotočit ćemo se na reaktivne komponente temeljene na napomenama, jer smo već istraživali funkcionalni stil - usmjeravanje i rukovanje u drugom vodiču.

3. Ovisnosti

Počnimo s spring-boot-starter-webflux ovisnost, koja povlači sve ostale potrebne ovisnosti:

  • opruga-čizma i opruga-čizma-starter za osnovno postavljanje aplikacije Spring Boot
  • proljeće-webtok okvir
  • jezgra reaktora da su nam potrebni reaktivni tokovi i također reaktor-mreža
 org.springframework.boot spring-boot-starter-webflux 2.2.6.OSLOBODI 

Najnoviji proljetni boot-starter-webflux možete preuzeti s Maven Central.

4. Primjena reaktivnog odmora

Sada ćemo izgraditi vrlo jednostavan reaktivni REST Upravljanje zaposlenicima aplikacija - koristeći Spring WebFlux:

  • Koristit ćemo jednostavan model domene - Zaposlenik s an iskaznica i a Ime polje
  • Izgradit ćemo REST API pomoću a RestController izdati Zaposlenik resurse kao jedan resurs i kao zbirku
  • Izgradit ćemo klijenta s WebClient za preuzimanje istog resursa
  • Stvorit ćemo sigurnu reaktivnu krajnju točku pomoću WebFlux i proljetna sigurnost

5. Reaktivni RestController

Spring WebFlux podržava konfiguracije temeljene na anotacijama na isti način kao Spring Web MVC okvir.

Početi sa, na poslužitelju stvaramo komentirani kontroler koji objavljuje reaktivni tok Zaposlenik resurs.

Stvorimo svoj bilješki EmployeeController:

@RestController @RequestMapping ("/ zaposlenici") javna klasa EmployeeController {privatni konačni EmployeeRepository workerRepository; // konstruktor ...}

Spremište zaposlenika može biti bilo koje spremište podataka koje podržava neblokirajuće reaktivne tokove.

5.1. Pojedinačni resurs

Stvorimo krajnju točku u našem kontroleru koja objavljuje jedan Resurs zaposlenika:

@GetMapping ("/ {id}") private Mono getEfficieeById (@PathVariable String id) {return workerRepository.findEfficieeById (id); }

Zamotamo jednu Zaposlenik resurs u a Mono jer vraćamo najviše jednog zaposlenika.

5.2. Resurs za prikupljanje

Dodajmo i krajnju točku koja objavljuje resurs prikupljanja svih Zaposlenici:

@GetMapping private Flux getAllEfficiees () {povratak workerRepository.findAllEfficiees (); }

Za izvor prikupljanja koristimo a Fluks tipa Zaposlenik - budući da je to izdavač za 0..n elementi.

6. Reaktivni web klijent

WebClient predstavljen u proljeće 5 je neblokirajući klijent s podrškom za reaktivne tokove.

Možemo koristiti WebClient stvoriti klijenta za preuzimanje podataka s krajnjih točaka koje pruža EmployeeController.

Stvorimo jednostavan EmployeeWebClient:

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

Ovdje smo stvorili WebClient koristeći svoju tvorničku metodu stvoriti. Ukazat će na lokalnihost: 8080 tako da možemo koristiti ili relativne URL-ove za pozive upućene ovom instancom klijenta.

6.1. Dohvaćanje jednog resursa

Da biste dohvatili jedan resurs tipa Mono od krajnje točke / zaposlenik / {id}:

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

6.2. Dohvaćanje resursa zbirke

Slično tome, za dohvaćanje resursa kolekcije tipa Fluks od krajnje točke / zaposlenici:

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

Također imamo detaljan članak o postavljanju i radu s WebClientom.

7. Proljetna sigurnost WebFlux-a

Spring Security možemo koristiti za osiguranje reaktivnih krajnjih točaka.

Pretpostavimo da imamo novu krajnju točku u svom EmployeeController. Ova se krajnja točka ažurira Zaposlenik detalje i šalje ažurirano Zaposlenik.

Budući da to korisnicima omogućuje promjenu postojećih zaposlenika, želimo ograničiti ovu krajnju točku na UPRAVNIK samo korisnici uloga.

Dodajmo novu metodu u našu EmployeeController:

@PostMapping ("/ update") privatno Mono updateE Employee (@RequestBody zaposlenik zaposlenika) {return workerRepository.updateEfficiee (zaposlenik); }

Sada, da ograničimo pristup ovoj metodi, kreirajmo SecurityConfig i definirajte neka pravila koja se temelje na putanji kako bi se omogućila samo ADMINISTARACIJA:

@EnableWebFluxSecurity javna klasa EmployeeWebSecurityConfig {// ... @Bean public SecurityWebFilterChain springSecurityFilterChain (ServerHttpSecurity http) {http.csrf (). Disable () .authorizeExchange () .pathMatchers (Httpes.Mod. ("ADMINISTRATOR") .pathMatchers ("/ **"). AllowAll () .and () .httpBasic (); vratiti http.build (); }}

Ova će konfiguracija ograničiti pristup krajnjoj točki / zaposlenici / ažuriranje. Stoga samo korisnici imaju ulogu UPRAVNIK moći će pristupiti ovoj krajnjoj točki i ažurirati postojeću Zaposlenik.

Napokon, napomena @EnableWebFluxSecurity dodaje Spring Security WebFlux podršku s nekim zadanim konfiguracijama.

Također imamo detaljan članak o konfiguriranju i radu sa zaštitom Spring WebFlux.

8. Zaključak

U ovom smo članku istražili kako stvoriti i raditi s reaktivnim web komponentama, što podržava Spring WebFlux framework. Kao primjer, izradili smo malu aplikaciju Reactive REST.

Naučili smo kako koristiti RestController i WebClient za objavljivanje i konzumiranje reaktivnih struja.

Također smo proučavali kako stvoriti osiguranu reaktivnu krajnju točku uz pomoć Spring Securitya.

Osim reaktivnog RestController i WebClient, WebFlux framework također podržava reaktivni WebSocket i odgovarajuće WebSocketClient za strujanje reaktivnih struja u stilu utičnice.

Imamo detaljan članak usredotočen na rad s Reactive WebSocketom s Spring 5.

Napokon, kompletan izvorni kod korišten u ovom vodiču dostupan je na Githubu.