响应式编程范式为开发高性能 Web 应用带来了新的机会和挑战。Spring 5 中的 WebFlux 模块可以作为开发响应式 Web 应用的基础。由于 Spring 框架的流行,WebFlux 会成为开发 Web 应用的重要趋势之一。
在进行WebFlux开发之前,我们需要先了解WebFlux以及什么是响应式编程。
WebFlux使用异步非阻塞的方式,可以极大地提高系统的吞吐量。WebFlux只能运行在 Servlet 3.1+ 容器,因为3.1 规范其中一个新特性是异步处理支持。Spring Boot 2是基于Spring 5构建而成,因此只有在Spring Boot 2.x 中才能使用WebFlux 。WebFlux 支持的容器有 Tomcat、Jetty(Non-Blocking IO API) ,也可以像 Netty 和 Undertow 的本身就支持异步容器。在容器中 Spring WebFlux 会将输入流适配成 Mono 或者 Flux 格式进行统一处理。
WebFlux中的Flux和Mono
- Flux 和 Mono 是 Reactor 中的两个基本概念。Flux 表示的是包含 0 到 N 个元素的异步序列。在该序列中可以包含三种不同类型的消息通知:正常的包含元素的消息、序列结束的消息和序列出错的消息。当消息通知产生时,订阅者中对应的方法 onNext(), onComplete()和 onError()会被调用。
Mono 表示的是包含 0 或者 1 个元素的异步序列。该序列中同样可以包含与 Flux 相同的三种类型的消息通知。Flux 和 Mono 之间可以进行转换。对一个 Flux 序列进行计数操作,得到的结果是一个 Mono对象。把两个 Mono 序列合并在一起,得到的是一个 Flux 对象。
响应式编程是基于异步和事件驱动的非阻塞程序,在响应式程序收到前端发送的请求之后,会将这个请求交由其他的线程去执行,当执行完成之后再异步通知给前端。
例如,在以往的编程方式中,定义了一个变量a=b+c。b和c在以后的程序中发生了变化,但是a的值却还是开始的值;但是在响应式编程中a的值却依然可以根据b和c进行改变。
在本小节中,我们将使用与以往Spring MVC不同的方式,以WebFlux在Spring Boot 2中构建一套restful接口。
首先搭建一个Spring Boot 2项目。在pom.xml中引入依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
新建controller文件夹,在controller文件夹下新建UserRestController.java
package com.xyh.webflux.controller;
import com.xyh.webflux.model.User;
import com.xyh.webflux.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
@RestController
@RequestMapping(value = "/user")
public class UserRestController {
@RequestMapping(method = RequestMethod.GET)
public Mono<String> findAllUser() {
return Mono.just("Hello World");
}
}
启动项目,在浏览器中输入localhost:8080/user,可以看到"Hello World"字样。说明我们确实用了一种与以往不同的方式实现了一个更加强大的接口。但这只是一个最简单的例子,WebFlux能实现的远不止于此,接下来我们将继续深入探究WebFlux的更多强大的功能。