ch13-反应式编程基础
两种不同的编程范式
- 命令式编程,imperative
- 反应式编程,Reactive Programming
Reactive Programming解决什么问题
- IO密集型场景
- 同步阻塞模型,阻塞线程多,CPU利用率不高,性能下降
- 管理多线程,意味着更高的复杂性
- 学习文档
- 剖析Reactor 模型: https://mp.weixin.qq.com/s?__biz=MzIwNDAyOTI2Nw==&mid=2247483716&idx=1&sn=91e7c3f7a46b6d054b8a938cefd3120d&chksm=96c72d78a1b0a46e6f3058c6c895496caab199184376d817a310fbd73620d55dd2bbc434b8d1&token= 1026451003&lang=zh_CN#rd
- Java NIO 底层原理:https://www.toutiao.com/article/6887439886178058759/
- Netty介绍:https://www.zhihu.com/question/607575828/answer/3157903032

Reactor
1 | <dependency> |
- Reactive Streams:Netflix、Lightbend和Pirotal于2013年开始制定的一种规范,旨在提供无阻塞回压的异步 流处理标准
- Reactor:Spring Pivotal团队提供的响应式编程的Java实现,其它类似实现:RxJava
- 函数式、声明式,描述数据会流经的管道或流
- Spring WebFlux:启用基于响应式编程的Web应用程序的开发。提供类似于Spring MVC的编程模型
Java的stream与反应式的流区别
- Java的stream通常都是同步的,并且只能处理有限的数据集,本质上来说,它们只是使用函数来 对集合进行迭代的一种方式
- JDK9中的 Flow API对应反应式流

反应式流规范定义的4个接口(重要)
- org.reactivestreams.*
- Publisher:数据发布者
- Subscriber:数据订阅者
- Processor:处理器
- Subscription:协调
处理过程是异步的
消费者驱动,消费者去请求发布者才会发布数据


反应式流图(Flux)

反应式流图(Mono)

两个基本概念:Flux 和 Mono
- Flux:包含 0 到 N 个元素的异步序列
- Mono:包含 0 或者 1 个元素的异步序列
- 消息:正常的包含元素的消息、序列结束的消息和序列出错的消息
- 操作符(Operator):对流上元素的操作
操作类型
- 创建操作
- 组合操作
- 转换操作
- 逻辑操作
创建Flux
- Flux的静态方法
- 根据对象创建,just方法
- 根据集成创建,数组、Iterable、Java Stream
- range
- interval

1 | package reactorfun; |
组合Flux 流
- mergeWith
- zip 自己决定如何合并
- zip,提供合并函数
- first 取两个流里面最先有的数据


1 | package reactorfun; |
过滤Flux流2
- skip:指定个数/时间
- take:指定个数/时间
- filter,需要提供Predicate
- distinct,只发布源Flux中尚未发布过的数据项

转换Flux流1
- map
- 同步
- 返回具体值
- flatMap
- 异步
- 转换出来的返回结果还是一个流(Mono/Flux)
- 可以并发处理,指定用哪个并发模型处理
- 多个流并发处理结果合并成一个流,但结果顺序不可控+
- 扁平化
- 并发模型(Schedulers方法)
- .immediate()
- .single()
- .newSingle()
- .elastic()
- .parallel()

转换Flux流2
- buffer,缓冲数据,bufferAndFlatMap
- collectList,同:buffer不带参数则缓冲所有数据到列表
- collectMap,需要提供生成key的函数

1 | package reactorfun; |
1 | package reactorfun; |
对流执行逻辑操作
- all,需要提供Predicate函数,注意返回类型Mono
- any,需要提供Predicate函数,注意返回类型Mono

缓冲
- buffer,缓冲数据,bufferAndFlatMap
- collectList,同:buffer不带参数则缓冲所有数据到列表
- collectMap,需要提供生成key的函数
