zoukankan      html  css  js  c++  java
  • SpringMVC的孪生兄弟WebFlux

    一、入门文字介绍

    官方口水话简短翻译:

      Spring WebFlux是一个非阻塞的Web框架,用于利用多核,短时间可一处理大量并发连接。

    非阻塞式

      在servlet3.1提供了非阻塞的API,WebFlux为之有自己的一套手段,

      使用非阻塞的方式可以利用较小的线程或硬件资源处理并发

    函数式编程端点

      Spring5必须配备java8,函数式编程就是java8重要的特点之一,

      WebFlux支持函数式编程来定义路由端点处理请求。

    二、入门小Demo Test

      创建一个Spring Boot项目,版本要求2.0以上,需要下面的依赖,Spring Reactive Web  替代了Web依赖

        

      看看我们的处理器:Controller

        抽一个方法出来,待会儿会使用到,这个方法假如就是我们一个比较耗时的逻辑操作

          

        然后看我们的处理器 @Slf4j   @RestController

          

          我们定义了两个处理器,一个就是普通的处理器,一个是使用了WebFlux的处理器,

          然后我们观察我们的控制台日志情况:

           ...

      • 有没有发现什么一样,当然我们的页面都是一样的,需要在五秒后才会有结果,但是你观察控制台

      • 发现下面那个打印的时间间隔很短有没有,并没有像上面那个一样等待五秒才打印

      • 下面使用WebFlux的请求的耗时操作没有阻塞处理器的执行,也就是说耗时没能影响到处理器,

      • 这样的话,处理器就可以同时接很多请求了,反正也不会堵塞,

      • 虽然对于请求的响应页面数据来看,没有任何差别,但是对于处理器来说,其吞吐量将会大大提高

    三、修改处理器返回值Flux用法

    Mono表示处理器返回的数据为0-1个,Flux表示返回的数据为0-多个

    数组转Flux

    访问测试: http://localhost:8080/test5?strs=lisi&strs=wangwu

      

    集合转Flux

    访问测试:http://localhost:8080/test6?strs=lisi&strs=wangwu&strs=xiongqi

      

    Flux底层不会阻塞处理器的执行

      

    我们看下面的日志输出:

      ...

    同步Servlet & 异步Servlet

    通过上面的小Demo,我们对"非阻塞","异步"应该有了点概念了吧,详细可看我的另一片学习笔记

    https://www.cnblogs.com/msi-chen/p/10983927.html

    下面我们来测试异步Servlet和同步Servlet的差异

    定义一个同步Servlet,也就是普通的Servlet

      

    定义一个异步Servlet,最后做统一测试

      

    耗时操作为:

      

    启动Tomcat,我们进行访问,查看控制台的输出​

      

    我们观察浏览器的响应,都是在等待5秒后的延迟后才会出结果页面

    但是我没得控制台的输出,两个Servlet的业务逻辑耗时为6毫秒和5000多毫秒

    同步Servlet阻塞了什么?

    当请求到达Tomcat后,Tomcat会为其找到有该请求相匹配的Servlet,并分配一个该Servlet的线程处理该请求,当Servlet中需要处理耗时操作是,当前Servlet线程会被阻塞挂起,所以同步Servlet的业务逻辑阻塞了线程的执行,总共耗时了5000多毫秒

    异步Servlet是怎么工作的呢?

    先说结果:异步Servlet没有阻塞Servlet线程的执行,而是很快就结束了Servlet线程的调用,又将其投入Servlet线程池,等待新的连接请求,说到这里,那我们的耗时逻辑业务为什么又没有起到耗时的作用呢?因为逻辑耗时代码是另一个线程在执行,但服务端的响应是需要耗时业务逻辑执行完才会响应给客服端的,,也就是说这里分成了两个线程,主线程为没有被阻塞Servlet,次线程在执行耗时逻辑,当次线程执行完后响应给客户端,所以,客户端还是得等5秒才会有响应结果,但是服务端因为Servlet线程早早的就是执行完,在线程池等待了,服务器的吞吐量是不是大大提高了呢?

     

  • 相关阅读:
    jquery加入购物车飞入的效果
    jQuery点击div其他地方隐藏div
    移动对meta的定义
    ZOJ
    博弈dp入门 POJ
    ZOJ 2967计算几何+单调栈
    牛客训练41D最小相似度bfs
    球的体积并
    二进制上的数位dpPOJ 3252
    数位dp入门 HDU 2089 HDU 3555
  • 原文地址:https://www.cnblogs.com/msi-chen/p/10982604.html
Copyright © 2011-2022 走看看