Sprievodca jarom 5 WebFlux

1. Prehľad

Spring WebFlux je súčasťou jari 5 a poskytuje podporu reaktívneho programovania pre webové aplikácie.

V tomto tutoriáli vytvoríme malú reaktívnu aplikáciu REST pomocou reaktívnych webových komponentov RestController a Webový klient.

Taktiež sa pozrieme na to, ako zabezpečiť naše reaktívne koncové body pomocou jarnej bezpečnosti.

2. Jarný rámec WebFlux

Jarný WebFlux interne využíva Project Reactor a implementácie jeho vydavateľov - Flux a Mono.

Nový rámec podporuje dva programovacie modely:

  • Reaktívne komponenty založené na anotáciách
  • Funkčné smerovanie a manipulácia

Zameriame sa na reaktívne komponenty založené na anotáciách, pretože funkčný štýl - smerovanie a manipuláciu sme už preskúmali v inom návode.

3. Závislosti

Začnime s spring-boot-starter-webflux závislosť, ktorá stiahne všetky ďalšie požadované závislosti:

  • pružinová topánka a štartér s pružinou pre základné nastavenie aplikácie Spring Boot
  • spring-webflux rámec
  • reaktorové jadro že potrebujeme reaktívne prúdy a tiež reaktor-netty
 org.springframework.boot spring-boot-starter-webflux 2.2.6.RELEASE 

Najnovší spring-boot-starter-webflux si môžete stiahnuť z Maven Central.

4. Reaktívna aplikácia REST

Teraz zostavíme veľmi jednoduchý reaktívny REST Zamestnanecké riadenie aplikácia - pomocou Spring WebFlux:

  • Použijeme jednoduchý model domény - Zamestnanec s id a a názov lúka
  • Vytvoríme rozhranie REST API s RestController publikovať Zamestnanec zdroje ako jeden zdroj a ako zbierka
  • Budeme budovať klienta s Webový klient na získanie rovnakého zdroja
  • Vytvoríme zabezpečený reaktívny koncový bod pomocou WebFlux a jarná bezpečnosť

5. Reaktívne RestController

Jarný WebFlux podporuje konfigurácie založené na anotáciách rovnakým spôsobom ako rámec Spring Web MVC.

Začať s, na serveri vytvoríme anotovaný radič, ktorý publikuje reaktívny prúd súboru Zamestnanec zdroj.

Vytvorme náš anotovaný EmployeeController:

@RestController @RequestMapping ("/ zamestnanci") verejná trieda EmployeeController {private final EmployeeRepository employeeRepository; // konštruktor ...}

Úložisko zamestnancov môže to byť akékoľvek úložisko dát, ktoré podporuje neblokujúce reaktívne toky.

5.1. Jeden zdroj

Vytvorme v našom kontrolóri koncový bod, ktorý zverejní jeden Zdroj zamestnancov:

@GetMapping ("/ {id}") súkromné ​​Mono getEmployeeById (@PathVariable ID reťazca) {return employeeRepository.findEmployeeById (id); }

Zbalíme single Zamestnanec zdroj v a Mono pretože vraciame najviac jedného zamestnanca.

5.2. Zdroj zbierky

Pridajme tiež koncový bod, ktorý publikuje zdroj zhromažďovania všetkých Zamestnanci:

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

Ako zdroj zhromažďovania používame a Flux typu Zamestnanec - keďže je to vydavateľ pre 0..n prvky.

6. Reaktívny webový klient

Webový klient predstavený na jar 5 je neblokujúci klient s podporou reaktívnych prúdov.

Môžeme použiť Webový klient vytvoriť klienta na načítanie údajov z koncových bodov poskytovaných EmployeeController.

Vytvorme jednoduchý EmployeeWebClient:

verejná trieda EmployeeWebClient {WebClient client = WebClient.create ("// localhost: 8080"); // ...}

Tu sme vytvorili a Webový klient pomocou svojej továrenskej metódy vytvoriť. Ukáže to na localhost: 8080 takže môžeme použiť alebo relatívne adresy URL pre hovory uskutočnené touto inštanciou klienta.

6.1. Načítanie jedného zdroja

Na získanie jedného prostriedku typu Mono z koncového bodu /zamestnanecké ID}:

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

6.2. Získanie zdroja zbierky

Podobne, na získanie prostriedku kolekcie typu Flux z koncového bodu zamestnanci:

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

Máme tiež podrobný článok o nastavení a práci s WebClient.

7. Jarné zabezpečenie WebFlux

Na zabezpečenie našich reaktívnych koncových bodov môžeme použiť Spring Security.

Predpokladajme, že máme nový koncový bod v našom EmployeeController. Tento koncový bod sa aktualizuje Zamestnanec podrobnosti a pošle späť aktualizované Zamestnanec.

Pretože to umožňuje používateľom meniť existujúcich zamestnancov, chceme tento koncový bod obmedziť na SPRÁVCA iba používatelia rolí.

Pridajme do našej novú metódu EmployeeController:

@PostMapping ("/ update") private Mono updateEmployee (@RequestBody zamestnanec zamestnanec) {return employeeRepository.updateEmployee (zamestnanec); }

Teraz, aby sme obmedzili prístup k tejto metóde, poďme vytvoriť SecurityConfig a definovať niektoré pravidlá založené na ceste, aby povolili iba používateľov ADMIN:

@EnableWebFluxSecurity verejná trieda EmployeeWebSecurityConfig {// ... @Bean public SecurityWebFilterChain springSecurityFilterChain (ServerHttpSecurity http) {http.csrf (). Deaktivovať () .authorizeExchange () .pathMatchers (HttpMethod.POST, "HttpMethod.POST," ("ADMIN") .pathMatchers ("/ **"). PermitAll (). A () .httpBasic (); vrátiť http.build (); }}

Táto konfigurácia obmedzí prístup ku koncovému bodu / zamestnanci / aktualizácia. Preto majú úlohu iba používatelia SPRÁVCA bude mať prístup k tomuto koncovému bodu a bude môcť aktualizovať existujúci Zamestnanec.

Na záver anotácia @EnableWebFluxSecurity pridáva podporu Spring Security WebFlux s niektorými predvolenými konfiguráciami.

Máme tiež podrobný článok o konfigurácii a práci so zabezpečením Spring WebFlux.

8. Záver

V tomto článku sme sa zaoberali tým, ako vytvárať a pracovať s reaktívnymi webovými komponentmi, ako ich podporuje jarný rámec WebFlux. Ako príklad sme vytvorili malú aplikáciu Reactive REST.

Naučili sme sa, ako používať RestController a Webový klient publikovať a spotrebovať reaktívne prúdy.

Pozreli sme sa tiež na to, ako vytvoriť zabezpečený reaktívny koncový bod pomocou jarnej bezpečnosti.

Iné ako reaktívne RestController a Webový klient, WebFlux rámec podporuje aj reaktívne WebSocket a prisl WebSocketClient pre streamovanie reaktívnych prúdov v štýle zásuvky.

Máme podrobný článok zameraný na prácu s Reactive WebSocket s jarom 5.

Nakoniec je celý zdrojový kód použitý v tomto návode k dispozícii na stránkach Github.


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