日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

RESTful 真正意味著什么?

 River_LaLaLa 2016-08-21

上個月,我在Skillsmatter參加了一個關(guān)于RESTful微服務(wù)快速進(jìn)階的培訓(xùn)課程。課程著重探討了REST API在web應(yīng)用和微服務(wù)交互方面起到的作用。對我來說,這個課程給我最大的收獲是讓我更好地理解REST,以及它的優(yōu)點(diǎn)和不足。

過去我大部分工作是在移動技術(shù)領(lǐng)域,也就是web API的調(diào)用端。我過去所調(diào)用的大部分API被認(rèn)為是RESTful的,不過現(xiàn)在我對RESTful有了更深的理解,我敢說那些API里有99%都算不上RESTful。

定義

REST是“呈現(xiàn)狀態(tài)轉(zhuǎn)移(REpresentational State Transfer)”的縮寫?;蛟S可以這樣來定義它:一種API的架構(gòu)風(fēng)格,在客戶端和服務(wù)端之間通過呈現(xiàn)狀態(tài)的轉(zhuǎn)移來驅(qū)動應(yīng)用狀態(tài)的演進(jìn)。

約束

要讓應(yīng)用RESTful化,需要遵循以下約束。遵循了這些約束的分布式系統(tǒng),就會擁有如下非功能屬性:性能,伸縮性,易用性,擴(kuò)展性,可見性,可移植性和可靠性。

CS模式

CS模式通過分離客戶端和服務(wù)器端的關(guān)注點(diǎn),讓客戶端不再關(guān)注數(shù)據(jù)的存儲問題,從而提高客戶端代碼的可移植性。另一方面,服務(wù)器端不再關(guān)注用戶界面和用戶狀態(tài),從而變得更簡單,提高了伸縮性。服務(wù)器端跟客戶端可以獨(dú)立開發(fā),只要它們都遵守契約。

無狀態(tài)

客戶端上下文在多個請求之間是絕不會保存在服務(wù)器上的。每個請求必須包含必要的信息。無狀態(tài)的服務(wù)器通過快速釋放資源和簡化實(shí)現(xiàn)提高了可伸縮性??煽啃允沟脧木植渴≈谢謴?fù)變得容易。很明顯,監(jiān)控系統(tǒng)不必通過考慮單個請求來判斷請求的性質(zhì)。

無狀態(tài)服務(wù)器的一個缺點(diǎn)是降低了網(wǎng)絡(luò)性能,因?yàn)樗行枰臄?shù)據(jù)必須在每次請求中發(fā)送。

可緩存

REST應(yīng)用程序是web系統(tǒng),因此客戶端和中間層可以緩存響應(yīng)。響應(yīng)必須被定義為可緩存或不可緩存的,以防客戶端重復(fù)使用舊數(shù)據(jù)導(dǎo)致降低可靠性。如果緩存中的陳舊數(shù)據(jù)與已生成的請求的數(shù)據(jù)顯著不同,則由服務(wù)器處理請求。緩存可以消除一些客戶端和服務(wù)器之間的交互,這就提升了可伸縮性、效率和通過減少平均延遲達(dá)到的用戶可感知的性能。 

統(tǒng)一的接口

使用統(tǒng)一的接口降低了系統(tǒng)復(fù)雜度和耦合度,讓系統(tǒng)的不同部分可以獨(dú)立演化。稍后會解釋URI,資源和超媒體是如何通過生成標(biāo)準(zhǔn)接口來提升用戶交互可見性,降低系統(tǒng)復(fù)雜度,促進(jìn)系統(tǒng)組件獨(dú)立演化的。但是我們需要在效率方面做出妥協(xié),畢竟消息是通過標(biāo)準(zhǔn)格式傳輸?shù)?,并不能滿足所有應(yīng)用對消息格式的要求。

分層的系統(tǒng)

分層系統(tǒng)通過約束組件的行為來降低系統(tǒng)復(fù)雜度,組件不能越過它們的媒介層去訪問其它層。通過組件的阻斷來保持層間的獨(dú)立性。遺留的組件可以被封裝成新的層,不讓舊的客戶端訪問。媒介層可以通過負(fù)載均衡來提升伸縮性。分層系統(tǒng)存在的主要不足,是它給數(shù)據(jù)處理增加了一些額外的開銷,增加了延遲,對用戶體驗(yàn)有所影響。

按需編碼

REST允許客戶端通過下載執(zhí)行腳本來擴(kuò)展它們的功能,簡化了客戶端,也提升了擴(kuò)展性。但這同時也降低了可見性,所以這個約束不是必須遵循的。

元素

REST提供了以下幾種元素來構(gòu)建無狀態(tài),可伸縮的web API。

  • HTTP協(xié)議

  • 資源

  • URI

  • 超媒體

HTTP - 文本傳輸協(xié)議

REST一般使用HTTP作為它的傳輸協(xié)議,因?yàn)镠TTP提供了一些很好用的特性,如HTTP動詞,狀態(tài)碼和頭部信息。

HTTP動詞

HTTP并沒有定義很多動詞來描述web服務(wù)中可能出現(xiàn)的行為,它只用了一個標(biāo)準(zhǔn)動詞集合來處理各種相似情況,從而讓API變得更直觀。每個動詞通過兩種屬性的組合來滿足不同的場景需求。

  • 冪等性:操作可以被重復(fù)執(zhí)行,就算在失敗以后。

  • 安全性:對客戶端來說操作不會產(chǎn)生副作用。

GET

用來從服務(wù)器端讀取狀態(tài)。這個操作是安全的,所以它可以被執(zhí)行很多次而不會對數(shù)據(jù)有任何影響,也就是說執(zhí)行它一次跟執(zhí)行十次是一樣的效果。從冪等性方面來看,多次請求跟單個請求總能得到相同的結(jié)果。

POST

一般用來在服務(wù)器端創(chuàng)建某種狀態(tài)。這個操作不具備冪等性跟安全性,所以多次請求會在服務(wù)器端創(chuàng)建多個資源。因?yàn)镻OST是不冪等的, 所以不應(yīng)該被用來做跟金錢有關(guān)系的操作,試想一次失敗的請求如果被執(zhí)行多次,那么很可能轉(zhuǎn)賬或者支付也被執(zhí)行了多次。

PUT

雖然它也可以被用來創(chuàng)建狀態(tài),但主要還是用來在服務(wù)器端更新狀態(tài)的。它是冪等的,但不安全,因?yàn)樗鼤淖兎?wù)端的狀態(tài)。因?yàn)樗膬绲刃?,PUT可以被用來處理跟金錢有關(guān)系的操作。

DELETE

用來在服務(wù)器端刪除狀態(tài)。它也是冪等非安全的,因?yàn)樗鼤瞥?wù)端的狀態(tài)。它之所以是冪等的,是因?yàn)橹貜?fù)刪除一個狀態(tài)的結(jié)果是一樣。

響應(yīng)狀態(tài)碼

HTTP在請求資源的響應(yīng)里提供了元數(shù)據(jù)信息,也就是狀態(tài)碼。它們是web平臺之所以能用來構(gòu)建分布式系統(tǒng)的重要因素。它們被分為以下幾類:

  • 1xx —— 元數(shù)據(jù)

  • 2xx —— 正確的響應(yīng)

  • 3xx —— 重定向

  • 4xx —— 客戶端錯誤

  • 5xx —— 服務(wù)端錯誤

頭部信息

HTTP在消息頭部里為請求響應(yīng)提供了額外信息。每個頭部由大小寫敏感的關(guān)鍵字和值組成,中間用冒號隔開。頭部信息被分為以下幾類:

  • 一般頭部:在請求跟響應(yīng)里都有,跟消息體里傳輸?shù)臄?shù)據(jù)沒有關(guān)系。

  • 請求頭部:更多的是關(guān)于被請求資源或者客戶端的信息。

  • 響應(yīng)頭部:響應(yīng)的額外信息。

  • 實(shí)體頭部:消息體的額外信息,比如content-length或MIMI-type。

資源

資源可以是由系統(tǒng)暴露出來的任何具有唯一標(biāo)識的東西。資源在應(yīng)用領(lǐng)域跟客戶端之間建立起了聯(lián)系。一張圖片,一個表格,或者它們的集合,都被看作資源。資源通過某種呈現(xiàn)方式被獲取或被創(chuàng)建(XML,JSON等)。

我們與之打交道的是資源的呈現(xiàn)形式,并不是資源本身,這個跟值傳遞有點(diǎn)像。根據(jù)之前對REST的定義,資源代表了在網(wǎng)絡(luò)上傳輸?shù)奈臋n。服務(wù)器端關(guān)心資源的狀態(tài),因?yàn)樗鼈兇砹祟I(lǐng)域的狀態(tài)。而客戶端只是獲取或者發(fā)送資源的呈現(xiàn)狀態(tài),從而讓應(yīng)用的狀態(tài)發(fā)生變化??蛻舳岁P(guān)心的是應(yīng)用的狀態(tài),因?yàn)檫@些狀態(tài)的變化跟應(yīng)用所要達(dá)成的目標(biāo)有關(guān)。

資源的名字都應(yīng)該是具有名詞性質(zhì)的,它們代表的是系統(tǒng)中領(lǐng)域的概念,并用URI標(biāo)識。

URIs (Uniform Resource Identifiers)

URIs用來唯一標(biāo)識資源。要訪問或者操作一個資源,最起碼要知道資源的地址。它們由協(xié)議+服務(wù)器地址+路徑組成。

客戶端不應(yīng)該與資源的URI有太多耦合,因?yàn)榉?wù)端可能隨意改變它們的值。在這一點(diǎn)上,超媒體更具優(yōu)勢。它提供了一種解耦客戶端跟URI的方式,并在應(yīng)用協(xié)議中加入新的語義。

超媒體

超媒體通過超媒體控件(比如鏈接跟表單)或者URI告訴客戶端接下來可以做什么。針對特定應(yīng)用的超媒體格式是在應(yīng)用的Media Type里定義的。

超鏈接由href屬性和rel屬性組成,href指定要訪問資源的URI,rel定義了資源跟URI的關(guān)系。超媒體通過它們向應(yīng)用的狀態(tài)轉(zhuǎn)移增加新的語義。服務(wù)端通過在響應(yīng)中增加新的超鏈接來擴(kuò)展新的功能,而不會對客戶端造成影響。只要服務(wù)端在響應(yīng)里一直保留之前的鏈接,客戶端可以像之前那樣工作,只是在要訪問新資源的時候才需要更新。超媒體的另一個優(yōu)勢是它引入了可發(fā)現(xiàn)性,它提供了一種可以暴露資源的方式,而且它是一種自文檔的協(xié)議。

客戶端通過一個固定的URL跟app開始了交互,服務(wù)端在每一個響應(yīng)里提供了后續(xù)操作的超鏈接,這些鏈接具有良好的媒體格式,客戶端沿著這些鏈接可以做相應(yīng)的操作。

超媒體跟鏈接定義了服務(wù)器跟客戶端之間的契約??蛻舳送ㄟ^鏈接與系統(tǒng)進(jìn)行交互,這就是HATEOAS(超媒體作為應(yīng)用狀態(tài)的引擎)所表達(dá)的意思。

Richardson成熟度模型

這個模型幫助我更好地理解REST,以及如何去解釋web應(yīng)用的屬性。它把REST系統(tǒng)的組件分為三個等級,并提供了一種方式去理解RESTful相關(guān)的想法,概念和優(yōu)勢。它更像是一種理論教育模型,而不是一種評審機(jī)制。

關(guān)于Richardson成熟度模型更具體的解釋可以看這里。


    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多