WebFlux

描述

Spring Framework 中包含的原始 Web 框架 Spring Web MVC 是专门为 Servlet API 和 Servlet 容器构建的。反应式堆栈 Web 框架 Spring WebFlux 是在 5.0 版本中添加的。它是完全非阻塞的,支持 Reactive Streams背压,并在 Netty、Undertow 和 Servlet 3.1+ 容器等服务器上运行。

官方文档: SpringWebFlux

概述

为什么创建 Spring WebFlux?

部分答案是需要一个非阻塞的 Web 堆栈来处理具有少量线程的并发并使用较少的硬件资源进行扩展。Servlet 3.1 确实为非阻塞 I/O 提供了 API。但是,使用它会远离 Servlet API 的其余部分,其中契约是同步 ( Filter, Servlet) 或阻塞 ( getParameter, getPart)。这是一个新的通用 API 作为任何非阻塞运行时的基础的动机。这很重要,因为服务器(例如 Netty)在异步、非阻塞空间中建立良好。

答案的另一部分是函数式编程。就像 Java 5 中添加注释创造了机会(例如带注释的 REST 控制器或单元测试)一样,Java 8 中添加的 lambda 表达式为 Java 中的函数式 API 创造了机会。这对于允许异步逻辑的声明式组合的非阻塞应用程序和延续式 API(由CompletableFutureReactiveX推广)是一个福音。在编程模型级别,Java 8 使 Spring WebFlux 能够提供功能性 Web 端点以及带注释的控制器。

并发模型

Spring MVC 和 Spring WebFlux 都支持带注释的控制器,但在并发模型和阻塞和线程的默认假设上有一个关键的区别。

在 Spring MVC(以及一般的 servlet 应用程序)中,假设应用程序可以阻塞当前线程(例如,用于远程调用)。出于这个原因,servlet 容器在请求处理期间使用一个大型线程池来吸收潜在的阻塞。

在 Spring WebFlux(以及一般的非阻塞服务器)中,假设应用程序不会阻塞。因此,非阻塞服务器使用一个小的、固定大小的线程池(事件循环工作者)来处理请求。

整合

pom.xml

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

yml配置: 加入 mybatis 操作数据库:

spring:
  datasource:
    username: root
    password: root
    url: jdbc:mysql://localhost/user?serverTimezone=UTC&useSSL=false&allowMultiQueries=true
    driver-class-name: com.mysql.cj.jdbc.Driver
## 服务端口
server:
  port: 8080

##扫描的xml 路径和 实体类
mybatis:
  mapper-locations: classpath:mapper/*Mapper.xml,
  type-aliases-package: com.example.springbootwebfluxintegrat.bean

UserController 控制层:

@Autowired
    private IUserService iUserService;

    /**
     * 获取用户信息:
     * @param userId
     * @return
     */
    @GetMapping("/getUser")
    public Mono<User> getUser(Integer userId) {
        return Mono.just(iUserService.getById(userId));
    }

    /**
     * 删除用户信息:
     * @param userId
     */
    @DeleteMapping("/deleteUser")
    public void deleteUser(Long userId) {
        iUserService.removeById(userId);
    }


    @GetMapping("list")
    public Flux<List<User>> list(){
        return Flux.just(iUserService.list());
    }


    /**
     * 分页列表查询:
     * @param page
     * @param rows
     * @return
     */
    @GetMapping("getPageUser")
    public Flux<IPage<User>> getPageUser(Integer page, Integer rows){
        Page<User> userPage = new Page<User>();
        userPage.setCurrent(page);
        userPage.setSize(rows);
        IPage<User> userIPage = iUserService.selectUserPage(userPage);
        return Flux.just(userIPage);
    }

实例代码在github上面需要的请自行拉取:spring-boot-integrate 然后后续会集成更多的模块进去,需要请点个star。后续会集成更多的接口实现,有需要的请保存。