soul源码阅读(二十)响应式编程学习

 

 

目录

概念了解

工具以及框架

mono了解以及示例运行

flux和mono区别

soul源码解读

总结


概念了解

什么是响应式编程?

英文全称叫Reactive Programming,简称PR。

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

看完上面的介绍,完全不知道是啥。

再来看一个介绍:响应式编程来源于数据流和变化的传播,意味着由底层的执行模型负责通过数据流来自动传播变化。比如求值一个简单的表达式 c=a+b,当 a 或者 b 的值发生变化时,传统的编程范式需要对 a+b 进行重新计算来得到 c 的值。如果使用反应式编程,当 a 或者 b 的值发生变化时,c 的值会自动更新。

这段介绍通俗易懂,再来看一个比较详细的说明:https://blog.csdn.net/get_set/article/details/79455258,这篇文章用一个具体某电商网站下订单的例子介绍了啥是响应式编程。

工具以及框架

那么具有响应式编程工具包或者框架有哪些呢?

RxJava,Spring Reactor,Akka和Vert.x等。RxJava和Spring Reactor是java编程中用的比较多的第三方拓展,java8也内置了一些响应式编程,但不太好用。而 Akka和Vert.x是通常用于构建响应式系统的框架。

RxJava是第一个完整的 Java 反应工具 。 在遥远的2009年,Erik Meijer引入了Reactive Extensions这种新的编程风格,该Reactive Extensions是作为Microsoft库的集合实现的,这些库通过默认使用.NET 4.0的可观察序列来创建异步和事件驱动的程序。 很快,Rx.NET赢得了开发人员的热爱,并且全世界看到了其他实现:RxJava(2014年11月),RxSwift,RxScala,RxJS,Rx.Kotlin等。RxJava2.0从零开始重新编写了Reactive Streams规范,并添加了新的类型。数据生产者介绍。

2013年,世界上第一次看到Spring Reactor 。它与RxJava非常相似,并且代表Spring 5的API实现。

接下来对Spring Reactor做下详细介绍:

Reactor 框架主要有两个主要的模块:reactor-core 和 reactor-ipc。前者主要负责 Reactive Programming 相关的核心 API 的实现,后者负责高性能网络通信的实现,目前是基于 Netty 实现的。

在 Reactor 中,经常使用的类并不是很多,主要有以下两个:

  • Mono 实现了 org.reactivestreams.Publisher 接口,代表0到1个元素的发布者。
  • Flux 同样实现了 org.reactivestreams.Publisher 接口,代表0到N个元素的发表者。

mono了解以及示例运行

首先看下Mono这个类的方法,太多了,我截取部分如下:

接下来我们对常用的一些方法做下分析介绍:

just(),创建对象

empty(),创建一个不包含任何元素,只发布结束消息的序列

error(),抛出异常

defer(),懒加载处理

简单demo如下:

 @Test
    public void test() throws InterruptedException {
        Mono<Date> mono1 = Mono.just(new Date());
        Mono<Date> mono2 = Mono.defer(()-> Mono.just(new Date()));
        Thread.sleep(5000);
        mono1.subscribe(System.out::println);
        mono2.subscribe(System.out::println);


    }

结果如下:

可以看到mono1是在Mono.just的时候就已经加载new Date()对象了,而mono2是在Thread.sleep(5000)后订阅的时候才执行对象,所以defer是类似懒汉式的设计模式,用到才加载。

flux和mono区别

Flux 和 Mono 是 Reactor 中的两个基本概念。Flux 表示的是包含 0 到 N 个元素的异步序列。在该序列中可以包含三种不同类型的消息通知:正常的包含元素的消息、序列结束的消息和序列出错的消息。当消息通知产生时,订阅者中对应的方法 onNext(), onComplete()和 onError()会被调用。Mono 表示的是包含 0 或者 1 个元素的异步序列。该序列中同样可以包含与 Flux 相同的三种类型的消息通知。Flux 和 Mono 之间可以进行转换。对一个 Flux 序列进行计数操作,得到的结果是一个 Mono对象。把两个 Mono 序列合并在一起,得到的是一个 Flux 对象。

soul源码解读

插件链执行这个位置用了Mono对象进行处理,excute开始执行,会调起一个defer方法处理各个插件逻辑,处理完后调用Mono.empty()结束消息。

总结

以上只是对响应式编程做了简单了解,具体使用跟场景考虑还需要进一步了解。在这里做下整个soul学习的总结,通过将近一个月的学习,我们学习了学习源码的方法论,阅读了soul优秀的设计模式与优雅的源码编写,还认识了一批志同道合的同学,一个月说长不长,因为我给自己罗列的以下任务都还没完成:

1、spi学习

2、http数据同步源码阅读

3、编写一些单元测试等

但确实收获了不少,在这里先给这一期的源码学习画个句号,下一期继续。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值