新聞中心
對(duì) Java 開發(fā)者來說,2017 年 9 月是個(gè)熱鬧的月份不但 Java SE 9、Java EE 8 相繼發(fā)布,就連 Spring 框架,也在這段時(shí)間發(fā)布 5.0 正式版。

十載的如皋網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。營(yíng)銷型網(wǎng)站的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整如皋建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)從事“如皋網(wǎng)站設(shè)計(jì)”,“如皋網(wǎng)站推廣”以來,每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
而新版 Spring 的一大特色,就是 Reactive Web 方案 Web Flux,這是用來替代 Spring Web MVC 的嗎?或者,只是終于可以不再基于 Servlet 容器了?
基于 Servlet 容器的 Web MVC
身為 Java 開發(fā)者,對(duì)于 Spring 框架并不陌生。它起源于 2002 年、Rod Johnson 著作《Expert One-on-One J2EE Design and Development》中的 Interface 21 框架,到了 2004 年,推出 Spring 1.0,從 XML 到 3.0 之后,支持 JavaConfig 設(shè)定;進(jìn)一步,在 2014 年時(shí),除了 Spring 4.0 之外,***發(fā)表了Spring Boot,***的亮點(diǎn)是采用自動(dòng)組態(tài),令基于 Spring 的快速開發(fā)成為可能。
對(duì) Web 開發(fā)者來說,Spring 中的 Web MVC 框架,也一直隨著 Spring 而成長(zhǎng),然而由于基于 Servlet 容器,早期被批評(píng)不易測(cè)試(例如:控制器中包含了 Servlet API)。
不過,從實(shí)操 Controller 介面搭配 XML 設(shè)定,到后來的標(biāo)注搭配 JavaConfig,Web MVC 使用越來越便利。如果愿意,也可采用漸進(jìn)的方式,將基于 Servlet API 的 Web 應(yīng)用程序,逐步重構(gòu)為幾乎沒有 Servlet API 的存在,在程序代碼層面達(dá)到屏蔽 Servlet API 的效果。
由于不少 Java 開發(fā)者的 Web 開發(fā)經(jīng)驗(yàn),都是從 Servlet 容器中累積起來的,在這個(gè)時(shí)候,Web MVC 框架基于 Servlet API,就會(huì)是一項(xiàng)優(yōu)點(diǎn)。因?yàn)椋m然運(yùn)用 Web MVC 編寫程序時(shí),可做到不直接面對(duì) Servlet API,然而,也意味著更強(qiáng)烈地受到 Spring 的約束,有時(shí)則是無法在設(shè)定或 API 中找到對(duì)應(yīng)方案,有時(shí)也因?yàn)樾闹悄P瓦€是掛在 Servlet 容器,經(jīng)驗(yàn)上難以脫離,在搞不出 HttpSession、ServletContext 對(duì)應(yīng)功能時(shí),直接從 HttpSession、ServletContext 下手,畢竟也是個(gè)方法。
編寫程序時(shí),就算沒用到 Servlet API,Web MVC 基于 Servlet 容器仍是事實(shí),因?yàn)椋讓舆€是得借助Servlet 容器的功能,例如 Spring Security,本質(zhì)上還是基于 Servlet 容器的 Filter 方案。
然而在今日,Servlet 被許多開發(fā)者視為陳舊、過時(shí)技術(shù)的象征,或許是因?yàn)檫@樣,在 Java EE 8 宣布推出的這段期間,當(dāng)在某些場(chǎng)合談及 Servlet 4.0 之時(shí),總會(huì)聽到有人提出“Web Flux 可以脫離 Servlet 了”之類的建議。
實(shí)現(xiàn) Reactive Streams 的 Reactor
Web Flux 不依賴 Servlet 容器是事實(shí),然而,在談及 Web Flux 之前,我們必須先知道 Reactor 項(xiàng)目,它是由 Pivotal 公司,也就是目前 Spring 的擁有者推出,實(shí)現(xiàn)了 Reactive Streams 規(guī)范,用來支持 Reactive Programming 的實(shí)作品。
既然是實(shí)現(xiàn)了 Reactive Streams 規(guī)范,開發(fā)者必然會(huì)想到的是 RxJava/RxJava 2,或者是 Java 9 的 Flow API。這也意謂著,在能使用 Web Flux 之前,開發(fā)者必須對(duì)于 Reactive Programming 典范,有所認(rèn)識(shí)。
開發(fā)者這時(shí)有疑問了,Spring 為何不直接基于 RxJava 2,而是打造專屬的 Reactive Streams 項(xiàng)目呢?
就技術(shù)而言,Reacto r是在 Java 8 的基礎(chǔ)上開發(fā),并全面擁抱 Java 8 之后的新 API,像是 Lambda 相關(guān)介面、新日期與時(shí)間 API 等,這意謂著,項(xiàng)目如果還是基于 Java 7 或更早版本,就無法使用 Reactor。
在 API 層面,RxJava 2 有著因?yàn)闅v史發(fā)展脈絡(luò)的原因,不得不保留一些令人容易困惑或混淆的型態(tài)或操作,而 Reactor 在這方面,都有著明確的對(duì)應(yīng) API 來取代,然而,卻也提供與 RxJava 2(甚至是 Flow API)間的轉(zhuǎn)換。
另一方面,Reactor 較直覺易用,例如最常介紹的 Mono 與 Flux,實(shí)現(xiàn)了 Reactive Streams 的 Publisher界面,并簡(jiǎn)化了信息發(fā)布,讓開發(fā)者在許多場(chǎng)合,不用處理 Subscriber 和 Subscription 的細(xì)節(jié)(當(dāng)然,這些在 Reactor 也予以實(shí)現(xiàn))。而在 Spring Web Flux 中,Mono 與 Flux 也是主要的操作對(duì)象。想知道如何使用Mono與Flux,可以參考〈使用 Reactor 進(jìn)行反應(yīng)式編程〉(https://goo.gl/vc2fGc)。
又一個(gè) Web 框架?
到了 Spring 5,在 Reactor 的基礎(chǔ)上,新增了 Web Flux 作為 Reactive Web 的方案,我們?cè)谠S多介紹文件的簡(jiǎn)單示例,例如〈使用 Spring 5 的 WebFlux 開發(fā)反應(yīng)式 Web 應(yīng)用〉(https://goo.gl /G5uotZ),就看到當(dāng)中使用了 Flux、Mono 來示范,而且,程序的代碼看起來就像是 Spring MVC。
這是因?yàn)?Web Flux 提供了基于 Java 標(biāo)注的方式,有許多 Web MVC 中使用的標(biāo)注,也拿來用在 Web Flux 之中,讓熟悉 Web MVC 的開發(fā)者也容易理解與上手 Web Flux,然而,這不過就是新的 Web 框架嗎?
實(shí)際上,當(dāng)然不是如此。Web Flux 并不依賴 Web MVC,而且它是基于 Reactor,本質(zhì)屬于非同步、非阻斷、Reactive Programming 的心智模型,也因此,如果打算將 Web Flux 運(yùn)行在 Servlet 容器之上,必須是支持 Servlet 3.1 以上,因?yàn)椴庞蟹亲钄噍斎胼敵龅闹С?,雖然 Web Flux 的 API 在某些地方,確實(shí)提供了阻斷的選項(xiàng),若單純只是試著將基于 Web MVC 的應(yīng)用程序,改寫為套用 Web Flux,并不會(huì)有任何益處,反而會(huì)窮于應(yīng)付如何在 Web Flux 實(shí)現(xiàn)對(duì)應(yīng)的方案。
例如,此時(shí),Spring Security 顯然就不能用了,畢竟是 Spring 基于 Servlet 的安全方案,開發(fā)者必須想辦法套用 Spring Security Reactive;而且,在儲(chǔ)存方案上,也不是直接采用 Spring Data,而是 Spring Data Reactive 等。
就算能套用相關(guān)的設(shè)定與 API,要能獲得 Web Flux 的益處,應(yīng)用程序中相關(guān)的元件,也必須全面檢視,重新設(shè)計(jì)為非阻斷、基于 Reactive Programming 方式,這或許才是最困難、麻煩的部份。
除了基于 Java 標(biāo)注的方式,讓熟悉 Web MVC 的開發(fā)者容易理解之外,Web Flux 還提供了基于函數(shù)式的設(shè)計(jì)與組態(tài)方式。
實(shí)際上,在運(yùn)用 RxJava 2/Reacto r等 Reactive Streams 的實(shí)操時(shí),我們也都必須熟悉函數(shù)式的思考方式,才能充分掌握,這點(diǎn)在 Web Flux 并不例外。
可以脫離 Servlet 容器了?
Servlet 容器是個(gè)舊時(shí)代的象征,如果能夠屏蔽 Servlet 容器或相關(guān) API,許多開發(fā)者應(yīng)該都會(huì)很開心,可以少一層抽象,不必使用肥肥的 Servlet 容器,當(dāng)然會(huì)是使用 Web Flux 時(shí)附帶的優(yōu)點(diǎn),然而,如果只是為了屏蔽 Servlet,其實(shí),早就有其他技術(shù)選擇存在。
基于 Servlet 一路發(fā)展過來的 Web MVC,雖然目前在某些地方可以安插一些函數(shù)式的設(shè)計(jì),然而,本質(zhì)上不變的部分在于,在技術(shù)堆疊中所隱含的,仍是一個(gè)基于同步、阻斷式、命令式的心智模型。如果在這樣的堆疊中,開發(fā)者老是因?yàn)橄胍獙?shí)現(xiàn)非同步、非阻斷、Reactive、函數(shù)式而感到不快,Web Flux 也許才會(huì)是可考慮的方案,而不單只是用來作為脫離 Servlet 容器,Web MVC 的替代品。
整體而言,Web Flux 還算是新技術(shù),也還有待時(shí)間驗(yàn)證可行性,如果只是為了想用 Web Flux 來取代 Web MVC,或者更小一點(diǎn)的野心,只是想要能脫離 Servlet 容器,***在采取行動(dòng)之前,全面檢視一下,確認(rèn)自身或團(tuán)隊(duì)成員是否準(zhǔn)備好接受 Web Flux 的心智模型,或者真的存在著對(duì)應(yīng)的應(yīng)用場(chǎng)景吧。
網(wǎng)站名稱:Flux會(huì)取代WebMVC或可不再基于Servlet容器了?
瀏覽地址:http://fisionsoft.com.cn/article/djpjisg.html


咨詢
建站咨詢
