聊聊Spring Reactor反应式编程

本文探讨了Spring的反应式编程库Reactor,解释了函数式编程和反应式编程的特点,如惰性计算、函数是第一等公民、事件驱动、实时响应和弹性机制。Reactor是基于Reactive Streams规范实现的,提供了Mono和Flux来处理单个和多个数据流。文章详细介绍了Reactor的创建、处理和消费阶段,并通过实例展示了如何在实际项目中使用Reactor进行并发执行和集合汇聚操作。
摘要由CSDN通过智能技术生成

前言

为了应对 高并发环境下 的服务端编程,微软提出了一个实现 异步编程 的方案 - Reactive Programming,中文名称 反应式编程。随后,其它技术也迅速地跟上了脚步,像 ES6 通过 Promise 引入了类似的异步编程方式。Java 社区也没有落后很多,NetflixTypeSafe 公司提供了 RxJavaAkka Stream 技术,让 Java 平台也有了能够实现反应式编程的框架。

正文

函数式编程

函数式编程是种编程方式,它将计算机的运算视为函数的计算。函数编程语言最重要的基础是 λ演算 (lambda calculus),而λ演算的函数可以接受函数当作 输入(参数)输出(返回值)lambda 表达式对与大多数程序员已经很熟悉了,jdk8 以及 es6都是引入的 lambda

函数式编程的特点

  • 惰性计算
  • 函数是“第一等公民”
  • 只使用表达式而不使用语句
  • 没有副作用

反应式编程

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

反应式编程的特点

1. 事件驱动

在一个 事件驱动 的应用程序中,组件之间的交互是通过松耦合的 生产者 (production)消费者 (consumption) 来实现的。这些事件是以 异步非阻塞 的方式发送和接收的。

事件驱动 的系统依靠 推模式 而不是 拉模式投票表决,即 生产者 是在有消息时才推送数据给 消费者,而不是通过一种浪费资源方式:让 消费者 不断地 轮询等待数据

2. 实时响应

程序发起执行以后,应该 快速 返回存储 结果的上下文,把具体执行交给 后台线程。待处理完成以后,异步地将 真实返回值 封装在此 上下文 中,而不是 阻塞 程序的执行。实时响应是通过 异步 编程实现的,例如:发起调用后,快速返回类似 java8CompletableFuture 对象。

3. 弹性机制

事件驱动的 松散耦合 提供了组件在失败下,可以抓获 完全隔离 的上下文场景,作为 消息封装,发送到下游组件。在具体编程时可以 检查错误 ,比如:是否接收到,接收的命令是否可执行等,并决定如何应对。

Reactor简介

Reactor 框架是 Pivotal 基于 Reactive Programming 思想实现的。它符合 Reactive Streams 规范 (Reactive Streams 是由 NetflixTypeSafePivotal 等公司发起的) 的一项技术。其名字有 反应堆 之意,反映了其背后的强大的 性能

1. Reactive Programming

Reactive Programming,中文称 反应式编程Reactive Programming 是一种 非阻塞事件驱动数据流 的开发方案,使用 函数式编程 的概念来操作数据流,系统中某部分的数据变动后会自动更新其他部分,而且成本极低。

其最早是由微软提出并引入到 .NET 平台中,随后 ES6 也引入了类似的技术。在 Java 平台上,较早采用反应式编程技术的是 Netflix 公司开源的 RxJava 框架。Hystrix 就是以 RxJava 为基础开发的。

反应式编程其实并不神秘,通过与我们熟悉的 迭代器模式 对比,便可了解其基本思想:

事件 Iterable (pull) Observable (push)
获取数据 T next() onNext(T)
发现异常 throws Exception onError(Exception)
处理完成 hasNext() onCompleted()

上面表格的中的 Observable 那一列便代表 反应式编程API 的使用方式。它其实是 观察者模式 的一种延伸。

如果将 迭代器模式 看作是 拉模式,那 观察者模式 便是 推模式

  1. 被订阅者 (Publisher) 主动推送数据给 订阅者 (Subscriber),触发 onNext() 方法。异常和完成时触发另外两个方法。

  2. 被订阅者 (Publisher) 发生异常,则触发 订阅者 (Subscriber)onError() 方法进行异常捕获处理。

  3. 被订阅者 (Publisher) 每次推送都会触发一次 onNext() 方法。所有的推送完成且无异常时,onCompleted() 方法将

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值