zoukankan      html  css  js  c++  java
  • WebFlux01 webflux概念、异步servlet、WebFlux意义

    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>
    View Code

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

          》效果演示

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

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

      3.2 WebFlux的流式返回

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

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

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

      

  • 相关阅读:
    python编写爬虫脚本并实现APScheduler调度
    python实践设计模式(一)概述和工厂模式
    90、java ftp 读取文件
    91、mysql批量删除表
    92、kkfile打印当前页
    CSS3实践之路(四):文本特效
    CSS3实践之路(六):CSS3的过渡效果(transition)与动画(animation)
    CSS3实践之路(二):盒子模型(box Model)和边框(border)
    CSS3实践之路(三):颜色(Color)和背景(Backgroud)
    谈谈javascript中的定时器
  • 原文地址:https://www.cnblogs.com/NeverCtrl-C/p/9227656.html
Copyright © 2011-2022 走看看