soul网关学习day05

今日目标

初步了解响应式编程

前一天的学习里有分析如何顺序触发调用插件,在那段代码里有个奇怪的调用 Mono.defer(() -> {})

return Mono.defer(() -> {
    if (this.index < plugins.size()) {
        。。。
        return plugin.execute(exchange, this);
    }
    return Mono.empty();
});

这个调用是干什么的呢,原来是响应式编程,soul也介绍自己是一个响应式API网关

异步的,高性能的,跨语言的,响应式的API网关

 

什么是响应式编程

 

响应式编程(reactive programming)是一种基于数据流(data stream)和变化传递(propagation of change)的声明式(declarative)的编程范式。

 

在WEB端的体现就是基于NIO,异步数据流处理+发布订阅

参考 https://www.cnblogs.com/yuanrw/p/10050509.html

响应式编程的基本模型如下

 

 

响应式编程的常用框架 webflux rxjava vert.x

soul的响应式编程基于webflux实现,下图是webflux的架构图

 

看起来,webflux的位置是等同于已有的基于servlet容器的同步的spring-mvc的,基于各自的应用场景不同可以选择使用

 

关键API

webflux是基于reactor的,在reactor中有两个关键角色,发布者和订阅者,前面提到代码里的Mono.defer(),Mono就是发布者,reactor的发布者有Mono和Flux两种

 

我们今天先看一下Mono.defer()实现了什么功能

参考 https://www.jianshu.com/p/611f3667c4d2

defer

每当对得到的Flux进行Subscription时,延迟提供Publisher,因此实际的源实例化被推迟,直到每个订阅和Supplier可以创建订阅者特定的实例。

但是,如果供应商没有生成新的实例,这个操作符将有效地从Publisher起作用。

 

我粗暴的理解为延迟加载,就是在Mono.defer里声明了一个逻辑,但是并不马上执行,直到有订阅者的时候才触发(关于执行阶段参考 https://www.jianshu.com/p/df395eb28f69,后续详细学习)

我们回到代码里,可以找到这个触发点

 

这里对前面提到的Mono.defer的结果进行了订阅

这个订阅的scheduler是reactor里的调度器,这个概念后面再继续学习

 

参考资料

 

https://www.cnblogs.com/yuanrw/p/10050509.html

https://www.cnblogs.com/YsirSun/p/12547550.html

https://stackoom.com/question/3mmb9/Mono-defer-%E5%81%9A%E4%BB%80%E4%B9%88

https://www.jianshu.com/p/611f3667c4d2

https://blog.csdn.net/john1337/article/details/104205774

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页