再見了SpringMVC吠式,這個(gè)框架有點(diǎn)厲害陡厘,甚至干掉了Servlet!

來自:oschina(作者:數(shù)據(jù)星河)
原文鏈接(底部鏈接可直達(dá)):
https://my.oschina.net/u/3953752/blog/2051297

前言

對(duì) Java 開發(fā)者來說特占, Spring 發(fā)布了 5.0 正式版后的一大特色糙置,就是 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ù)而言,Reactor 是在 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)式編程〉
又一個(gè) Web 框架颗管?

到了 Spring 5陷遮,在 Reactor 的基礎(chǔ)上,新增了 Web Flux 作為 Reactive Web 的方案垦江,我們?cè)谠S多介紹文件的簡(jiǎn)單示例帽馋,例如〈使用 Spring 5 的 WebFlux 開發(fā)反應(yīng)式 Web 應(yīng)用〉,就看到當(dāng)中使用了 Flux比吭、Mono 來示范绽族,而且,程序的代碼看起來就像是 Spring MVC衩藤。
這是因?yàn)?Web Flux 提供了基于 Java 注解的方式吧慢,有許多 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)椴庞蟹亲钄噍斎胼敵龅闹С郑m然 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 注解的方式,讓熟悉 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)景吧怎诫。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末瘾晃,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子幻妓,更是在濱河造成了極大的恐慌蹦误,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涌哲,死亡現(xiàn)場(chǎng)離奇詭異胖缤,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)阀圾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門哪廓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人初烘,你說我怎么就攤上這事涡真。” “怎么了肾筐?”我有些...
    開封第一講書人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵哆料,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我吗铐,道長(zhǎng)东亦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任唬渗,我火速辦了婚禮典阵,結(jié)果婚禮上奋渔,老公的妹妹穿的比我還像新娘。我一直安慰自己壮啊,他們只是感情好嫉鲸,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著歹啼,像睡著了一般玄渗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上狸眼,一...
    開封第一講書人閱讀 51,165評(píng)論 1 299
  • 那天藤树,我揣著相機(jī)與錄音,去河邊找鬼份企。 笑死也榄,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的司志。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼降宅,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼骂远!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起腰根,我...
    開封第一講書人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤激才,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后额嘿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瘸恼,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年册养,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了东帅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡球拦,死狀恐怖靠闭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情坎炼,我是刑警寧澤愧膀,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站谣光,受9級(jí)特大地震影響檩淋,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜萄金,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一蟀悦、第九天 我趴在偏房一處隱蔽的房頂上張望碳柱。 院中可真熱鬧,春花似錦熬芜、人聲如沸莲镣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)瑞侮。三九已至,卻和暖如春鼓拧,著一層夾襖步出監(jiān)牢的瞬間半火,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工季俩, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留钮糖,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓酌住,卻偏偏與公主長(zhǎng)得像店归,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子酪我,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353