2.Spring5 框架新功能(Webflux)
2.1.SpringWebflux 介绍
(1)webFlux是 Spring5 添加的新模块,用于 web 的开发,功能和 SpringMVC 类似的,Webflux 使用 当前一种比较流程响应式编程出现的框架。
在spring5的jar包中和架构图中我们都可以看见
(2)使用传统 web 框架,比如 SpringMVC,这些基于 Servlet 容器,Webflux 是一种异步非阻塞的框架,
异步非阻塞的框架在 Servlet3.X以后才支持,核心是基于 Reactor 的API 实现的。
(3)异步与同步,阻塞与非阻塞的理解
这里做一个简单的通俗的解释:
1.异步和同步针对调用者,调用者发送请求,如果等着对方回应之后才去做其他事情就是同步,如果发送请求之后不等着对方回应就去做其他事情就是异步
2.阻塞和非阻塞针对被调用者,被调用者接受到请求之后,做完请求任务之后才给出反馈就是阻塞,接受到请求之后马上给出反馈然后再去做事情就是非阻塞
如果想深入理解并实践应用异步同步阻塞非阻塞等技术,可能会涉及到网络编程、socket、BIO、NIO、AIO、Netty等技术,大家可以学习之前讲的《网络编程系列课程》
(4)Webflux 特点:
特性一、 异步非阻塞
SpringMVC是同步阻塞的IO模型,资源浪费相对来说比较严重,当我们在处理一个比较耗时的任务时,
例如:上传一个比较大的文件,首先,服务器的线程一直在等待接收文件,在这期间它就像个傻子一样等在那儿(放学别走),什么都干不了,好不容易等到文件来了并且接收完毕,
我们又要将文件写入磁盘,在这写入的过程中,这根线程又要等到文件写完才能去干其它的事情。这一前一后的等待,浪费了大量的资源。
而Spring WebFlux就是来解决这个问题的,
Spring WebFlux可以做到异步非阻塞。还是上面那上传文件的例子,
Spring WebFlux是这样做的:线程发现文件还没准备好,就先去做其它事情,当文件准备好之后,通知这根线程来处理,
当接收完毕写入磁盘的时候(根据具体情况选择是否做异步非阻塞),写入完毕后通知这根线程再来处理(异步非阻塞情况下)。
这个设计相对于SpringMVC而言,可以大大节省系统资源。
特性二、 响应式(reactive)函数编程
Spring5 框架基于 java8,Webflux 使用 Java8 函数式编程方式实现路由请求,如果你觉得java8的lambda写起来很爽,那么,你会再次喜欢上Spring WebFlux,
因为它支持函数式编程,得益于对于reactive-stream的支持(通过reactor框架来实现的)。
特性三、 不再拘束于Servlet容器
以前,我们的应用都运行于Servlet容器之中,例如我们大家最为熟悉的Tomcat, Jetty...等等。
而现在Spring WebFlux不仅能运行于传统的Servlet容器中(前提是容器要支持Servlet3.1,因为非阻塞IO是使用了Servlet3.1的特性),还能运行在支持NIO的Netty和Undertow中。
(5)Webflux与SpringMVC的区别
区别一: 两个框架都可以使用注解方式,都可以运行在 Tomet 等容器中
区别二: SpringMVC 采用命令式编程,Webflux 采用异步响应式编程
具体的可以看后面的案例演示,可能会更好理解!
(6)总结(面试的时候很重要)
特点
1.webflux是一个异步非阻塞的Web框架,它能够充分利用多核CPU的硬件资源去处理大量的并发请求
2.内部使用的是响应式编程,以Reactor库为基础,基于异步和事件驱动,可以让我们在不扩充硬件资源的前提下,提升系统的吞吐量和伸缩性。
3.不能使接口的响应时间缩短,它仅仅能够提升吞吐量和伸缩性。
应用场景
1.特别适合在IO密集型的服务中,比如微服务网关。
2.IO 密集型包括:磁盘IO密集型, 网络IO密集型,
微服务网关就属于网络 IO 密集型,使用异步非阻塞式编程模型,能够显著地提升网关对下游服务转发的吞吐量。
选WebFlux还是Spring MVC
1.WebFlux不是 Spring MVC的替代方案!虽然 WebFlux 也可以被运行在 Servlet 容器上(需是 Servlet 3.1+ 以上的容器),
但是 WebFlux 主要还是应用在异步非阻塞编程模型,而 Spring MVC 是同步阻塞的,
如果你目前在 Spring MVC 框架中大量使用非同步方案,那么,WebFlux 才是你想要的,否则,使用 Spring MVC 才是你的首选。
2.在微服务架构中,Spring MVC 和 WebFlux 可以混合使用,比如已经提到的,对于那些 IO 密集型服务(如网关),我们就可以使用 WebFlux 来实现。
2.2.响应式编程(Java 实现)
package com.ldp.testWebflux; import java.util.Observable; /** * @author 姿势帝-博客园 * @address https://www.cnblogs.com/newAndHui/ * @WeChat 851298348 * @create 01/15 7:14 * @description <p> * 什么是响应式编程 * 响应式编程是一种面向数据流和变化传播的编程范式。这意味着可以在编程语言中很方便 * 地表达静态或动态的数据流,而相关的计算模型会自动将变化的值通过数据流进行传播。 * 电子表格程序就是响应式编程的一个例子。单元格可以包含字面值或类似"=B1+C1"的公 * 式,而包含公式的单元格的值会依据其他单元格的值的变化而变化。 * </p> */ public class Test01Observer extends Observable { /** * @param args */ public static void main(String[] args) { Test01Observer observer = new Test01Observer(); // 添加观察者 observer.addObserver((o, arg) -> { System.out.println("通知数据变化---1"); }); observer.addObserver((o, arg) -> { System.out.println("通知数据变化---2"); }); observer.addObserver((o, arg) -> { System.out.println("通知数据变化---3"); }); // 数据变化 observer.setChanged(); // 通知 observer.notifyObservers(); System.out.println("代码执行完成.....4"); } }