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