Spring5的WebFlux跟WebMvc對比

建立一個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. javascript

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 的路由行爲,從而達到接受請求。html

驗證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秒左右,請求多數被拒絕。
相關文章
相關標籤/搜索