溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何正確的使用Spring WebFlux

發(fā)布時(shí)間:2021-05-06 16:21:13 來源:億速云 閱讀:273 作者:Leah 欄目:開發(fā)技術(shù)

如何正確的使用Spring WebFlux?相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。

Spring-WebFlux框架

Spring WebFlux在內(nèi)部使用Project Reactor及其發(fā)布者實(shí)現(xiàn)Flux和Mono。

新框架支持兩種編程模型:

  • 基于注釋的反應(yīng)元件

  • 功能路由和處理

依賴項(xiàng)

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

  • spring boot和spring boot starter,用于基本的spring boot應(yīng)用程序設(shè)置

  • spring-webflux框架

  • reactor-core我們需要的反應(yīng)流,也需要reactor-netty

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
    <version>2.2.6.RELEASE</version>
</dependency>

響應(yīng)式應(yīng)用

我們現(xiàn)在將使用Spring WebFlux構(gòu)建一個(gè)非常簡(jiǎn)單的REST EmployeeManagement應(yīng)用程序:

  • 我們將使用一個(gè)簡(jiǎn)單的域模型-帶有id和name字段的Employee

  • 我們將使用RestController構(gòu)建restapi,以將員工資源作為單個(gè)資源和集合發(fā)布

  • 我們將使用WebClient構(gòu)建一個(gè)客戶端來檢索相同的資源

  • 我們將使用WebFlux和Spring Security創(chuàng)建一個(gè)安全的被動(dòng)端點(diǎn)

響應(yīng)式RestController

springwebflux支持基于注釋的配置,方式與springwebmvc框架相同。

首先,在服務(wù)器上,我們創(chuàng)建一個(gè)帶注釋的控制器,它發(fā)布員工資源的反應(yīng)流。

讓我們創(chuàng)建帶注釋的EmployeeController

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

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

EmployeeRepository可以是任何支持非阻塞反應(yīng)流的數(shù)據(jù)存儲(chǔ)庫。

單一資源

讓我們?cè)诳刂破髦袆?chuàng)建一個(gè)端點(diǎn),用于發(fā)布單個(gè)員工資源:

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

我們?cè)贛ono中包裝一個(gè)Employee資源,因?yàn)槲覀冏疃喾祷匾粋€(gè)Employee。

集合資源

我們還要添加一個(gè)端點(diǎn)來發(fā)布所有雇員的集合資源:

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

對(duì)于集合資源,我們使用類型為Employee的流量,因?yàn)樗?..n元素的發(fā)布者。

反應(yīng)式Web客戶端

Spring5中引入的WebClient是一個(gè)支持反應(yīng)流的非阻塞客戶端。

我們可以使用WebClient創(chuàng)建一個(gè)客戶端,從EmployeeController提供的端點(diǎn)檢索數(shù)據(jù)。

讓我們創(chuàng)建一個(gè)簡(jiǎn)單的EmployeeWebClient:

public class EmployeeWebClient {

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

    // ...
}

在這里,我們使用工廠方法create創(chuàng)建了一個(gè)WebClient。它會(huì)指向localhost:8080,所以我們可以使用或相對(duì)的URL來調(diào)用這個(gè)客戶端實(shí)例。

檢索單個(gè)資源

要從endpoint/employee/{id}檢索Mono類型的單個(gè)資源,請(qǐng)執(zhí)行以下操作:

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

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

檢索集合資源

類似地,要從endpoint/employees檢索Flux類型的集合資源,請(qǐng)執(zhí)行以下操作:

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

Spring WebFlux安全性

我們可以使用Spring Security來保護(hù)我們的反應(yīng)端點(diǎn)。

假設(shè)我們?cè)贓mployeeController中有一個(gè)新的端點(diǎn)。此端點(diǎn)更新員工詳細(xì)信息并發(fā)回更新的員工。

由于這允許用戶更改現(xiàn)有員工,因此我們希望僅將此端點(diǎn)限制為管理員角色用戶。

讓我們?yōu)镋mployeeController添加一個(gè)新方法:

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

現(xiàn)在,為了限制對(duì)該方法的訪問,讓我們創(chuàng)建SecurityConfig并定義一些基于路徑的規(guī)則以僅允許管理員用戶:

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

看完上述內(nèi)容,你們掌握如何正確的使用Spring WebFlux的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI