1、响应式编程基础

1.1、什么是响应式编程?

响应式编程是一种面向数据流和变化传播的编程范式。
使用它可以在编程语言中很方便地表达静态或动态的数据流,而相关的计算模型会自动将变化的值通过数据流进行传播。我们可以使用声明的方式构建应用程序的能力,形成更加敏感和有弹性的应用。

1.2、响应式编程的优势

  • 提高了代码的可读性,因此开发人员只需要关注定义业务逻辑。

  • 在高并发环境中,可以自然的处理消息。

  • 可以控制生产者和消费者之间的流量,避免内存不足。

  • 对于一个或多个线程,IO绑定任务可以通过异步和非阻塞方式执行,而且不阻塞当前线程。

  • 可以有效的管理多个连接系统之间的通信。

1.3、应用场景

  • 大量的交易处理服务,如银行部门。

  • 大型在线购物应用程序的通知服务,如亚马逊。

  • 股票价格同时变动的股票交易业务。

2、Spring 5 响应式编程实践

作为Java中的首个响应式Web框架,Spring 5.0最大的亮点莫过于提供了完整的端到端响应式编程的支持。

2.1 架构介绍


如上图所示左侧是传统的基于Servlet的Spring Web MVC框架,右侧是spring 5.0新引入的基于Reactive Streams的Spring WebFlux框架,从上往下依次是:Router Functions,WebFlux,Reactive Streams三个新组件,其中:

  • Router Functions: 对标@Controller,@RequestMapping等标准的Spring MVC注解,提供一套函数式风格的API,用于创建Router,Handler和Filter。

  • WebFlux: 核心组件,协调上下游各个组件提供响应式编程支持。

  • Reactive Streams: 一种支持背压(Backpressure)的异步数据流处理标准,主流实现有RxJava和Reactor,Spring WebFlux默认集成的是Reactor。

2.2 简单示例

Spring 5 大力支持了 Reactive Programming(响应式开发),server 和 client 都可以使用这种开发模式,Spring 5 是基于 Reactor项目实现的。

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

reactive streams 是非阻塞的,所以数据的处理过程中无需等待,对于系统的扩展性非常有帮助,因为工作线程不必等待其他资源,可以自由的处理更多的请求。

下面看一个例子,有助于更好的理解,例如我们要从数据库加载用户数据,然后把用户名形成一个新的集合。

① 传统方式

② 函数式处理集合数据流

③ 响应式

函数式比传统方式更加简洁,但如果数据库比较忙,那么我们的线程就被阻塞了,而响应式就可以解决这个问题,非阻塞,主线程不会捆绑在这个操作上,如果调用者也是响应式的,那么就形成了一个非阻塞的传播链条。

如果 web server 是响应式的,那么处理请求的线程就可以立即去处理其他请求,当数据库返回数据后,自动就发送给了调用者。

2.3 背压

使响应式开发超越传统方式的关键因素是背压机制,就是数据流的生产端能够知道消费端的处理能力,并以此调整生产量。

这种感知能力非常重要,比如数据库操作的成本较高,那么在消费端真正准备好处理这些数据之后再进行数据库操作就很关键。

再比如消费端受限(如网络带宽不足),背压机制就可以确保生产端不会过度生产,就是说,当客户端不能很快的消费数据时,就会反向影响到响应式数据流,从而可以尽快通知数据库停止发送数据,数据库也就可以处理其他请求了,使系统的整体效率得到提升。

2.4 Reactor 项目的核心概念

Spring 5 是基于 Reactor 项目实现的响应式开发,Reactor 中有两个核心类型 - Mono 和 Flux。

他们都是数据流,Mono 是一个最多有1个值的流,Flux 是一个可以有无限个值的流。

流的处理是延迟的,生产者只有在收到消费者的指示时才会真正生产数据,是通过调用 subscribe() 来实现的,例如:


subscribe() 中传入的是一个消费者,会处理接收到的每条数据。

Java 9 中已经集成了reactive stream,思路和Reactor项目相同。

2.5 完整示例

控制器

可以看到,和我们之前的写法没有多少不同,还是使用熟悉的注解,只是返回类型不同了,使用了 Flux 和 Mono,用来返回响应式类型的数据,其他的工作都由框架来帮我们做。

我们再简单对比下传统方式和响应式的不同:

传统方式下,数据是全部从数据库读取出来之后才从server发送到client,图示:


响应模式下,只要有数据就绪了,就立即发送给client,像流一样,图示:


这样client就可以更快的展示首条数据,server也不需要存放全部数据,数据的处理和传输都是即时的。

操作数据库的代码也需要是响应式的,Spring Data 已经提供了支持,只是目前还不全面,例如 MongoDB没问题,但 JDBC 还不行,需要等待一段时间。

下面以 mongodb 为例,看看响应式的数据库操作代码什么样:


和我们平时的代码有两点不同,一是使用的接口从普通的 CrudRepository 变为 ReactiveCrudRepository,二是返回类型使用了 Flux,编码方式变动非常小。

3、总结

Reactive Programming 是非常好的开发方法,可维护性和可扩展性都非常好,相对于阻塞式开发,相同资源下性能会得到明显提升。

Sping5——响应式编程相关推荐

  1. 响应式编程笔记(二):代码编写

    2019独角兽企业重金招聘Python工程师标准>>> 响应式编程笔记(二):代码编写 博客分类: 架构 原文:Notes on Reactive Programming Part ...

  2. 走进JavaScript响应式编程(Reactive Programming)

    或许"响应式布局"这个名单大家都听过或者都自己实现过,那么"响应式编程"是什么呢?下面我们来具体聊一聊. 我的理解 从字面意思上我们可以大致理解为:所有的事件存 ...

  3. 赠书:响应式编程到底是什么?

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 最近几年,随着Go.Node 等新语言.新技术的出现,J ...

  4. IOS响应式编程框架ReactiveCocoa(RAC)使用示例

    本文转载至 http://blog.csdn.net/dfqin/article/details/39164241 IOS ReactiveCocoa RAC 响应式编程 RACSignal Reac ...

  5. RxJava响应式编程学习笔记

    1.概述 RxJava是一个著名的开源库,是ReactiveX(Reactive Extensions)的一种java实现.ReactiveX是一种响应式扩展框架,有很多实现,如RxAndroid,R ...

  6. 响应式编程入门:实现电梯调度模拟器

    据说每个程序员等电梯的时候都思考过电梯的调度算法-所以怎么动手实现一个呢?虽然这个场景貌似有些复杂,但却非常适合使用响应式编程的范式来处理.下面我们会在 RxJS 和 Vue 的基础上,一步步实现出一 ...

  7. wince支持多线程编程吗_以前面试只问多线程,现在都开始问响应式编程了!我懵了...

    以前面试只问多线程,现在都开始问响应式编程了! 看完这篇文章你就能有个大体的了解了. 基本介绍 目前比较流行的编程方法论有函数式编程(functional programming).响应式编程(rea ...

  8. WebFlux基础之响应式编程

    上篇文章,我们简单的了解了WebFlux的一些基础与背景,并通过示例来写了一个demo.我们知道WebFlux是响应式的web框架,其特点之一就是可以通过函数式编程方式配置route.另外究竟什么是响 ...

  9. 阿里淘宝一直在推的响应式编程到底是个什么鬼?

    随着这些年智能手机的发展和普及,我们的服务器端要应对日益增长的巨大流量. 从开发的角度来看,这就要求我们必须设计出高扩展性和高可用性的程序,以确保能够适应日益增长的请求所带来的压力. 而从使用者的角度 ...

最新文章

  1. Maya硬表面建模学习教程 Master Hard Surface Modeling in Maya 2020
  2. 深度学习在工业推荐如何work?Netflix这篇论文「深度学习推荐系统Netflix案例分析」阐述DL在RS的优劣与经验教训...
  3. .NET 部署-03Web Deployment项目-05自定义Web Deployment项目
  4. 容器技术Docker云计算实战 镜像操作大总结
  5. lucene全文搜索之三:生成索引字段,创建索引文档(给索引字段加权)基于lucene5.5.3...
  6. NET比较常用的性能优化技巧
  7. java语言特点 字符串不变_面试必问:Java中String类型为什么设计成不可变的?
  8. 从ip_queue到nfnetlink_queue(上)
  9. ACS——网管的九阳神功
  10. 水经注万能地图下载器功能大全
  11. 史上最全!!收藏了!3D建模软件大全
  12. HttpSession session用法详解
  13. linux中shift用法,Linux shell脚本中shift的用法说明
  14. linux开启磁盘多队列(blk-mq)
  15. 护眼台灯界的“变形金刚”,性能爆表还帅气十足 | 钛空智慧星球推荐
  16. 年轻人的第一次汉化APK(教程)
  17. Ruoyi-Vue是如何实现微信公众号免密登录的
  18. Android Qcom USB Driver学习(二)
  19. Ubuntu 截图工具 Flameshot
  20. win7安装SQL2005

热门文章

  1. 《看聊天记录都学不会C#?太菜了吧》(5)C# 中可以用中文名变量?
  2. python 百度云文字识别 proxy_python使用百度文字识别功能方法详解
  3. omnicppcomplete php,VIM 常用法 (三)
  4. 计算机文化教程实验基础知识,《计算机文化基础上机实验教程》孙家启、黄晓梅、刘奎 著_孔网...
  5. 知道经纬度用python画路线图_神级程序员教你用Python如何画一个中国地图!(好好玩)...
  6. 外圆内方与外方内圆的奇妙变换!
  7. 波的折射现象,你都了解吗?
  8. 为啥饮料瓶大都是圆的,牛奶盒却是方的?
  9. 50张神图……好不容易才找到完整版!
  10. 计算机游戏50关,YELLOW游戏全50关攻略