- Java RESTful Web Service實(shí)戰(zhàn)
- 韓陸
- 3015字
- 2018-12-31 14:06:49
推薦序一 ——REST開發(fā)的理想與現(xiàn)實(shí)
REST是一種分布式應(yīng)用的架構(gòu)風(fēng)格,也是一種大流量分布式應(yīng)用的設(shè)計(jì)方法論。REST是由(構(gòu)成了Web基礎(chǔ)架構(gòu)的)HTTP、URI等規(guī)范的主要設(shè)計(jì)者Roy Fileding博士在其2000年的博士論文(中文版名為《架構(gòu)風(fēng)格與基于網(wǎng)絡(luò)應(yīng)用軟件的架構(gòu)設(shè)計(jì)》)中提出的。到目前為止,關(guān)于REST最系統(tǒng)、最全面的論述,仍然是Fielding的博士論文。
REST就是Web(World Wide Web,簡(jiǎn)稱Web或者WWW)本身的架構(gòu)風(fēng)格,是設(shè)計(jì)、開發(fā)Web相關(guān)規(guī)范、Web應(yīng)用、Web服務(wù)的指導(dǎo)原則。不符合REST風(fēng)格要求的架構(gòu)和技術(shù),很難在Web這個(gè)生態(tài)系統(tǒng)中得到繁榮發(fā)展。在我看來,Roy Fielding博士就是15年以來對(duì)于分布式應(yīng)用架構(gòu)設(shè)計(jì)理論貢獻(xiàn)最大的人。Fielding在HTTP規(guī)范的設(shè)計(jì)過程中,并沒有采用當(dāng)時(shí)大行其道的DO(Distributed Object,分布式對(duì)象)風(fēng)格,而是自出機(jī)杼、另辟蹊徑,提出了一整套新的設(shè)計(jì)方法論。Fielding的開創(chuàng)性工作,極大地推動(dòng)了分布式應(yīng)用設(shè)計(jì)理論的發(fā)展。
有趣的是,其實(shí)基于SOAP/WSDL的“大Web Service”(以下簡(jiǎn)稱Web Service),幾乎是與REST同時(shí)發(fā)展起來的。雖然在Web Service中也使用了對(duì)象,但是Web Service其實(shí)是RPC風(fēng)格的,而不是DO風(fēng)格的。Web Service在最初幾年發(fā)展很快,很大原因是它解決了DO風(fēng)格難以解決的異構(gòu)系統(tǒng)(不同的硬件系統(tǒng)、不同操作系統(tǒng)、不同的編程語言,等等)之間互操作性的問題。
然而遺憾的是,設(shè)計(jì)Web Service協(xié)議棧的核心人員,幾乎都是來自于企業(yè)應(yīng)用陣營(yíng)的,尤其是來自于IBM和微軟兩家公司的人。這些企業(yè)應(yīng)用的專家們沒有充分認(rèn)識(shí)到Web基礎(chǔ)架構(gòu)的巨大優(yōu)點(diǎn),甚至可以說并沒有理解HTTP協(xié)議究竟是用來做什么的、為何要如此設(shè)計(jì)。在Web Service協(xié)議棧的設(shè)計(jì)之中,仍然有深深的企業(yè)應(yīng)用痕跡。Web Service雖然宣稱能夠很好地支持互操作,然而因?yàn)閰f(xié)議棧的復(fù)雜性很高,在實(shí)戰(zhàn)中互操作性并不好(例如升級(jí)過程困難而且復(fù)雜)。此外,Web Service僅僅將HTTP協(xié)議當(dāng)做一種傳輸協(xié)議來使用,還依賴XML這種冗余度很高的文本格式,這導(dǎo)致Web Service應(yīng)用性能低下。很多開發(fā)團(tuán)隊(duì)寧可使用Hessian等輕量級(jí)的RPC協(xié)議,也不愿意使用Web Service。在面向互聯(lián)網(wǎng)的大流量Web應(yīng)用(包括Web服務(wù)在內(nèi))這種運(yùn)行環(huán)境中,Web Service在復(fù)雜性、互操作性、性能、可伸縮性等方面的短板更加突出。因此,設(shè)計(jì)今日面向互聯(lián)網(wǎng)的API,已經(jīng)很少有人會(huì)考慮Web Service。這使得Web Service的使用被局限在企業(yè)應(yīng)用運(yùn)行環(huán)境之中,其名稱中的“Web”更像是一個(gè)笑話(除了都使用HTTP協(xié)議,基本上與Web沒什么關(guān)系)。假如在2000年,設(shè)計(jì)Web Service規(guī)范的專家們,能夠認(rèn)真讀一下Fielding的博士論文,或者找HTTP、URI等Web基礎(chǔ)架構(gòu)規(guī)范的核心設(shè)計(jì)人員深入交流一下,Web Service很可能就不是現(xiàn)在這個(gè)樣子了。不過,歷史是無法假設(shè)的。
在Java世界中,與大Web Service相對(duì)應(yīng)的規(guī)范是JAX-WS。在大Web Service已經(jīng)成為明日黃花之后,Java世界急需一套新的規(guī)范來取代JAX-WS。這套新的規(guī)范就是JAX-RS:Java世界開發(fā)RESTful Web Service(與RESTful API含義相同,可混用)的規(guī)范。雖然起步很晚,畢竟走上了正確的道路。
從Java EE 6開始,JAX-RS在Java EE版圖中,作為最重要的組成部分之一,逐步取代了JAX-WS的地位。在所有Java EE相關(guān)規(guī)范中,JAX-RS是優(yōu)點(diǎn)很突出的一個(gè)。例如,完全基于POJO、很容易做單元測(cè)試、將HTTP作為一種應(yīng)用協(xié)議而不是可替代的傳輸協(xié)議(因此提高了性能)、優(yōu)秀的IDE集成,等等。可以說,在大多數(shù)場(chǎng)合,JAX-RS完全可以取代JAX-WS,作為Java Web Service開發(fā)的主要技術(shù)。JAX-RS同樣也可以完全取代Hessian等基于HTTP協(xié)議的RPC風(fēng)格遠(yuǎn)程調(diào)用協(xié)議。畢竟HTTP本身就是一種REST風(fēng)格的應(yīng)用協(xié)議,以REST風(fēng)格來使用HTTP,才是最高效的使用方式。
Jersey、CXF等支持JAX-RS規(guī)范的REST開發(fā)框架還支持輸出WADL。WADL支持客戶端代碼自動(dòng)生成,還可以將WADL導(dǎo)入到SoapUI等測(cè)試工具中,然后做自動(dòng)化集成測(cè)試。從開發(fā)Java企業(yè)應(yīng)用、取代JAX-WS的角度來看,JAX-RS已經(jīng)做得非常棒了。
盡管如此,不可不提的是,JAX-RS這套規(guī)范,仍然存在著很多遺憾。需要特別指出的是,JAX-RS規(guī)范并不等于REST架構(gòu)風(fēng)格本身,REST的內(nèi)涵要比JAX-RS廣泛得多。學(xué)會(huì)了使用JAX-RS了,并不等于就完全理解了REST,開發(fā)者仍然需要下工夫認(rèn)真學(xué)習(xí)一下本源的REST究竟是什么。
例如,JAX-RS規(guī)范對(duì)于應(yīng)該如何定義一個(gè)資源,以及應(yīng)該如何使用HTTP作為一個(gè)統(tǒng)一接口來操作資源,顯然缺乏必要的指導(dǎo)。有很多開發(fā)者只是簡(jiǎn)單地將以前JAX-WS中的一個(gè)endpoint接口轉(zhuǎn)換成一個(gè)資源接口。接口的方法太多,導(dǎo)致映射到的HTTP方法不夠用,這也難不倒他們,在URI路徑中加一些字符串就能夠解決(例如,三個(gè)接口方法都映射到POST,但是其PATH不同)。這樣的開發(fā)方式非常常見,雖然開發(fā)者使用了JAX-RS規(guī)范,但是開發(fā)方式完全是RPC風(fēng)格的,可以說與REST風(fēng)格沒有任何關(guān)系。
此外,JAX-RS規(guī)范目前尚不支持HATEOAS(將超文本作為應(yīng)用狀態(tài)的引擎,REST風(fēng)格的核心特征之一),從著名的Richardson成熟度模型(由《RESTful Web APIs》的作者Richardson提出)來衡量,基于JAX-RS規(guī)范實(shí)現(xiàn)的RESTful API僅僅能夠達(dá)到成熟度模型的第二級(jí),即支持資源抽象、統(tǒng)一接口的“CRUD式Web服務(wù)”。
可以這樣說,JAX-RS規(guī)范與真正的REST風(fēng)格,覆蓋的范圍其實(shí)是不同的。JAX-RS覆蓋的是簡(jiǎn)單基于HTTP協(xié)議(沒有使用SOAP/WSDL)的各種遠(yuǎn)程調(diào)用需求,很多需求對(duì)于可伸縮性、松耦合的要求并不高,僅僅是希望使用HTTP本身來取代大Web Service作為一種輕量級(jí)、容易測(cè)試的遠(yuǎn)程調(diào)用協(xié)議。REST架構(gòu)風(fēng)格的嚴(yán)格要求,在這些場(chǎng)合并不是非常重要。慵懶是人類的天性,大多數(shù)開發(fā)者寫代碼只是為了解決手頭的問題,JAX-WS并不好用,JAX-RS解救了他們。
如果按照Roy Fielding博士的嚴(yán)格要求(REST APIs must be hyper-text driven),那么包括JAX-RS規(guī)范在內(nèi)都不能算是真正的RESTful。然而,從實(shí)戰(zhàn)角度,我認(rèn)為革命不分先后,只要能夠達(dá)到Richardson成熟度模型第一級(jí),即有清晰的資源抽象,就可以認(rèn)為是RESTful API了。如果連第一級(jí)都達(dá)不到,所設(shè)計(jì)的架構(gòu)根本就不是面向資源的,那八成還是RPC風(fēng)格的,就沒有必要非要往RESTful API陣營(yíng)里面擠了。從來沒有人說過RPC就是萬惡的,RPC在企業(yè)應(yīng)用的大多數(shù)場(chǎng)合其實(shí)都非常有效,只是不適合面向互聯(lián)網(wǎng)的大流量Web應(yīng)用而已。
因此,能夠完美支持HATEOAS,攀登到成熟度模型第三級(jí),是一種理想情況(當(dāng)然也是值得追求的)。而通過部分擁抱REST風(fēng)格的要求,來更好地解決手頭的問題,是更多開發(fā)者所面對(duì)的現(xiàn)實(shí)情況。JAX-RS反映的正是這種現(xiàn)實(shí)情況,從實(shí)戰(zhàn)的角度,它是一套非常有用也很好用的規(guī)范。
韓陸兄的新著《Java RESTful Web Service實(shí)戰(zhàn)》是JAX-RS規(guī)范方面的專著,也是國(guó)內(nèi)第一本REST開發(fā)的原創(chuàng)著作。這本書的實(shí)戰(zhàn)性非常強(qiáng),全面介紹了JAX-RS 2.0的方方面面,可以作為一線Java分布式應(yīng)用開發(fā)者的案頭必備書。如同我在前面所指出的,JAX-RS規(guī)范并不等于REST架構(gòu)風(fēng)格本身,它們有著不同的覆蓋范圍。在本書中,作者也介紹了很多設(shè)計(jì)RESTful API的最佳實(shí)踐,這些內(nèi)容假如讀者不理解REST,甚至在親自閱讀了JAX-RS規(guī)范之后也未必能夠總結(jié)出來。讀者在閱讀本書的過程中,不應(yīng)該僅僅滿足于掌握了JAX-RS開發(fā)的基本方法、解決了手頭的問題、用其完全取代JAX-WS,更重要的是,讀者還應(yīng)該就REST架構(gòu)風(fēng)格本身做更多的學(xué)習(xí)。幸運(yùn)的是,除了本書之外,目前REST設(shè)計(jì)和開發(fā)方面的圖書資料已經(jīng)非常多了。
本書的內(nèi)容非常嚴(yán)謹(jǐn),有非常好的系統(tǒng)性,對(duì)于設(shè)計(jì)開發(fā)大流量Web服務(wù)會(huì)面臨的各種問題都有涉及。特別是在自動(dòng)化測(cè)試方面著墨頗多,在我看來是本書的一大亮點(diǎn)。RESTful API的自動(dòng)化測(cè)試非常重要,需要在設(shè)計(jì)之初就充分考慮到。本書是一本難得的原創(chuàng)佳作,值得所有Java分布式應(yīng)用的開發(fā)者購(gòu)買。
理想富麗豐滿,現(xiàn)實(shí)貧瘠骨感,追求理想和注重解決現(xiàn)實(shí)問題其實(shí)并不矛盾。JAX-RS規(guī)范的發(fā)展,反映出了Java社區(qū)在更好地開發(fā)RESTful Web Service方面的求索。盡管存在爭(zhēng)議,在我看來,規(guī)范化是推動(dòng)RESTful Web Service取得更大發(fā)展的必由之路。目前對(duì)于優(yōu)秀的RESTful API有哪些判斷標(biāo)準(zhǔn),Web開發(fā)者社區(qū)已經(jīng)達(dá)成了高度共識(shí),也積累了大量非常有價(jià)值的成果。JAX-RS規(guī)范的發(fā)展,離不開Web開發(fā)者社區(qū)的這些成果。在未來的JAX-RS 3.0規(guī)范中,我們將會(huì)看到更多令人興奮的成果被規(guī)范化。JAX-RS 2.0已經(jīng)做得不錯(cuò)了,但是在RESTful Web Service規(guī)范化的道路上,其實(shí)才剛剛起步,任重而道遠(yuǎn)。
李錕 于上海
- C# 7 and .NET Core Cookbook
- Advanced Machine Learning with Python
- CMDB分步構(gòu)建指南
- JavaScript修煉之道
- Cross-platform Desktop Application Development:Electron,Node,NW.js,and React
- Vue.js入門與商城開發(fā)實(shí)戰(zhàn)
- Learning AWS Lumberyard Game Development
- 利用Python進(jìn)行數(shù)據(jù)分析(原書第3版)
- D3.js 4.x Data Visualization(Third Edition)
- 從零開始學(xué)Linux編程
- 劍指大數(shù)據(jù):企業(yè)級(jí)數(shù)據(jù)倉(cāng)庫項(xiàng)目實(shí)戰(zhàn)(在線教育版)
- 從零開始學(xué)C#
- Web前端應(yīng)用開發(fā)技術(shù)
- Simulation for Data Science with R
- 跟戴銘學(xué)iOS編程:理順核心知識(shí)點(diǎn)