SpringBoot深入分析webmvc和webflux的區別

webmvc和webflux作為spring framework的兩個重要模塊,代表瞭兩個IO模型,阻塞式和非阻塞式。

1、webmvc

webmvc是基於servlet的阻塞式模型,一個請求到達服務器後會單獨分配一個線程去處理請求,如果請求包含IO操作,線程在IO操作結束之前一直處於阻塞等待狀態,這樣線程在等待IO操作結束的時間就浪費瞭。

2、webflux

webflux是一個異步非阻塞式的 Web 框架,它能夠充分利用多核 CPU 的硬件資源去處理大量的並發請求。

webflux內部使用的是響應式編程(Reactive Programming),以 Reactor 庫為基礎,基於異步和事件驅動,可以讓我們在不擴充硬件資源的前提下,提升系統的吞吐量和伸縮性。

Reactor 是一個反應式庫,用於根據反應式流規范在 JVM 上構建非阻塞應用。它是完全非阻塞的,支持在 Netty,Undertow 和 Servlet 3.1+容器等服務器上運行。

Reactor 項目提供兩種類型的發佈者:

  • Flux 是產生 0 到 N 個值的發佈者,返回多個元素的操作使用此類型;
  • Mono 是產生 0 到 1 值的發佈者,它用於返回單個元素的操作;

3、webflux實例

添加依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

添加controller

@Slf4j
@RestController
@RequestMapping("/api/user")
public class UserReactiveController {
    @RequestMapping(value = "/hello")
    public Mono<Object> hello(@RequestParam(name = "name") String name) {
        log.info("方法 hello 被調用瞭");
        return Mono.just("hello webflux " + name);
    }
}

測試

4、小結

  • WebFlux 並不能使接口的響應時間縮短,它僅僅能夠提升吞吐量和伸縮性;
  • WebFlux內部使用的是響應式編程,以Reactor庫為基礎,基於異步和事件驅動,特別適合應用在IO密集型的服務中,如網關;
  • WebFlux並不是Spring MVC的替代方案;
  • WebFlux默認情況下使用Netty作為服務器,不支持MySQL;
  • WebFlux的前端控制器是DispatcherHandler,而Spring MVC是DispatcherServlet;
  • WebFlux支持兩種編程風格,一種是Spring MVC的註解形式,另一種就是Java 8 Lambda函數式編程;
  • Reactor類型:Mono返回0或者1個元素,即單個對象;Flux返回N個元素,即List列表對象;
  • Webflux中沒有攔截器這個概念,要做類似的工作需要在過濾器中完成,項目中我們用到Token驗證,使用方法是註冊過濾器;
  • Webflux中可以使用@ControllerAdvice註冊全局異常處理器,但它僅Controller中拋出的異常生效,無法顧及到過濾器。對異常,推薦的方式是註冊WebExceptionHandler;

到此這篇關於SpringBoot深入分析webmvc和webflux的區別的文章就介紹到這瞭,更多相關SpringBoot webmvc和webflux內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: