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. PHPCMS V9调用父栏目 顶级父栏目的代码

    一.调用父栏目 首先是列表页和二级栏目页list.html {$CATEGORYS[$top_parentid][catname]} //顶级父栏目名称 {$CATEGORYS[$CAT[parent ...

  2. Hadoop集群中节点角色定义

    Hadoop分别从两个角度将主机划分为两种角色. 最基本的划分原则为Master和Slave,即主人和奴隶: 第一,从HDFS的角度,将主机划分为NameNode和DataNode(在分布式文件系统中 ...

  3. git撤销各种状态下的操作

    使用Git时会出现各种各样的问题,下面是几种情况下怎么反悔的操作 一,未加入缓存区,撤销文件修改 git checkout -- file 二,已加入缓存区,撤销文件提交 git reset HEAD ...

  4. ACM学习历程—Codeforces Round #354 (Div. 2)

    http://codeforces.com/contest/676 在allzysyz学弟和hqwhqwhq的邀请下,打了我的第三场CF... 毕竟在半夜..所以本来想水到12点就去睡觉的...结果一 ...

  5. ZenCoding[Emmet]語法簡介【轉】

    快速指南 下面是一些常用的Zen Coding功能,目前VS2013的Web Essentials插件已经支持. '#' 创建一个id特性 '.' 创建一个类特性 '[]' 创建一个自定义特性 '&g ...

  6. vue-cli结构

    |-- build // 项目构建(webpack)相关代码 | |-- build.js // 生产环境构建代码 | |-- check-version.js // 检查node.npm等版本 | ...

  7. HTTP协议-简介

    1.什么是http协议? 百度百科上的解释:超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议.所有的WWW文件都必须遵守这个标准. ...

  8. protobuff java 包编译(Windows)

    google probuffer的强大,很多人都知道,但是官方的source 里是没有jar下载,唯有源码下载,故需自己编译得到jar. java 的jar的编译采用maven 编译的,因此需先构建m ...

  9. kali 软件源 包含virtualbox所需头文件

    # deb cdrom:[Debian GNU/Linux 7.0 _Kali_ - Official Snapshot i386 LIVE/INSTALL Binary 20130905-08:50 ...

  10. 转:Oracle里几组重要的视图--v$sysstat,v$system_event,v$parameter v$system_parameter

    按组分的几组重要的性能视图 1.System 的 over view v$sysstat , v$system_event  , v$parameter,V$instance得到oracle_sid ...