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. 9.链表中倒数第k个结点[FindReverseKthLinkedListNode]

    [题目] 输入一个单向链表,输出该链表中倒数第k个结点.链表的倒数第0个结点为链表的尾指针.链表结点定义如下:  C++ Code  12345   struct ListNode {     int ...

  2. squid http_access中的逻辑关系

    http_access通过acl实现访问控制,方法 acl A acltype argument acl B acltype argument 逻辑关系:或 http_access allow|den ...

  3. my vim IDE 编辑器的配置

    <h4>1.自定义编辑.vimrc的快捷键</h4><blockquote>"Set mapleaderlet mapleader = ",&q ...

  4. HDU - 6430:TeaTree (线段树合并)

    Recently, TeaTree acquire new knoledge gcd (Greatest Common Divisor), now she want to test you. As w ...

  5. Socket通信简单实例(WCF调用Socket)

    服务端: 控制台程序监听 /// <summary> /// Server /// </summary> class Program { static Socket serve ...

  6. SqlServer 数据表数据移动

    描述:将Test1表中的数据放到Test2表中 1.Test2表不存在 select A,B,C insert into Test2 from Test1 select * into Test2 fr ...

  7. CSS书写格式

    转自: https://segmentfault.com/a/1190000005046830 CSS书写格式 1.格式化代码 1.1文件 [建议]:CSS文件使用无BOM的UTF-8编码 1.2缩进 ...

  8. MVC 控制器之间传值学习——session

    刚接触MVC不久,写的一些代码自己都不忍心看下去.路漫漫其修远兮,宝宝还需努力!之前只用过Session做登录时用户信息的储存,今天对集合类数据做了小小的尝试:利用session在控制器之间传值,以减 ...

  9. java代码求奖金。要求从键盘输入利润

    总结:看似文字描述很多, package com.ai; import java.util.Scanner; import com.b.Scaner; //v企业发放的奖金根据利润提成.利润(I)低于 ...

  10. 学习笔记::fft

    上次学fft还是5月份,昨天发现已经忘记怎么推导了,代码也看不懂了,就又学习了一发,大概是看menci的博客 0.fft可以进行多项式乘法,朴素的乘法跟手算一样是O(n^2),fft可以通过分治做到n ...