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(由CompletableFuture
和ReactiveX推广)是一个福音。在编程模型级别,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。后续会集成更多的接口实现,有需要的请保存。