概念
面向数据流和变化传播的编程范式。
这意味着可以在编程语言中很方便地表达静态或动态的数据流,而相关的计算模型会自动将变化的值通过数据流进行传播。
响应式编程是基于异步和事件驱动的非阻塞程序,只需要在程序内启动少量线程扩展,而不是水平通过集群扩展。
Reactor
Reactor 是一个基于 JVM 之上的异步应用基础库.
基于事件和数据驱动应用的抽象库.
两个非常重要的概念 Flux 和 Mono
Flux
0 到 N 个元素的异步序列
三种不同类型的消息通知:正常的包含元素的消息、序列结束的消息、序列出错的消息。
消息通知—订阅者: onNext()、onComplete()、onError()**
Mono
0 或者 1 个元素的异步序列,消息通知相同 ,Flux 和 Mono 之间可以进行转换
对一个 Flux 序列进行计数操作,得到的结果是一个 Mono对象。把两个 Mono 序列合并在一起,得到的是一个 Flux 对象。
基于注解的 @Controller 和其他注解也支持 Spring MVC
Functional 、Java 8 lambda 风格的路由和处理
如图所示,WebFlux 模块从上到下依次是 Router Functions、WebFlux、Reactive Streams 三个新组件。
- Router Functions 对标准的 @Controller,@RequestMapping 等的 Spring MVC 注解,提供一套 函数式风格的 API,用于创建 Router、Handler 和Filter。
- WebFlux 核心组件,协调上下游各个组件提供 响应式编程 支持。
- Reactive Streams 一种支持 背压 (Backpressure) 的 异步数据流处理标准,主流实现有 RxJava 和 Reactor,Spring WebFlux 集成的是 Reactor。
值得注意的是:支持 reactive 编程的数据库只有 MongoDB, redis, Cassandra, Couchbase
webflux应用场景
适合IO密集型、磁盘IO密集、网络IO密集等服务场景,比如微服务网关,就可以使用webflux技术来显著的提升网关对下游服务的吞吐量,spring cloud gateway就使用了webflux这门技术
快速上手
添加 webflux 依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
通过 IEDA 的依赖关系图我们可以发现spring-boot-starter-webflux
依赖于spring-webflux
、Reactor 和 Netty 相关依赖包。
创建 Controller
@RestController
public class HelloController {
@GetMapping("/hello")
public Mono<String> hello() {
return Mono.just("Welcome to reactive world ~");
}
}
通过上面的示例可以发现,开发模式和之前 Spring Mvc 的模式差别不是很大,只是在方法的返回值上有所区别。
just()
方法可以指定序列中包含的全部元素。- 响应式编程的返回值必须是 Flux 或者 Mono ,两者之间可以相互转换。
测试类