1 概念

  待更新......

2 异步servlet

  2.1 同步servlet

    servlet容器(如tomcat)里面,每处理一个请求会占用一个线程,同步servlet里面,业务代码处理多久,servlet容器的线程就会等(阻塞)多久,而servlet容器的线程是有上限的,当请求多了的时候servlet容器线程就会全部用完,就无法再处理请求(这个时候请求可能排队也可能丢弃,得看如何配置),就会限制了应用的吞吐量!(来源:慕课网)  

  2.2 异步servlet

    异步serlvet里面,servlet容器的线程不会傻等业务代码处理完毕,而是直接返回(继续处理其他请求),给业务代码一个回调函数(asyncContext.complete()),业务代码处理完了再通知我!这样就可以使用少量的线程处理更加高的请求,从而实现高吞吐量!(来源:慕课网)  

  2.3 同步servlet代码实现

    参考博文

  2.4 异步servlet代码实现

3 WebFlux意义

  WebFlux可以实现高并发,因为使用WebFlux框架时,当前端请求过来后不会占用Servlet容器的线程,Servlet容器在接收到请求后会通知Spring框架进行处理,然后释放掉线程供其他请求使用,等到Spring框架执行完业务逻辑后,Spring框架会通知Servlet容器,Servlet再将响应信息发送到前台

  3.1 传统MVC和WebFlux比较

    技巧01:WebFlux也可以实现创痛的MVC的请求,只需要响应数据不是Mono类型或者Flux类型就可以啦

    3.1.1 项目构建

      创建一个SpirngBoot项目(本博文基于2.0.3),引入 webflux、lombok、devtools依赖

        <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<!--<scope>runtime</scope>-->
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>

    3.1.2 创建一个测试类

      该测试类用来对比创痛MVC和WebFlux的对比

      》创建一个模拟业务方法(通过延时来实现业务逻辑的执行时间)

      》传统MVC请求处理方法

      》WebFlux请求处理方法

      》代码汇总

package cn.xiangxu.webflux_demo.web;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Mono; import java.util.concurrent.TimeUnit; /**
* @author 王杨帅
* @create 2018-08-01 16:26
* @desc 测试控制层
**/
@RestController
@RequestMapping(value = "/test")
@Slf4j
public class TestController { @GetMapping(value = "/test01")
public String test01() {
log.info("mvc-start");
String result = doSomething("MVC");
log.info("mvc-end");
return result;
} @GetMapping(value = "/test02")
public Mono<String> test02() {
log.info("mono-satar");
Mono<String> result = Mono.fromSupplier(() -> doSomething("Mono"));
log.info("mono-end");
return result;
} public String doSomething(String s) {
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "Hello " + s;
} }

      》效果演示

        技巧01:同步和异步都是针对后台而言,浏览器都是同步的

        传统的MVC模式会阻塞Servlcet容器线程,业务逻辑执行多久Servlet线程就会被占用多久;WebFlux模式不会占用Servlet线程,请求到达控制层后就会释放线程;只一点从日志打印的时间可以看出:

  3.2 WebFlux的流式返回

    利用Flux可以实现流一样的向前端发送数据

    技巧01:请求方法上需要利用 produces 指明数据的响应类型,例如 ->

@GetMapping(value = "/test03", produces = MediaType.TEXT_EVENT_STREAM_VALUE)

  

WebFlux01 webflux概念、异步servlet、WebFlux意义的更多相关文章

  1. Servlet 3特性:异步Servlet

    解异步Servlet之前,让我们试着理解为什么需要它.假设我们有一个Servlet需要很多的时间来处理,类似下面的内容: LongRunningServlet.java package com.jou ...

  2. 使用tomcat7创建异步servlet

    该篇文章翻译自:http://developerlife.com/tutorials/?p=1437 一.简介 Servlet API 3.0 之前,需要使用类似Comet的方式来实现创建异步的Ser ...

  3. Filter 快速开始 异步Servlet 异步请求 AsyncContext 异步线程 异步派发 过滤器拦截

    [web.xml] <filter> <filter-name>normalFilter</filter-name> <filter-class>net ...

  4. 异步Servlet和异步过虑器

    异步处理功能可以节约容器线程.此功能的作用是释放正在等待完成的线程,是该线程能够被另一请求所使用. 要编写支持异步处理的 Servlet 或者过虑器,需要设置 asyncSupported 属性为 t ...

  5. 关于servlet3.0中的异步servlet

    刚看了一下维基百科上的介绍,servlet3.0是2009年随着JavaEE6.0发布的: 到现在已经有六七年的时间了,在我第一次接触java的时候(2011年),servlet3.0就已经出现很久了 ...

  6. 异步Servlet的理解与实践

    AsyncContext理解 Servlet 3.0(JSR315)定义了Servlet/Filter的异步特性规范. 怎么理解"异步Servlet/Filter"及其使用情景? ...

  7. 异步servlet的原理探究

    异步servlet是servlet3.0开始支持的,对于单次访问来讲,同步的servlet相比异步的servlet在响应时长上并不会带来变化(这也是常见的误区之一),但对于高并发的服务而言异步serv ...

  8. 监听器第一篇【基本概念、Servlet各个监听器】

    什么是监听器 监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行. 为什么我们要使用监听器 ...

  9. Tomcat怎么实现异步Servlet

    有时Servlet在生成响应报文前必须等待某些耗时的操作,比如在等待一个可用的JDBC连接或等待一个远程Web服务的响应.对于这种情况servlet规范中定义了异步处理方式,由于Servlet中等待阻 ...

随机推荐

  1. POJ1797 Heavy Transportation

    解题思路:典型的Kruskal,不能用floyed(会超时),上代码: #include<cstdio> #include<cstring> #include<algor ...

  2. 【解题报告】[动态规划] - PID90 / 未出现的子串

    原题地址:http://www.rqnoj.cn/problem/90 解题思路:题目看起来不太像动态规划... 我用一个数组f[i][j]来表示在数组第i个元素的后面第一次出现j的位置,为-1则是没 ...

  3. 我所常用的git命令

    说明公司向用git来管理项目的代码,我以前只是在eclipse中使用菜单来操作git,现在,学习一下命令,这样也不用安装各种git客户端软件了.git安装在官网上下载git,安装完成之后,在命令行中输 ...

  4. C++11新特性之线程操作

    C++11之前没有对并发编程提供语言级别的支持,这使得我们在编写可移植的并发程序时,存在诸多的不便.现在C++11增加了线程以及线程相关的类,很方便地支持了并发编程,使得编写的多线程程序的可移植性得到 ...

  5. 模糊聚类算法(FCM)

    伴随着模糊集理论的形成.发展和深化,RusPini率先提出模糊划分的概念.以此为起点和基础,模糊聚类理论和方法迅速蓬勃发展起来.针对不同的应用,人们提出了很多模糊聚类算法,比较典型的有基于相似性关系和 ...

  6. 【java反射】Class类型的相关操作演练

    [一]获取范型接口的实现类的范型类型 (1)范型接口 package org.springframework.context; import java.util.EventListener; publ ...

  7. java 执行JavaScript 以及容器化的问题

    1. 可选方案     a. jdk 6 开始内置的Rhino 引擎   b. jdk8 替换的nashorn (性能高,对于ECMA 支持更好)   c. java 版的nodejs vertx.i ...

  8. bzoj 2119 股市的预测 —— 枚举关键点+后缀数组

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2119 思路就是对于这个形如 ABA 的串,枚举 A 的长度,并按照长度分出几块,找到一些关键 ...

  9. ajax()函数传值中文乱码解决方法介绍

    jquery的ajax()函数传值中文乱码解决方法介绍,需要的朋友可以参考下 复制代码 代码如下: $.ajax({ dataType : ‘json',type : ‘POST',url : ‘ht ...

  10. Delphi从Internet下载文件

    Delphi从Internet下载文件   今天在做拍卖系统的时候,因考虑到网络状况问题,需要将拍品所有信息下载到本机,包括拍品图片,因此需要实现从Internet下载文件的功能.      下面是代 ...