2.Spring5 框架新功能(Webflux)

2.1.SpringWebflux 介绍

(1)webFlux是 Spring5 添加的新模块,用于 web 的开发,功能和 SpringMVC 类似的,Webflux 使用 当前一种比较流程响应式编程出现的框架。

在spring5的jar包中和架构图中我们都可以看见

SpringWebflux详细讲解

(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 采用异步响应式编程

  SpringWebflux详细讲解

   具体的可以看后面的案例演示,可能会更好理解!

  (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");
    }
}
View Code

相关文章: