Skip to main content
 首页 » 编程设计

Spring 5 WebFlux入门教程

2022年07月19日146lonelyxmas

WebFlux是Spring 5 新增特性,提供响应式web应用。本文我们利用RestController 和 WebClient组件实现简单的响应式Restful应用。

Spring WebFlux Framework

WebFlux内部使用Project Rector并实现了——Flux 和 Mono 。新的框架支持两种编程模型:

  • 基于注解方式响应式组件
  • 函数式路由和处理

本文聚焦基于注解响应式组件。

我们需要增加 spring-boot-starter-webflux 依赖,它自动拉取其他依赖:

  • spring-bootspring-boot-starter
  • spring-webflux
  • reactor-corereactor-netty
<dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-webflux</artifactId> 
    <version>2.2.6.RELEASE</version> 
</dependency> 

Reactive REST 应用示例

下面我们构建简单Reactive REST员工管理应用,使用 Spring WebFlux:

  • 使用简单领域对象——Employee ,包括id 和name
  • 使用RestController 构建Rest api ,发布 Employee资源,单个资源和列表资源
  • 使用WebClient作为客户端获取资源
  • WebFlux 和 Spring Security 保护响应式请求

响应式RestController

WebFlux 支持注解方式配置,与Spring Web mvc框架一样。我们在服务端创建注解Controller发布响应式Employee资源流。

@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对象集合:

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

对于集合资源,使用Flux,返回0 或 n个元素。

响应式 WebClient

WebClient 是Spring 5 引入支持响应式流的非阻塞客户端。我们可以使用WebClient创建客户端,从EmployeeController请求获取数据:

public class EmployeeWebClient {
    
 
    WebClient client = WebClient.create("http://localhost:8080"); 
 
    // ... 
} 

上面使用create方法创建WebClient ,它执行 localhost:8080 ,因此我们可以使用相对路径调用请求。

返回单个资源

/employees/{id} 请求路径获取Mono类型的单个资源:

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

返回集合资源

类似 /employees路径返回集合资源:

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

WebFlux 安全管理

可以使用Spring Security 保护响应式请求。我们继续再EmployeeController中增加更新请求,让用户可以对已存在的员工进行更新操作,但该操作仅由管理员角色可以使用。首先增加新的方法:

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

创建SecurityConfig ,定义基于路径的访问规则,仅容许ADMIN角色执行更新请求:

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

上面示例只有管理员用户可以执行操作,最后使用 @EnableWebFluxSecurity 注解增加 Spring Security WebFlux的缺省配置。

总结

本文通过示例展示如何创建Spring WebFlux 框架支持的响应式web应用。


本文参考链接:https://blog.csdn.net/neweastsun/article/details/118071920