一、前言
关于 响应式 Reactive,前面的两篇文章谈了不少概念,基本都离不开下面两点:
- 响应式编程是面向流的、异步化的开发方式
- 响应式是非常通用的概念,无论在前端领域、还是实时流、离线处理场景中都是适用的。
这次,我们把目光转向 SpringBoot,在SpringBoot 2.0版本之后,提供了对响应式编程的全面支持。因此在升级到 2.x版本之后,便能方便的实现事件驱动模型的后端编程,这其中离不开 webflux这个模块。其同时也被 Spring 5 用作开发响应式 web 应用的核心基础。那么, webflux 是一个怎样的东西?
Webflux
Webflux 模块的名称是 spring-webflux,名称中的 Flux 来源于 Reactor 中的类 Flux。该模块中包含了对 响应式 HTTP、服务器推送 和 WebSocket 的支持。
Webflux 支持两种不同的编程模型:
- 第一种是 Spring MVC 中使用的基于 Java 注解的方式,一个使用Reactive风格的Controller如下所示:
- 第二种是 基于 Java 8 的 lambda 表达式的函数式编程模型。
这两种编程模型只是在代码编写方式上存在不同,但底层的基础模块仍然是一样的。除此之外,Webflux 可以运行在支持 Servlet 3.1 非阻塞 IO API 的 Servlet 容器上,或是其他异步运行时环境,如 Netty 和 Undertow。
关于Webflux 与 SpringMVC 的区别,可以参考下图:
SpringBoot、Webflux、Reactor 可以说是层层包含的关系,其中,响应式能力的核心仍然是来自 Reactor组件。由此可见,掌握Reactor的用法 必然是熟练进行 Spring 响应式编程的重点。
二、 Mono 与 Flux
在理解响应式Web编程之前,我们需要对Reactor 两个核心概念做一些澄清,一个是Mono,另一个是Flux。
Flux 表示的是包含 0 到 N 个元素的异步序列。在该序列中可以包含三种不同类型的消息通知:
- 正常的包含元素的消息
- 序列结束的消息
- 序列出错的消息
当消息通知产生时,订阅者中对应的方法 onNext(), onComplete()和 onError()会被调用。
Mono 表示的是包含 0 或者 1 个元素的异步序列。该序列中同样可以包含与 Flux 相同的三种类型的消息通知。Flux 和 Mono 之间可以进行转换,比如对一个 Flux 序列进行计数操作,得到的结果是一个 Mono对象,或者把两个 Mono 序列合并在一起,得到的是一个 Flux 对象。
构造器
Reactor提供了非常方便的API来创建 Flux、Mono 对象,如下: