Spring5的WebFlux跟WebMvc对比

10,084 阅读2分钟

创建一个SpringBoot项目

通过Spring Initializr来创建项目

  1. 第一步
    Spring Initializr.png
  2. 然后点击Generate Project之后就可以生成项目并且下载下来。
  3. 解压下载后的项目,然后打开IDEA->File->Open选择项目的pom进行打开。
    路径.png
  4. 这样子一个最简单的SpringBoot项目就搭建成功了。

通过Maven命令来创建SpringBoot项目

  1. 配置好Maven的系统路径.
    image.png
  2. 然后使用命令
mvn archetype:generate  -DinteractiveMode=false -DgroupId=cn.koali -DartifactId=springboot_demo -Dversion=1.0.0-SNAPSHOT

各个参数的含义参考官网 3.

image.png
创建成功,会提示项目生成的地址。
4. 然后同理使用IDEA打开刚刚命令行生成的项目。 5. 接下来打开SpringBoot简单教程
image.png
找到Build with Maven复制依赖等等即可。

通过IDEA来创建SpringBoot项目.

  1. 打开IDEA,然后File->new Project.
    image.png
    填写相应的Group,Artifact,然后选择需要的依赖即可以。

使用Spring5.0的web Flux

Web Flux是什么?

  1. Spring WebFlux是异步,非阻塞的。
  2. WebFlux有Mono,Flux两种集合类型。
  3. Mono是0->1集合类型,比如Mono。
  4. Flux是1->n集合类型,比如Flux<List>
  5. Mono,Flux都是异步处理的,而集合对象基本上是同步的。

Web Flux(Netty)跟Web MVC(Servlet)有什么区别?

  1. Web Flux支持Java 8 lamba表达式。
  2. Web MVC是同步阻塞的IO模型,而Web Flux是异步非阻塞的IO模型。

Web Flux(Netty)跟Web MVC(Servlet)优缺点?

  1. Web Flux的效率(qps)比Web MVC高。
  2. Web Flux的编程难度高,维护成本高,对于切面等不好编写。

Web Flux实践

@Configuration
public class RouterFunctionConfiguration {
    @Bean
    public RouterFunction<ServerResponse> webFlux() {
        return RouterFunctions.route(RequestPredicates.GET("/webFlux"), request -> {
            Mono<String> str = Mono.just("Hello World").delayElement(Duration.ofMillis(10));
            return ServerResponse.ok().body(str, String.class);
        });
    }
}

与Web MVC类似。我们声明我们的路由类为 @Configuration,然后初始化一个Bean。 在Web Flux请求的接口是RequestServer,响应的接口是ResponseServer。 其中RouterFunction提供了route,通过在route这个方法我们设置RequestPredicates 的路由行为,从而达到接受请求。

验证Web Flux和Web MVC哪个效率高

  1. 首先写两个API,一个使用Web Flux,一个使用Web MVC,然后阻塞10秒,假装用户思考了10秒。
//web mvc
    @GetMapping("/webServlet")
    public String webServlet(){
        try {
            TimeUnit.MILLISECONDS.sleep(10);
        } catch (InterruptedException e) {
            return "Error during thread sleep";
        }
        return "Hello World";
    }
//web flux
@Bean
    public RouterFunction<ServerResponse> webFlux() {
        return RouterFunctions.route(RequestPredicates.GET("/webFlux"), request -> {
            Mono<String> str = Mono.just("Hello World").delayElement(Duration.ofMillis(10));
            return ServerResponse.ok().body(str, String.class);
        });
    }
  1. 然后打开Jmeter
    image.png
    假设有1000个用户,循环10次的发起请求。
    image.png
    JMeter分别填写请求的路径
    image.png
    web Flux耗时10秒左右,而且请求不会被拒绝。
    image.png
    web MVC耗时21秒左右,请求多数被拒绝。