網(wǎng)頁設(shè)計素材網(wǎng)站有哪些怎么自己弄一個網(wǎng)站
Spring WebFlux
Spring WebFlux 簡稱 WebFlux ,是 spring5.0 新引入的一個框架。
SpringBoot 同樣為 WebFlux 提供了自動配置。
Spring WebFlux 和 Spring MVC 是屬于競爭關(guān)系,都是框架。在一個項目中兩個也可以同時存在。
SpringMVC 是基于 Servlet API 的, 是屬于同步的框架,就是有請求過來,SpringMVC 去獲取請求數(shù)據(jù)的時候,如果這條數(shù)據(jù)沒有讀取到,那么這條讀取數(shù)據(jù)的線程就一直被阻塞的,意味著得專門有一條線程來處理每個請求,就是客戶端每發(fā)來一個請求,服務(wù)器這邊就得分配一條線程去處理請求。因此在高并發(fā)的時候,SpringMVC是會存在一些限制的。
WebFlux 是基于反應(yīng)式的 API ,脫離了 Servlet API ,反應(yīng)式的 API 是一個異步的,不需要為每個請求生成單獨的線程去處理。
Spring WebFlux 是集成了 Reactor框架 / 基于Reactor框架
Spring WebFlux和Reactor底層默認(rèn)使用 Netty 作為Web服務(wù)器
★ Reactor框架(反應(yīng)式框架)
Reactor框架采用Mono和Flux兩個類代表消息發(fā)布者,因此它們都實現(xiàn)了CorePublisher<T>接口,它們的區(qū)別在于:- Mono代表0~1個非阻塞數(shù)據(jù);而Flux則代表0~N數(shù)據(jù)個非阻塞序列。
- Mono相當(dāng)于只是一個Optional值;而Flux才是Stream?;驹?#xff0c;其實就是基于 消息發(fā)布 - 消息訂閱 的異步通信方式。
★ Spring WebFlux
Spring WebFlux就是基于Reactor實現(xiàn)的,其中Flux名稱就是來自Reactor中的Flux類,WebFlux包括了
對反應(yīng)式HTTP、服務(wù)器推送事件(SSE:Server Send Event)及WebSocket的支持。Spring WebFlux提供了兩種開發(fā)方式:
- 使用類似Spring MVC的注解方式。在這種方式下,依然使用@Controller、@RequestMapping等注解修飾類、方法即可。
- 使用函數(shù)式編程模型的方式。在這種方式下,程序使用RouterFunction來注冊映射地址和處理器方法之間路由關(guān)系。上面這兩種編程模型只是形式上有所不同(代碼編寫方式上存在不同),它們本質(zhì)上完全是一樣的,它們都運(yùn)行在相同的反應(yīng)式流的基礎(chǔ)之上。
★ Spring MVC VS Spring WebFlux
================================Spring MVC ================================--- Spring MVC 基于傳統(tǒng)Servlet,服務(wù)器需要使用很大的線程池才能支持大量的并發(fā)請求;HttpServletRequest來獲取請求參數(shù):getParameter(),它是一個典型的同步方法,該方法的返回值是String類型。
——這意味著在沒有獲取請求參數(shù)之前,該方法就會阻塞線程,這就是同步。HttpServletResponse來生成響應(yīng),它也是同步:服務(wù)器生成的響應(yīng)完全發(fā)送給客戶端之前,該線程什么也做不了。這種同步的設(shè)計意味著,每當(dāng)一個客戶端請求到來時,必須啟動單獨的線程來為該請求提供服務(wù)。當(dāng)請求的并發(fā)數(shù)量非常大時,只能通過水平的集群擴(kuò)展、增加更多集群節(jié)點來處理這些并發(fā)請求。================================Spring WebFlux=============================--- Spring WebFlux采用異步、非阻塞的編程模型,底層反應(yīng)式容器無需啟動額外的線程。ServerRequest來獲取請求參數(shù),
比如 bodyToFlux(Class<? extends T> elementClass)、bodyToMono(Class<? extends T> elementClass)、formData()
這些的返回值都是 Flux 或 Mono 而 Flux 和 Mono 都并不是最終的數(shù)據(jù) ,因此無需同步、阻塞等待數(shù)據(jù)的到來,Mono和Flux都是CorePublisher因此它們可以說只是消息發(fā)布者(或者說是一個消息通道,可以不管獲取的消息是否有數(shù)據(jù)),而嘗試獲取消息的程序就是消息訂閱者。這意味著程序在獲取Flux或Mono之后,完全可以繼續(xù)向下執(zhí)行,無需阻塞線程。Spring WebFlux的最大優(yōu)勢在于:能以較小的、固定數(shù)量的線程和更少的內(nèi)存處理更多的并發(fā)請求,因此Spring WebFlux可以在高負(fù)載的情況具有更好的可伸縮性——因為無需顯著增加線程和內(nèi)存。Spring MVC適用于同步處理的場景,Spring WebFlux適用于異步處理的場景,尤其在大量IO密集型(比如Spring Cloud網(wǎng)關(guān))的服務(wù)中使用Spring WebFlux比較適合。
★ Spring WebFlux的自動配置
Spring WebFlux的自動配置主要由WebFluxAutoConfiguration自動配置類負(fù)責(zé)提供支持。自動配置在Spring WebFlux默認(rèn)功能的基礎(chǔ)上添加了如下特性:- 為HttpMessageReader和HttpMessageWriter實例配置了codecs。
- 對服務(wù)器靜態(tài)資源提供支持,包括對WebJars的支持。
★ 對WebFlux自動配置進(jìn)行定制
若要在保留自動配置的基礎(chǔ)上增加一些自定義的Spring WebFlux配置(例如添加攔截器、格式化器、視圖控制器等),則可通過實現(xiàn)自己的WebFluxConfigurer類,并使用@Configuration注解修飾該類、但不要使用@EnableWebFlux注解修飾。實現(xiàn)該類的如下方法:- addFormatters(FormatterRegistry registry):添加格式化器
- configureArgumentResolvers(ArgumentResolverConfigurer configurer):配置參數(shù)解析器
- configurePathMatching(PathMatchConfigurer configurer):配置路徑匹配器
- configureViewResolvers(ViewResolverRegistry registry):配置視圖解析器
...
★ 全面接管
如果使用@Configuration和@EnableWebFlux注解同時修飾自己的Spring WebFlux配置類。這意味著完全關(guān)閉了Spring WebFlux的自動配置,開發(fā)者必須手動完成所有關(guān)于Spring WebFlux的配置工作。
★ 靜態(tài)資源處理
(完全類似于Spring Boot對Spring MVC所提供的靜態(tài)資源處理)
與Spring MVC類似,Spring Boot同樣使用類加載路徑下/static目錄(或/public或/resources或/META-INF/resources)
或應(yīng)用根路徑作為WebFlux的靜態(tài)資源路徑。 如需添加靜態(tài)資源路徑,可提供WebFluxConfigurer實現(xiàn)類,通過實現(xiàn)addResourceHandlers()方法可添加自定義的靜態(tài)資源目錄如果要更改,覆蓋原來的靜態(tài)資源目錄,可通過spring.web.resources.static-locations來覆蓋系統(tǒng)原有的靜態(tài)資源目錄。同樣支持版本無關(guān)的靜態(tài)資源和靜態(tài)資源緩存清除
★ 圖標(biāo)和首頁
(完全類似于Spring Boot對Spring MVC的首頁和圖標(biāo)支持)
與Spring MVC類似,Spring WebFlux同樣可使用靜態(tài)資源路徑下的index.html或templates路徑下index模板作為應(yīng)用的首頁。Spring WebFlux同樣會使用靜態(tài)資源路徑下的favicon.ico文件作為應(yīng)用的圖標(biāo)。