首頁 > 軟體

Spring WebFlux的使用指南

2021-05-06 13:00:50

Spring WebFlux是spring5的一部分,它為web應用程式提供反應式程式設計支援。

在本教學中,我們將使用RestController和WebClient建立一個小型響應式REST應用程式。

我們還將研究如何使用Spring安全保護我們的反應端點。

Spring-WebFlux框架

Spring WebFlux在內部使用Project Reactor及其釋出者實現Flux和Mono。

新框架支援兩種程式設計模型:

  • 基於註釋的反應元件
  • 功能路由和處理

依賴項

讓我們從spring boot starter webflux依賴項開始,它包含所有其他必需的依賴項:

  • spring boot和spring boot starter,用於基本的spring boot應用程式設定
  • spring-webflux框架
  • reactor-core我們需要的反應流,也需要reactor-netty
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
    <version>2.2.6.RELEASE</version>
</dependency>

響應式應用

我們現在將使用Spring WebFlux構建一個非常簡單的REST EmployeeManagement應用程式:

  • 我們將使用一個簡單的域模型-帶有id和name欄位的Employee
  • 我們將使用RestController構建restapi,以將員工資源作為單個資源和集合釋出
  • 我們將使用WebClient構建一個使用者端來檢索相同的資源
  • 我們將使用WebFlux和Spring Security建立一個安全的被動端點

響應式RestController

springwebflux支援基於註釋的設定,方式與springwebmvc框架相同。

首先,在伺服器上,我們建立一個帶註釋的控制器,它釋出員工資源的反應流。

讓我們建立帶註釋的EmployeeController

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

    private final EmployeeRepository employeeRepository;
    
    // constructor...
}

EmployeeRepository可以是任何支援非阻塞反應流的資料儲存庫。

單一資源

讓我們在控制器中建立一個端點,用於釋出單個員工資源:

@GetMapping("/{id}")
private Mono<Employee> getEmployeeById(@PathVariable String id) {
    return employeeRepository.findEmployeeById(id);
}

我們在Mono中包裝一個Employee資源,因為我們最多返回一個Employee。

集合資源

我們還要新增一個端點來發布所有僱員的集合資源:

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

對於集合資源,我們使用型別為Employee的流量,因為它是0..n元素的釋出者。

反應式Web使用者端

Spring5中引入的WebClient是一個支援反應流的非阻塞使用者端。

我們可以使用WebClient建立一個使用者端,從EmployeeController提供的端點檢索資料。

讓我們建立一個簡單的EmployeeWebClient:

public class EmployeeWebClient {

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

    // ...
}

在這裡,我們使用工廠方法create建立了一個WebClient。它會指向localhost:8080,所以我們可以使用或相對的URL來呼叫這個使用者端範例。

檢索單個資源

要從endpoint/employee/{id}檢索Mono型別的單個資源,請執行以下操作:

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

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

檢索集合資源

類似地,要從endpoint/employees檢索Flux型別的集合資源,請執行以下操作:

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

Spring WebFlux安全性

我們可以使用Spring Security來保護我們的反應端點。

假設我們在EmployeeController中有一個新的端點。此端點更新員工詳細資訊並行回更新的員工。

由於這允許使用者更改現有員工,因此我們希望僅將此端點限制為管理員角色使用者。

讓我們為EmployeeController新增一個新方法:

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

現在,為了限制對該方法的存取,讓我們建立SecurityConfig並定義一些基於路徑的規則以僅允許管理員使用者:

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

此設定將限制對/employees/update的存取。因此,只有具有ADMIN角色的使用者才能存取此端點並更新現有員工。

最後,註解@EnableWebFluxSecurity新增了一些預設設定的Spring-Security-WebFlux支援。

結論

在本文中,我們探討了如何建立和使用springwebflux框架支援的反應式web元件。例如,我們構建了一個小型的REST應用程式。

除了Reactive RestController和WebClient之外,WebFlux框架還支援Reactive WebSocket和對應的WebSocketClient,以進行通訊端樣式的Reactive流。

最後,在Github上提供了本文中使用的完整原始碼:https://github.com/eugenp/tutorials/tree/master/spring-5-reactive-security

以上就是Spring WebFlux的使用指南的詳細內容,更多關於Spring WebFlux的使用的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com