响应式Spring的道法术器(Spring WebFlux 快速上手 + 全面介绍)

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

1. Spring WebFlux 2小时快速入门

Spring 5 之使用Spring WebFlux开发响应式应用。

  1. lambda与函数式(15min)
  2. Reactor 3 响应式编程库(60min)
  3. Spring Webflux和Spring Data Reactive开发响应式应用(45min)

通过以上内容相信可以对Spring 5.0 推出的响应式开发有了初步的体会。如果希望有更加深入的了解,欢迎阅读下边的系列文章——

2. 响应式Spring的道法术器

这个系列的文章是为了记录下自己 学习Spring响应式编程 的所得,也希望能够帮助到更多的朋友。

原谅我标题党了,希望能从道、法、术、器四个层面尽量全面地学习和介绍关于Spring响应式编程的方方面面。

【道】响应式编程的概念、原则、特性与方法

【法】系统介绍响应式编程库的使用与原理

  • 2.1 照虎画猫深入理解响应式流规范,介绍响应式流规范及响应式开发核心接口,通过自己动手编写响应式开发库,了解内部实现机制,是理解本章后续内容的基础,重要。
  • 2.2 自定义数据流,在Reactor 3中如何通过generatecreate等方法生成自定义的数据流,是命令式编程与响应式编程的桥梁。然后通过实现一个docker事件推送的例子进一步熟悉它。
  • 2.3 Reactor的backpressure(背压/回压)策略,介绍Reactor3中的几种回压策略,及其在生成和消费数据流的时候如何起作用。
  • 2.4 Reactor调度器与线程模型,从原理角度分析Reactor 3的调度器以及subscribeOnpublishOn的作用原理,最后介绍用于并行执行的ParallelFlux
  • 2.5 Reactor 3 operators,Reactor 3提供了丰富的操作符,介绍如何选择合适的操作符,以及如何进行操作符的打包。
  • 2.6 测试,介绍使用StepVerifierPublisherProbeTestPublisher三种工具进行自动化测试的方法。
  • 2.7 调试,介绍基于hook的全局调试模式、基于checkpoint()的局部调试模式的调试方法,以及之前用过的log()操作符观察内部执行情况。
  • 2.8 Hot vs Cold,介绍使用Reactor 3 操作“热序列”的方法。
  • 2.9 Processor,介绍Reactor 3内置的几种Processor的实现。
  • 2.10 操作符熔合,介绍操作符熔合的优化思路。

【术】响应式关键技术与底层机制
预告:看网上关于Actor/Reactor/Preactor模型、异步I/O的内容很详细也很棒,我就不赘述了,初步考虑直接通过模仿reactor-netty项目,从零编写一套基于Netty的响应式服务器和客户端,相信无论是对于我自己还是对于关注本系列文章的朋友来说,都是一次不错的提升Netty和响应式编程的尝试,也是为下一章做铺垫。这样一套基于Netty的响应式服务器和客户端工具是Spring WebFlux与Netty之间的适配层,用于将Netty的入站和出站数据进行响应式转换。
(最近事情有点多,会稍迟些发出来,还是有点难的,光读源码就读了两周,囧)

【器】实例了解Spring各种响应式组件
系统了解Spring中支持响应式的组件,如Spring WebFlux、Spring Data Reactive、Spring Security Reactive,以及使用Spring Boot 2和Spring Cloud构建响应式系统的方法。
(学习中)

系列文章目录

相关源码见:https://github.com/get-set/get-reactive。
Reactor3 Reference Guide参考文档中文版(跟随版本更新):http://blog.csdn.net/get_set/article/details/79471861。

(未完待续)


2017年9月,Spring Framework 5发布了其GA版本,这是自2013年12月以来的又一个大版本升级。除了一些人们期待已久的改进,最令人兴奋的新特性是它提供了

  • 完整的端到端响应式编程的支持。
  • 这是一种不同于Servlet的全新的编程范式和技术栈,
  • 它基于异步非阻塞的特性,
  • 能够借助EventLoop以少量线程应对高并发的访问,
  • 对微服务架构也颇有助益。不夸张的说,Spring 5使得Java世界拥有了Node.js那样骨骼惊奇的神器。

2018年3月1号,Spring Boot 2.0如约发布,也是一个大版本升级。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-treDhdxa-1612524393059)(https://leanote.com/api/file/getImage?fileId=5a9dea18ab644159cf00065a)]

从这个图就可以看出对支持Spring 5的Spring Boot 2.0来说,新加入的响应式技术栈是其主打核心特性。具体来说,Spring Boot 2支持的响应式技术栈包括如下:

  • Spring Framework 5提供的非阻塞web框架Spring Webflux;
  • 遵循响应式流规范的兄弟项目Reactor;
  • 支持异步I/O的Netty、Undertow等框架,以及基于Servlet 3.1+的容器(如Tomcat 8.0.23+和Jetty 9.0.4+);
  • 支持响应式的数据访问Spring Data Reactive Repositories;
  • 支持响应式的安全访问控制Spring Security Reactive;
  • 等。

由于水平有限,如果文中有任何问题和不足,烦请您留言告知,不胜感激。

前言

  • Reactor 3是一个围绕Reactive Streams规范构建的库,
  • 它在JVM上引入了响应式编程的一个范例。
  • 目前Spring5 引入的Webflux就是reactor 3实现的一个响应式web框架。
  • Spring Cloud Gateway是Webflux的一个网关场景实践。想学好上面这两项技术必须搞明白响应式编程以及Reactor 3。

为什么要搞响应式

有这么一个场景,产品提了一个这么需求:

  • 商品打折,根据商品的原价来计算商品的折扣价。这个需求不是很简单嘛,按照我们通常的做法,搞一个如下的方法就搞定了。

  • 但是如果我折扣改了呢,这时有人该说重新计算啊。这样是不是重新走了一次流程呢,我们需要花精力来维护这种流程逻辑。

  • 那么能不能我下游能直接响应上游的变化?

    • 就像excel表格计算一样,下游始终监听上游,有点风吹草动,结果就会变化。这种潜在的需求就是响应式。
    • 响应式编程正是用 某种操作符 帮助你构建这种关系,而不是执行某种赋值命令。这种思想其实在前端的一些框架中已经风靡很久了。

响应式的特点

基于以上的一个简单事例。

  • 我们可以看出如果是响应式一定要有一个触发点。
  • 就像我们点击了计算机桌面的QQ图标一只企鹅跳啊跳。我们点击了迅雷图标有一只飞鸟在扑腾着翅膀。
  • 计算机只维护一个点击图标的事件。也就是说响应式编程一定是一个事件触发机制。
  • 并且是以异步 和 非阻塞的方式 发送和接收的。不是我们平常请求-响应的同步模型。

事件驱动的系统通过push 而不是pull来处理,

  • 生产者有消息时才推送消息给消费者,

  • 而不是通过一种浪费资源方式:让消费者不断地轮询或等待数据。

基于这个机制相对 高的吞吐量 和 实时响应也是响应式的特点。

  • 事件驱动由于 Publisher 只关心数据源,

  • Consumer只用关心对处理结果的消费。

完全是松耦合的。

这就给我们很大的操作空间来定制化我们的逻辑组合,从而使异步代码更易读和可维护。

Reactor 3 简介

Reactor 3框架是Pivotal(Spring 母公司)

  • 基于Reactive Programming思想实现的。
  • 它实现了Reactive Streams(该规范由 Netflix、TypeSafe、Pivotal等公司发起的响应式规范)。
  • 其他诸如RxJava 2, Akka Streams, Vert.x和Ratpack也都实现了该规范。

Reactor有一个很重要概念的就是backpressure。

由于生产者消费者处理数据的能力不对等,很容易产生下游消费能力过载的问题。

这就需要一个backpressure处理,来告诉上游生产者避免过载。

  • 打个比方,一个人负责放水,一个人负责接水,如果放水的速度太快,水桶势必会溅出来,
  • 接水的人会根据情况来告诉放水的人什么速度最合适,并且在快满的时候告知放水人关闭开关。

Reactor还添加了 运算符的概念,

  • 这些运算符被链接在一起以描述在每个阶段对数据应用的处理。
  • 应用运算符返回一个中间Publisher(实际上,它可以被认为是 上游运算符的 订阅者和 下游的发布者)。
  • 数据的最终归纳点在最终Subscriber中(这里还定义了用户角度的业务逻辑)。
  • 还拿放水举例,如果我们放水不是为了单纯放水而是为了制造肥宅快乐水。
    • 这样就不是一个人接水了,中间加入了原浆流程,
    • 下一个接的人接到的是原浆勾兑水,
    • 那么这个人充当了源头的消费者,也充当了他下游的生产者。
    • 他的下游还有加气儿的。
    • 他下游的下游还有罐装等一系列操作。
    • 到最后装箱整个工艺才算告一段落。
    • 另外如果下游没有开工,上游也是不开工的。这样也符合常理,不可能上游空转。

img

上图揭示了一个最小单元的Reactor流程。其实这些概念更重要的是理解它们。理解了Reactor的特性才能为后面更好的学习java响应式编程打下基础。后面我们会一起慢慢深入响应式这个话题。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值