该文参考点这里
一、背景
最近看spring boot的时候,看到了Spring5.0支持Webflux,这个对我算是一个比较新鲜的东西。从这里面了解到一种新的编成思想Reactive 编程
Reactive 编程: 一种异步编程的示范,这种示范与数据流式处理以及变化传播相关联,同时也经常被面向对象语言表示,作为一种观察者模式的扩展。
目前实现该编成的有三种:
- Reactor(webflux)
- RxJava
- java8的Stream
上面三种技术都有一些核心的类
- CompletableFuture(Java 8)
- Stream(Java 8)
- Optional(Java 8)
- Observable (RxJava 1)
- Observable (RxJava 2)
- Flowable (RxJava 2)
- Flux (Reactor Core)
其中Rxjava在安卓端使用较多,而spring5.0开始采用flux来实现。
后面我会分别写三个博客来分别介绍使用。
二、定义
通过异步和数据流来构建事务关系的编程模型
比如界面上有三个部分
- 按钮列表(不同权限显示不同的按钮列表)
- 表格数据部分
- 广告部分(一个随机的广告)
只有这三个全部都取得到数据,才能展示一个完整的页面。而且按钮、表格、广告都是相互独立的。(可能有的人会想到我用ajax分别请求三个接口,就行了,其实这个例子很简单,可以这样,如果逻辑复杂,ajax根本满足不了)
2.1 事务
事务简单来说就是:一段业务逻辑
比如上面的获取按钮列表逻辑、获取表格数据逻辑等。
2.2 事务关系
就是业务之间实际的关系,这个例子很简单,三个不同的事务之间没有联系,但是整个页面展示是需要这三个同时完成才能有关系.上面是三个最简单的关系。
2.3 异步
因为按钮、表格数据、广告三个事务,是三个独立的关系,如果我们顺序调用获取数据,反而不能反映真实的关系。正确的步骤应该三个事务应该独立运行在各自的线程,然后在汇总起来,饭后形成页面。
2.4 数据流
这里引用博客里面里面的一句话:
实际上,数据流只是事务之间沟通的桥梁。
比如在页面显示中,获取按钮,获取表格数据,获取广告这些业务完成之后才会去安排构建页面显示的操作,那么这些上游的业务在自己工作完成之后,就需要通知下游,通知下游的方式有很多种,其中最棒的的方式就是通过数据(事件)流。每一个业务完成后,都会有一条数据(一个事件)流向下游,下游的业务收到这条数据(这个事件),才会开始自己的工作。
总结:
总的来说,异步和数据流都是为了正确的构建事务的关系而存在的。只不过,异步是为了区分出无关的事务,而数据流(事件流)是为了联系起有关的事务。
三、伪实现
- 建立一个新线程,去获取按钮数据
- 建立一个新线程,去获取表格数据
- 建立一个新线程,去获取广告数据
- 将三个线程数据拼装,然后就行页面显示
理论上讲,遵照业务关系运行的代码在执行效率上是最优的。