概念

面向数据流和变化传播的编程范式。
这意味着可以在编程语言中很方便地表达静态或动态的数据流,而相关的计算模型会自动将变化的值通过数据流进行传播。

响应式编程是基于异步和事件驱动的非阻塞程序,只需要在程序内启动少量线程扩展,而不是水平通过集群扩展。

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 风格的路由和处理
​📃 Spring WebFlux 响应式web支持 - 图1

如图所示,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这门技术
​📃 Spring WebFlux 响应式web支持 - 图2

快速上手

添加 webflux 依赖

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-webflux</artifactId>
  4. </dependency>

​📃 Spring WebFlux 响应式web支持 - 图3
通过 IEDA 的依赖关系图我们可以发现spring-boot-starter-webflux依赖于spring-webflux、Reactor 和 Netty 相关依赖包。

创建 Controller

  1. @RestController
  2. public class HelloController {
  3. @GetMapping("/hello")
  4. public Mono<String> hello() {
  5. return Mono.just("Welcome to reactive world ~");
  6. }
  7. }

通过上面的示例可以发现,开发模式和之前 Spring Mvc 的模式差别不是很大,只是在方法的返回值上有所区别。

  • just() 方法可以指定序列中包含的全部元素。
  • 响应式编程的返回值必须是 Flux 或者 Mono ,两者之间可以相互转换。

测试类

相关链接:纯洁的微笑 必看