在JavaEye論壇上回答網(wǎng)友joyjiang的疑問(wèn):“REST的優(yōu)勢到底是什么?開(kāi)發(fā)效率?文檔的管理?url的直觀(guān)?還是其它的什么優(yōu)勢呢?”
REST的主要優(yōu)勢在我看來(lái)其實(shí)在于它是一種對于服務(wù)器的更加有效的抽象方式。
對于基于網(wǎng)絡(luò )的應用來(lái)說(shuō),你怎么樣看待服務(wù)器,就會(huì )產(chǎn)生什么樣的架構風(fēng)格,隨之產(chǎn)生與該架構風(fēng)格相關(guān)的交互模式。
RPC架構風(fēng)格將服務(wù)器看作是由一些過(guò)程組成,客戶(hù)端調用這些過(guò)程來(lái)執行特定的任務(wù)。SOAP就是RPC風(fēng)格的一種架構。過(guò)程是動(dòng)詞性的(做某件事),因此RPC建模是以動(dòng)詞為中心的。
分布式對象架構風(fēng)格認為服務(wù)器是由一些對象和對象上的方法組成,客戶(hù)端通過(guò)調用這些對象上的方法來(lái)執行特定的任務(wù)。并且客戶(hù)端調用這些對象上的方法應該就像是調用本地對象上的方法一樣,這樣開(kāi)發(fā)就可以完全按照統一的面向對象方法來(lái)做。但是很可惜,這樣的抽象并不是很有效,因為分布式對象與本地對象存在著(zhù)巨大的本質(zhì)差別,想要掩蓋這些差別很多時(shí)候甚至是有害無(wú)益的。
REST架構風(fēng)格并沒(méi)有試圖掩蓋這些差別,而是將服務(wù)器抽象為一組離散資源的集合。資源是一個(gè)抽象的概念,而不是代表某個(gè)具體的東西。注意:要真正理解REST,就一定要增強自己的抽象思維能力,充分理解到資源是抽象的。如果完全不具有抽象思維的能力,一定要將資源與數據庫中的一張表或服務(wù)器端的一個(gè)文件(HTML、Servlet、JSP、etc.)一一掛起鉤來(lái),就無(wú)法真正理解REST了。資源是名詞性的,因此REST建模是以名詞為中心的。
上述是目前基于網(wǎng)絡(luò )的應用的主要的三種抽象方式。這三種不同的抽象方式會(huì )嚴重影響客戶(hù)端與服務(wù)器的交互模式,而不同交互模式的交互效率差別相當大。分布式對象的交互模式很多時(shí)候效率很低,因為掩蓋了分布式對象與本地對象的差別,很多時(shí)候都會(huì )導致細粒度的API(需要一再強調才能讓一些不明就里的架構初哥按照正確的方式來(lái)做設計)。實(shí)踐已經(jīng)證明,與RPC和分布式對象相比,REST是一種對于服務(wù)器更加有效的抽象方式,將會(huì )帶來(lái)粒度更大和更有效率的交互模式。這樣的效果與Fielding設計REST的初衷是吻合的,REST就是專(zhuān)門(mén)為交互的性能和可伸縮性進(jìn)行過(guò)優(yōu)化的一種架構風(fēng)格。而SOAP在設計的時(shí)候優(yōu)先考慮的從來(lái)不是性能和可伸縮性,而是互操作性。除非出現奇跡,否則你種什么,就應該長(cháng)出來(lái)什么。你種的是瓜,長(cháng)出來(lái)的就是瓜;你種的是豆,長(cháng)出來(lái)的就是豆。
Fielding寫(xiě)到:“REST提供了一組架構約束,當作為一個(gè)整體來(lái)應用時(shí),強調組件交互的可伸縮性、接口的通用性、組件的獨立部署、以及用來(lái)減少交互延遲、增強安全性、封裝遺留系統的中間組件。”
有人認為REST不是面向對象的,其實(shí)REST雖然沒(méi)有分布式對象那么面向對象,在我看來(lái)至少比RPC更加面向對象。按照《企業(yè)應用架構模式》,以動(dòng)詞為中心建模是什么?是不是就是事務(wù)腳本?以名詞為中心建模是什么?是不是就是領(lǐng)域模型?這就扯遠了,網(wǎng)絡(luò )通信是否一定需要實(shí)現為面向對象的形式,我認為是不需要的。
“REST的主要優(yōu)勢在我看來(lái)其實(shí)在于它是一種對于服務(wù)器的更加有效的抽象方式。”
這句話(huà)等于是,我先把一個(gè)骨架放在這里,還沒(méi)有用血肉來(lái)充實(shí)它,也就是還沒(méi)有舉出具體的實(shí)例來(lái)。具體的實(shí)例以后我們還需要來(lái)詳細討論。REST是非常簡(jiǎn)練的,同時(shí)又是一種非常強大的抽象方式,在我看來(lái)就是從根本上簡(jiǎn)化Web開(kāi)發(fā)的一味良藥。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請
點(diǎn)擊舉報。