SpringBoot深入分析webmvc和webflux的區(qū)別
webmvc和webflux作為spring framework的兩個重要模塊,代表了兩個IO模型,阻塞式和非阻塞式。
1、webmvc
webmvc是基于servlet的阻塞式模型,一個請求到達服務器后會單獨分配一個線程去處理請求,如果請求包含IO操作,線程在IO操作結束之前一直處于阻塞等待狀態(tài),這樣線程在等待IO操作結束的時間就浪費了。
2、webflux
webflux是一個異步非阻塞式的 Web 框架,它能夠充分利用多核 CPU 的硬件資源去處理大量的并發(fā)請求。
webflux內部使用的是響應式編程(Reactive Programming),以 Reactor 庫為基礎,基于異步和事件驅動,可以讓我們在不擴充硬件資源的前提下,提升系統(tǒng)的吞吐量和伸縮性。
Reactor 是一個反應式庫,用于根據反應式流規(guī)范在 JVM 上構建非阻塞應用。它是完全非阻塞的,支持在 Netty,Undertow 和 Servlet 3.1+容器等服務器上運行。
Reactor 項目提供兩種類型的發(fā)布者:
- Flux 是產生 0 到 N 個值的發(fā)布者,返回多個元素的操作使用此類型;
- Mono 是產生 0 到 1 值的發(fā)布者,它用于返回單個元素的操作;
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的區(qū)別的文章就介紹到這了,更多相關SpringBoot webmvc和webflux內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
一文帶你掌握Java開發(fā)者如何接入并使用DeepSeek
對于Java開發(fā)者來說,將DeepSeek集成到項目中,可以極大地提升數據處理和分析的效率,下面小編就來為大家介紹一下具體的調用方法吧2025-03-03