SpringBoot深入分析webmvc和webflux的區(qū)別
webmvc和webflux作為spring framework的兩個重要模塊,代表了兩個IO模型,阻塞式和非阻塞式。

1、webmvc
webmvc是基于servlet的阻塞式模型,一個請求到達(dá)服務(wù)器后會單獨(dú)分配一個線程去處理請求,如果請求包含IO操作,線程在IO操作結(jié)束之前一直處于阻塞等待狀態(tài),這樣線程在等待IO操作結(jié)束的時間就浪費(fèi)了。
2、webflux
webflux是一個異步非阻塞式的 Web 框架,它能夠充分利用多核 CPU 的硬件資源去處理大量的并發(fā)請求。
webflux內(nèi)部使用的是響應(yīng)式編程(Reactive Programming),以 Reactor 庫為基礎(chǔ),基于異步和事件驅(qū)動,可以讓我們在不擴(kuò)充硬件資源的前提下,提升系統(tǒng)的吞吐量和伸縮性。
Reactor 是一個反應(yīng)式庫,用于根據(jù)反應(yīng)式流規(guī)范在 JVM 上構(gòu)建非阻塞應(yīng)用。它是完全非阻塞的,支持在 Netty,Undertow 和 Servlet 3.1+容器等服務(wù)器上運(yùn)行。
Reactor 項(xiàng)目提供兩種類型的發(fā)布者:
- Flux 是產(chǎn)生 0 到 N 個值的發(fā)布者,返回多個元素的操作使用此類型;
- Mono 是產(chǎn)生 0 到 1 值的發(fā)布者,它用于返回單個元素的操作;
3、webflux實(shí)例
添加依賴
<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 被調(diào)用了");
return Mono.just("hello webflux " + name);
}
}
測試

4、小結(jié)
- WebFlux 并不能使接口的響應(yīng)時間縮短,它僅僅能夠提升吞吐量和伸縮性;
- WebFlux內(nèi)部使用的是響應(yīng)式編程,以Reactor庫為基礎(chǔ),基于異步和事件驅(qū)動,特別適合應(yīng)用在IO密集型的服務(wù)中,如網(wǎng)關(guān);
- WebFlux并不是Spring MVC的替代方案;
- WebFlux默認(rèn)情況下使用Netty作為服務(wù)器,不支持MySQL;
- WebFlux的前端控制器是DispatcherHandler,而Spring MVC是DispatcherServlet;
- WebFlux支持兩種編程風(fēng)格,一種是Spring MVC的注解形式,另一種就是Java 8 Lambda函數(shù)式編程;
- Reactor類型:Mono返回0或者1個元素,即單個對象;Flux返回N個元素,即List列表對象;
- Webflux中沒有攔截器這個概念,要做類似的工作需要在過濾器中完成,項(xiàng)目中我們用到Token驗(yàn)證,使用方法是注冊過濾器;
- Webflux中可以使用@ControllerAdvice注冊全局異常處理器,但它僅Controller中拋出的異常生效,無法顧及到過濾器。對異常,推薦的方式是注冊WebExceptionHandler;
到此這篇關(guān)于SpringBoot深入分析webmvc和webflux的區(qū)別的文章就介紹到這了,更多相關(guān)SpringBoot webmvc和webflux內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot3中Spring?WebFlux?SSE服務(wù)器發(fā)送事件的實(shí)現(xiàn)步驟
- springboot webflux 過濾器(使用RouterFunction實(shí)現(xiàn))
- SpringBoot之webflux全面解析
- Springboot WebFlux集成Spring Security實(shí)現(xiàn)JWT認(rèn)證的示例
- 詳解Spring Boot2 Webflux的全局異常處理
- 解決spring-boot2.0.6中webflux無法獲得請求IP的問題
- Spring?Boot?3.4.3?基于?Spring?WebFlux?實(shí)現(xiàn)?SSE?功能(代碼示例)
相關(guān)文章
Java分布式鎖、分布式ID和分布式事務(wù)的實(shí)現(xiàn)方案
在分布式系統(tǒng)中,分布式鎖、分布式ID和分布式事務(wù)是常用的組件,用于解決并發(fā)控制、唯一標(biāo)識和數(shù)據(jù)一致性的問題,本文將介紹Java中常用的分布式鎖、分布式ID和分布式事務(wù)的實(shí)現(xiàn)方案,并通過具體的示例代碼演示它們的用法和應(yīng)用場景2023-06-06
Java網(wǎng)絡(luò)編程實(shí)例——簡單模擬在線聊天
學(xué)了java網(wǎng)絡(luò),也是該做個小案例來鞏固一下了。本次案例將使用UDP和多線程模擬即時聊天,簡單練練手。2021-05-05
Java線程池隊(duì)列PriorityBlockingQueue和SynchronousQueue詳解
這篇文章主要為大家介紹了Java線程池隊(duì)列PriorityBlockingQueue和SynchronousQueue詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
IDEA修改java文件后 不用重啟Tomcat服務(wù)便可實(shí)現(xiàn)自動更新
這篇文章主要介紹了IDEA修改java文件后 不用重啟Tomcat服務(wù)便可實(shí)現(xiàn)自動更新,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11
java實(shí)現(xiàn)求只出現(xiàn)一次的數(shù)字
本文主要介紹了java實(shí)現(xiàn)求只出現(xiàn)一次的數(shù)字,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02
java數(shù)據(jù)結(jié)構(gòu)與算法之希爾排序詳解
這篇文章主要介紹了java數(shù)據(jù)結(jié)構(gòu)與算法之希爾排序,結(jié)合實(shí)例形式分析了希爾排序的概念、原理、實(shí)現(xiàn)方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-05-05

