开课吧-07反应式web开发框架webflux_W_第1页
开课吧-07反应式web开发框架webflux_W_第2页
开课吧-07反应式web开发框架webflux_W_第3页
开课吧-07反应式web开发框架webflux_W_第4页
开课吧-07反应式web开发框架webflux_W_第5页
已阅读5页,还剩16页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、WebFlux课程讲义 主讲:Reythor 雷 反应式 Web 开发框架 2019 反应式 Web 开发框架 WebFlux反应式 Web 开发框架 WebFlux第1章 WebFlux 基础 1.1 WebFlux 简介 【原文】Spring WebFlux is a non-blocking web framework built from the ground up(自底向上) to take advantage of(利用) multi-core(多核),next-generation processors(下一代处理器) and handle massive(大量) numbers

2、 of concurrent connections(并发连接).【翻译】Spring WebFlux 是一个自底向上构建的非阻塞 Web 框架,用于利用多核、下一代处理器处理高并发连接。 打开 Spring 官网,可以看到 WebFlux 在线参考文档入口地址。 讲师:Reythor 雷20The original(原始的) web framework included in the Spring Framework, Spring Web MVC, was purpose built for(专为*构建) the Servlet API and Servlet containers. Th

3、e reactive-stack web framework, Spring WebFlux, was added later in version 5.0. It is fully non-blocking, supports Reactive Streams(反应式流) back pressure(背压), and runs on servers such as Netty, Undertow, and Servlet 3.1+ containers.1.2 WebFlux 牛刀小试 1.2.1 第一个 WebFlux 工程 01-firstwebflux(1) 创建工程 创建一个 Spr

4、ing Initializr 工程,Spring Boot 的版本要求最低为 2.0.0。不要添加原来的web 依赖,而是要添加 Reactive Web,即 flux 依赖,并添加上 Lombok 依赖。命名为 01-firstwebflux。 (2) 定义处理器 为了对比效果,这里首先定义两个处理器方法:一个普通处理器方法,一个 Reactive 处理器方法。 1.2.2 添加耗时操作 (1) 创建工程 复制 01-firstwebflux 工程,并重命名为 02-primary。 (2) 定义耗时操作启用 lombok 日志 (3) 修改两个处理器方法 (4) 修改配置文件 为了便于观察

5、日志输出,这里指定了日志的输出格式。 1.2.3 返回FluxMono 表示包含 0 或 1 个元素的异步序列,Flux 则表示包含 0 或N 个元素的异步序列。 (1) 直接指定 Flux 序列元素 在处理器中添加如下处理器方法。 (2) 数组转 Flux(3) 集合转 Flux(4) Flux 执行耗时操作 (5) SSESSE,Server-Sent Event,服务端推送。 Stream 流中的每个元素将调用一次耗时操作 doSome(),即若 interests 集合中若存在三个元素,则其就会调用三次 doSome()方法。 1.3 SSE1.3.1 SSE 简介 理论上, SSE

6、和 WebSocket 做的是同一件事情。当你需要用新数据局部更新网络应用时,SSE 可以做到不需要用户执行任何操作便可以完成。 例如,在前面学习的 Spring Cloud 中,关于 Hystrix 的 Dashboard 监控仪表盘的显示即为使用 SSE 实现的。只要当前监控的工程中发生了服务方法调用,仪表盘上就会显示调用相关 数据,无需页面刷新。 再比如,邮箱服务的新邮件提醒,微博的新消息推送、在线聊天记录的显示、直播平台聊 天区的显示等,SSE 都是不错的选择。类似这种更新频繁、低延迟的场景,SSE 可以完全满足。 1.3.2 SSE 技术规范 SSE(Server-Sent Even

7、t,服务端推送)规范是 HTML 5 规范的一个组成部分。该规范比较简单,主要由两个部分组成: 服务端与浏览器之间的通讯协议 浏览器中可供 JavaScript 使用的 EventSource 对象 (1) 通讯协议 这个通讯协议是基于纯文本的简单协议。服务器端的响应内容类型必须是“text/event-stream”。响应文本的内容是一个流,流是一个简单的文本流,仅支持UTF-8 格式的编码。 流由不同的组成。不同间通过仅包含回车符和换行符的空行(“rn”)来分隔。 每个可以由多行构成,每行由类型和数据两部分组成。类型与数据通过冒号(“:”) 进行分隔,冒号前的为类型,冒号后的为其对应的值。

8、每个可以包含如下类型的行: 类型为 data,表示该行是所包含的数据。以 data 开头的行可以出现多次。所有这些行都是该的数据。 类型为 event,表示该行用来声明名称。浏览器在收到数据时,会产生对称的。 类型为空白,表示该行是注释,会在处理时被忽略。 类型为 id,表示的标识符,标识符用于连接中断后的继连。 类型为 retry,表示该行用来声明浏览器在连接断开之后进行重连的等待时间。 data: chinadata: Beijingdata: haidian/ 该仅包含数据 : this is custom event/ 注释 event: myeventdata:shanghai id

9、: 101retry: 3s/ 该指定了名称 (2) EventSource 对象 对于服务端发送的带有 的响应,浏览器需要在 JavaScript 中使用 EventSource 对象进行处理。EventSource 使用的是标准的 器方式(注意,这里的 并不是响应中所带的 ,而是浏览器上所发生的 )。当相应的 发生时,只需使 EventSource 对象调用相应的 处理方法即可。EventSource 提供了三个标准 。 1.3.3 SSE 举例 03-sse(1) 创建工程 创建一个 Spring Boot 工程,导入 web 依赖。 (2) 导入依赖 导入一个 JSP 解析器依赖。 (

10、3) 创建并设置 webapp 目录 在 src/main 下创建 webapp 目录。 org.apache.tomcat.embedtomcat-embed-jasper在 Project Structure 窗口中设置该目录为当前工程 web 的根目录。 在 pom 文件中指定该目录为资源目录。 (4) 修改启动类 (5) 使用默认 A、定义一个普通 CommonServlet定义该 Servlet 的目的主要是用于对比,对比一下使用 SSE 前后,浏览器的区别。 B、 定义 DefaultEventSseServlet直接复制 CommonServlet,并重命名为 DefaultEv

11、entSseServlet。 C、 定义客户端页面处理默认 在 src/main/webapp 目录中定义一个 defaultsse.jsp 页面,仅包含如下 JS 代码块。 (6) 自定义 A、定义 CustomEventSseServlet复制 DefaultEventSseServlet,并重命名为 CustomEventSseServlet。在其中仅添加了一行内容:指定名称。 B、 定义客户端页面处理自定义 复制 defaultsse.jsp 页面,并重命名为 customsse.jsp。 1.3.4 再看第一个 webflux 程序 在前面的第一个WebFlux 程序中也使用到了 S

12、SE,通过前面 SSE 的详细学习可知,处理器发送来的Flux 数据可以被浏览器的 JS 代码接收到,这样浏览器就可以对这些数据进行相应处理了。 1.4 Reactive StreamRxJavaReactive eXtensions(Rx)Java9 Reactive Stream:反应式流编程规范 RxJava:是反应流编程的一套库。 RxJava2:是 Reactive Stream 编程规范的一套库。 Reactor:是 Reactive Stream 编程规范的一套全新的库,与 RxJava 没有任何关系。 1.4.1 Reactive Stream 概述 (1) 推拉模型与发布/订

13、阅模型 在流处理机制中发布/订阅模型可以分为 push(推送)模型和 pull(拉取)模型。push 模型中,发布者将元素主动推送给订阅者。而 pull 模式中,订阅者会向发布者主动索要。在同步系统中发布者与订阅者的工作效率相当,发布者发布一个消息后阻塞,等待订阅 者消费。订阅者消费完后,订阅者阻塞,等待发布者发布。这种同步式处理方式效率很低。 (2) 异步系统与背压 由于同步式处理方式效率很低,一般使用的是异步处理机制。即发布者发布消息,与消费者消费消息的速度是不一样的。那么它们间是如何协调工作的呢?有两种情况: 情况一:当订阅者消费比发布者发布快时,会出现订阅者无消息可消费的情况。在同步数

14、据处理机制中订阅者需无限期等待,直到有消息可用。但在异步处理机制中,订阅者无需阻塞,其继续处理其他任务即可。当出现了准备就绪的消息时,发布者会将它们异步发送给订阅者。所以,在异步处理机制中,这种情况并不会对系统性能产生 影响。 情况二:当发布者发布比订阅者消费快时,有两大类解决方案。 u 一类解决方案是改变订阅者。要么使订阅者拥有一个无边界缓冲区来保存快速传入的消息,要么让订阅者将它无法处理的消息丢弃。 u 另一类解决方案是改变发布者。这类解决方案采用的策略称为背压(Back Pressure) 策略。订阅者告诉发布者让其减慢发布速度并保持消息,直到订阅者准备好处理更多消息。使用背压策略可确保

15、较快的发布者不会压制较慢的订阅者。但该解决方案要求发布者要拥有无边界缓冲区,以确保发布者可以一直生产和保存消息。当然, 发布者也可以实现有边界缓冲区以保存有限数量的消息。若缓冲区满,则需要放弃这些消息。不过,可以让发布者将放弃的消息再发布,直到订阅将其消费。 (3) 反应式流 反应式流从 2013 年开始,作为提供非阻塞背压的异步流处理标准的倡议,旨在解决处 理元素流(即消息流、数据流)的问题如何将元素流从发布者传递到订阅者,而不需要发布者阻塞,不需要订阅者有无边界缓冲区,不需要订阅者丢弃无法处理的元素。 反应式流模型可以解决这个问题,该模型非常简单:订阅者向发布者发送异步请求,订阅 n 个元

16、素;然后发布者向订阅者异步发送 n 个或少于 n 个的元素。反应式流会在 pull 模型和push 模型流处理机制之间动态切换。当发布者快、订阅者慢时,它使用 pull 模型;当发布者慢、订阅者快时,它使用 push 模型。即谁慢谁占主动。 2015 年发布了用于处理反应式流的规范和 Java API。 (4) JDK 与反应式流的关系 Reactive Steam 是一种数据处理机制,是一种思想,一套解决方案。JDK 使用 Flow 类定义了这种规范,该规范中仅包含四个内部接口(后面讲)。这套规范最初是定义在 JDK9 中的。 1.4.2 反应式流规范 在 Java 中反应式流规范,是通过

17、JDK 的 java.util.concurrent.Flow 类中声明的四个内部接口来定义的。 (1) Publisher接口 Publisher,即发布者,是有序消息的生产者,是反应式流的生产者。它根据收到的请求向订阅者发布消息。 (2) Subscriber接口 Subscriber,即订阅者,从发布者那里订阅并接收处理消息,是反应式流的消费者。发布者向订阅者发送订阅令牌(Subscription)。使用订阅令牌,订阅者可以从发布者那里请求多个消息。当消息元素准备就绪时,发布者向订阅者发送多个或更少的元素。然后订阅者可以再次请求更多的消息元素,或取消订阅。一个发布者可能需要处理来自多个订

18、阅者的请求。 (3) Subscription 接口 Subscription(订阅费),订阅令牌。当订阅请求成功时,发布者将其传递给订阅者。订阅令牌具有缓存,订阅者使用订阅令牌与发布者进行交互;订阅者通过订阅令牌可以请求更多的消息元素或取消订阅。 (4) 三个接口的关系 (5) Processor接口 Processor,即处理器,充当订阅者和发布者的处理阶段。Processor 接口继承了Publisher和 Subscriber 接口,对于发布者来说,Processor 是订阅者,对于订阅者来说,Processor 是发布者。 Processor 用于转换发布者/订阅者管道中的元素。Processor会将来自于发布者的 T类型的消息数据,接收并转换为 R 类型的数据,并将转换后的 R 类型数据发布给订阅者。一个发布者可以拥有多个处理者。 1.4.3发布者类 SubmissionPublisher通常情况下,我们会使用 JDK 中已经定义好的一个发布者类 SubmissionPublisher,该类就可以完成一个简单的消息生成与发布。从该类的注释第一段中可以了解到其简介。 A link Flow.Publisher

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论