写作时间:2019-11-29
Spring Boot: 2.2.1 ,JDK: 1.8, IDE: IntelliJ IDEA

说明

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

例如,在命令式编程环境中, a:=b+c表示将表达式的结果赋给a,而之后改变bc的值不会影响a。但在响应式编程中,a的值会随着bc的更新而更新。

电子表格程序就是响应式编程的一个例子。单元格可以包含字面值或类似"=B1+C1"的公式,而包含公式的单元格的值会依据其他单元格的值的变化而变化 。
– 来自:维基百科 - 响应式编程

官方内容

官方地址

  1. 响应式编程核心Reactive Core
    Reactor是一个没有任何阻塞的平台,并提供高效的管理工具. Reactor直接与Java 功能性 API, 与任何过程状态直接交互。包括:完成状态Completable Future, 数据流Stream 和 过程Duration.
  2. 可扩展接口Typed [0|1|N] Sequences
    Reactor 提供了2个响应式API构成(增强了扩展性):
  • Flux [N] : 表示可以有多个请求(比如:request(1).request(2)...)
  • Mono [0|1] :表示返回结果可以没有,或者有一个
  1. 非阻塞Non Blocking IO
    兼容微服务架构Microservices Architecture, Reactor 提供了 反压式网络引擎(backpressure-ready network engines), 支持请求协议 HTTP (包括 Websockets), TCP 和 UDP.

    在响应式编程的顺序流中,Publisher生产数据. 默认情况下,Publisher什么事情都不会发生,知道Subscriber已经注册到Publisher, 这表明数据会推送给Subscriber.

代理回调跟响应式编程对比

传统方式的回调黑洞 例子

userService.getFavorites(userId, new Callback<List<String>>() {  // 1public void onSuccess(List<String> list) {  // 2if (list.isEmpty()) {  // 3suggestionService.getSuggestions(new Callback<List<Favorite>>() { public void onSuccess(List<Favorite> list) {  // 4UiUtils.submitOnUiThread(() -> {  // 5list.stream().limit(5).forEach(uiList::show);  // 6});}public void onError(Throwable error) { // 7UiUtils.errorPopup(error);}});} else {list.stream() // 8.limit(5).forEach(favId -> favoriteService.getDetails(favId,  // 9new Callback<Favorite>() {public void onSuccess(Favorite details) {UiUtils.submitOnUiThread(() -> uiList.show(details));}public void onError(Throwable error) {UiUtils.errorPopup(error);}}));}}public void onError(Throwable error) {UiUtils.errorPopup(error);}
});

解析:

  1. 这里有两个回调服务Callback , 一个是处理成功,一个处理错误.
  2. 第一个服务处理favorite IDs列表.
  3. 如果列表为空, 会跳转到suggestionService.
  4. suggestionService 提供列表 List<Favorite> 给第二个回调.
  5. 因为要处理UI, 需要确保处理逻辑在UI 线程中处理.
  6. Java 8 数据流限制了列表容量,这里suggestions只处理了5条 , 并显示在UI.
  7. 在每个阶段, 处理异常情况.
    Back to the favorite ID level. If the service returned a full list, we need to go to the
  8. 如果favorite IDs 列表不为空, favoriteService 将获得数据,并限制数量一样为5个.
  9. 跟推荐回调一样,在UI线程处理UI内容.

响应式编程的例子

userService.getFavorites(userId) // 1.flatMap(favoriteService::getDetails) // 2.switchIfEmpty(suggestionService.getSuggestions())  // 3.take(5)  // 4.publishOn(UiUtils.uiThreadScheduler())  // 5.subscribe(uiList::show, UiUtils::errorPopup); // 6 

解析:

  1. 首先,开始于获取用户收藏,是一个数据流Flow.
  2. 异步处理,获取并组装用户收藏数据,也是一个数据流.
  3. 如果用户收藏数据流为空,则调用suggestionService.
  4. 只需要结果的前5条数据.
  5. 最后,在UI 线程显示结果数据.
  6. 响应订阅数据流,如果有数据再UI线程显示,如果有错误弹窗显示错误信息.

上面例子来自 3.2. Asynchronicity to the Rescue?

参考

https://projectreactor.io/

https://zh.wikipedia.org/wiki/%E5%93%8D%E5%BA%94%E5%BC%8F%E7%BC%96%E7%A8%8B

http://wiki.jikexueyuan.com/project/android-weekly/issue-145/introduction-to-RP.html

https://gist.github.com/staltz/868e7e9bc2a7b8c1f754

https://github.com/reactor/reactor-core

https://projectreactor.io/docs/core/release/reference/index.html

https://github.com/reactor/reactor-core/blob/master/docs/asciidoc/reactiveProgramming.adoc

https://blog.51cto.com/liukang/2090170

https://blog.51cto.com/liukang/2090183

http://springcloud.cn/view/366

易筋SpringBoot 2.1 | 第三十篇:SpringBoot Reactor响应式编程介绍相关推荐

  1. spring boot 2.1学习笔记【十八】reactor3 响应式编程

    springboot系列学习笔记全部文章请移步值博主专栏**: spring boot 2.X/spring cloud Greenwich. 由于是一系列文章,所以后面的文章可能会使用到前面文章的项 ...

  2. SpringBoot:三十五道SpringBoot面试题及答案!

    SpringBoot面试 前言 今天博主将为大家分享三十五道SpringBoot面试题及答案,不喜勿喷,如有异议欢迎讨论! Spring Boot 是微服务中最好的 Java 框架. 我们建议你能够成 ...

  3. 【百日冲大厂】第十篇,牛客网选择题+编程题井字棋+密码强度等级

    前言: 大家好,我是良辰丫,刷题的第十篇,牛客网选择题+编程题井字棋+密码强度等级.

  4. (转)Spring Boot 2 (十):Spring Boot 中的响应式编程和 WebFlux 入门

    http://www.ityouknow.com/springboot/2019/02/12/spring-boot-webflux.html Spring 5.0 中发布了重量级组件 Webflux ...

  5. springboot异步注解_Spring Boot 2 :Spring Boot 中的响应式编程和 WebFlux 入门

    [小宅按]Spring 5.0 中发布了重量级组件 Webflux,拉起了响应式编程的规模使用序幕. WebFlux 使用的场景是异步非阻塞的,使用 Webflux 作为系统解决方案,在大多数场景下可 ...

  6. java9 反应编程_Java9第四篇-Reactive Stream API响应式编程

    file 我计划在后续的一段时间内,写一系列关于java 9的文章,虽然java 9 不像Java 8或者Java 11那样的核心java版本,但是还是有很多的特性值得关注.期待您能关注我,我将把ja ...

  7. SpringBoot响应式编程(整理一)

    1.SprinBoot响应式编程简介 基础理解: 依赖于事件,事件驱动(Event-driven) 一系列事件称为"流" 异步 非阻塞 观察者模式 (1)Spring WebFlu ...

  8. RXJava2响应式编程框架设计三---Rxjava2背压、生命周期

    在上一次https://www.cnblogs.com/webor2006/p/12348890.html中已经完成了对RxJava2的整个线程切换原理的详细剖析了,这次继续来学习它其它比较重要的知识 ...

  9. Kotlin 协程 (5/7篇) - 响应式编程(冷流) Flow

    一.概念 场景:List 是同步一次性返回多个值,Sequence 是同步(阻塞)分开返回多个值,Suspend 是异步返回单个值,Flow可以异步返回多个值. 冷流:只能在创建的时候定义生产数据的代 ...

  10. Android游戏开发Android软件开发【教程三十篇】

    Android软件开发之发送短信与系统短信库解析(三十)  New Android软件开发之获取通讯录联系人信息(二十九)  New Android软件开发之PreferenceActivity中的组 ...

最新文章

  1. ecshop 商品颜色尺寸仿淘宝选择功能教程(2.7.0版本)
  2. numpy中的矩阵与数学上的矩阵的关系
  3. a1278 win10声卡驱动_windows安装系列教程—驱动安装
  4. 为什么有的系统的事务码BSP_WD_CMPWB看不见Enhance Component这个按钮
  5. python websocket实现消息推送_Python Websocket消息推送---GoEasy
  6. Angular6_服务端渲染SSR
  7. apache在线升级yum_基于Redis实现在线游戏积分排行榜 - phyger
  8. 27留数及其应用(三)
  9. 汇编语言典型例子详解_单片机汇编语言经典一百例
  10. c语言模糊pid算法实例,模糊PID的c语言算法.docx
  11. 服务器里那个文件是地图的爆率,dnf这才是固伤职业最喜欢的地图,气息爆率是巨龙的4倍!...
  12. B站热榜 RSS 订阅 - 基于 RSSHub
  13. excel 的条件格式(一)
  14. 英特尔发布三代服务器芯片至强,英特尔发布第三代至强处理器:10nm Ice Lake架构、最高40核、AI和安全性增强...
  15. php 汉字、字母验证码 例子
  16. 【3D游戏建模全流程教学】在Maya中制作小岛模型
  17. 防范SQL注入式攻击
  18. 所有方向你要的资料干货这都有,从入门到实战!【CSDN宝藏资料图鉴第一期】
  19. ARDUINO传感器专题介绍(2)
  20. Keep It for Mac(专业笔记工具)

热门文章

  1. java编写一个汽车出租管理程序_初学者,写了一个汽车出租管理程序,请大神解决错误。...
  2. C#中生成随机数的方法和语句
  3. IE7的CSS兼容性
  4. 激活中国汽车媒体圈,杉车网与尾部汽车媒体的九死一生
  5. 【Java小工匠聊密码学】--对称加密--DES
  6. 无共享模式的数据架构
  7. 代码回滚:Reset、Checkout、Revert的选择(转)
  8. 闲谈 Kubernetes 的主要特性和经验分享
  9. [转]Birdfont 2.10 发布,字体编辑器
  10. 【转】搞清楚脚本中这些函数的调用规律