SpringBoot深入分析webmvc和webflux的區(qū)別
webmvc和webflux作為spring framework的兩個(gè)重要模塊,代表了兩個(gè)IO模型,阻塞式和非阻塞式。
1、webmvc
webmvc是基于servlet的阻塞式模型,一個(gè)請(qǐng)求到達(dá)服務(wù)器后會(huì)單獨(dú)分配一個(gè)線程去處理請(qǐng)求,如果請(qǐng)求包含IO操作,線程在IO操作結(jié)束之前一直處于阻塞等待狀態(tài),這樣線程在等待IO操作結(jié)束的時(shí)間就浪費(fèi)了。
2、webflux
webflux是一個(gè)異步非阻塞式的 Web 框架,它能夠充分利用多核 CPU 的硬件資源去處理大量的并發(fā)請(qǐng)求。
webflux內(nèi)部使用的是響應(yīng)式編程(Reactive Programming),以 Reactor 庫為基礎(chǔ),基于異步和事件驅(qū)動(dòng),可以讓我們?cè)诓粩U(kuò)充硬件資源的前提下,提升系統(tǒng)的吞吐量和伸縮性。
Reactor 是一個(gè)反應(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 個(gè)值的發(fā)布者,返回多個(gè)元素的操作使用此類型;
- Mono 是產(chǎn)生 0 到 1 值的發(fā)布者,它用于返回單個(gè)元素的操作;
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); } }
測(cè)試
4、小結(jié)
- WebFlux 并不能使接口的響應(yīng)時(shí)間縮短,它僅僅能夠提升吞吐量和伸縮性;
- WebFlux內(nèi)部使用的是響應(yīng)式編程,以Reactor庫為基礎(chǔ),基于異步和事件驅(qū)動(dòng),特別適合應(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個(gè)元素,即單個(gè)對(duì)象;Flux返回N個(gè)元素,即List列表對(duì)象;
- Webflux中沒有攔截器這個(gè)概念,要做類似的工作需要在過濾器中完成,項(xiàng)目中我們用到Token驗(yàn)證,使用方法是注冊(cè)過濾器;
- Webflux中可以使用@ControllerAdvice注冊(cè)全局異常處理器,但它僅Controller中拋出的異常生效,無法顧及到過濾器。對(duì)異常,推薦的方式是注冊(cè)WebExceptionHandler;
到此這篇關(guān)于SpringBoot深入分析webmvc和webflux的區(qū)別的文章就介紹到這了,更多相關(guān)SpringBoot webmvc和webflux內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(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無法獲得請(qǐng)求IP的問題
- Spring?Boot?3.4.3?基于?Spring?WebFlux?實(shí)現(xiàn)?SSE?功能(代碼示例)

使用Java構(gòu)造和解析Json數(shù)據(jù)的兩種方法(詳解二)

SpringBoot 內(nèi)嵌 camunda的配置方法

一文帶你掌握J(rèn)ava開發(fā)者如何接入并使用DeepSeek

eclipse中沒有SERVER的解決辦法(超詳細(xì))