Spring5的WebFlux跟WebMvc對比

Koali發表於2018-07-26

建立一個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秒左右,請求多數被拒絕。

相關文章