04 三種主流Web服務架構 - REST


1. REST 產生背景

回味一下Web服務和WCF就可以發現,他們雖然使用了HTTP協議,但是其實建立在 SOAP 上,以至於我們提到 Web 服務就會想到 SOAP,也就是說,他們並沒有直接建立在 HTTP上,僅僅使用HTTP作為一種夾帶其他的應用協議穿越防火牆的方法,可以說,他們沒有充分挖掘並利用HTTP協議。

2000年時,有個家伙思考了一下, HTTP協議(HyperText Transfer Protocol,超文本傳輸協議),它並不是被設計為一種傳輸協議,它是一種轉移協議非常不幸,HTTP傳入我國時,即被翻譯為“超文本傳輸協議”,因為Transfer也有“傳輸”的含意,但其本意是轉移。

在HTTP協議中,消息通過在那些資源的表述上的轉移和操作,來對資源執行一些動作,從而反映出Web架構的語義,因此使用這個非常簡單的接口來獲得廣泛的功能是完全有可能的。

 

2. REST的崛起

表述化狀態轉移 (Representational State Transfer,簡稱REST )是Roy Thomas Fielding博士在2000年他的論文中提出來的一種軟件架構風格。REST軟件架構風格迅速成為當今世界上最成功的互聯網的超媒體分布式系統。它讓人們真正理解我們的網絡協議HTTP本來面貌。它正在成為網絡服務的主流技術。

REST軟件架構是一個抽象的概念,是一種為了實現這一互聯網的超媒體分布式系統的行動指南。利用任何的技術都可以實現這種理念。而實現這一軟件架構最著名的就是HTTP協議。通常我們把REST也寫作為REST/HTTP,在實際中往往把REST理解為基於HTTP的REST軟件架構。

盡管網絡服務目前是以SOAP技術為主,但是REST將是是網絡服務的另一選擇,並且是真正意義上的網絡服務。

基於SOAP的Web Service實現技術和相關代碼,雖然較為成熟,且安全性較好,但是使用門檻較高,而且在大並發情況下可能會有性能問題。目前在三種主流的Web服務實現方案中,因為REST模式與復雜的SOAP和XML-RPC相比更加簡潔,越來越多的Web服務開始采用REST風格設計和實現。

 

3.什么是REST?

表述狀態轉移: REST (Representational State Transfer),采用Web 服務使用標准的 HTTP 方法 (GET/PUT/POST/DELETE) 來抽象所有 Web 系統的服務能力,它是一種軟件架構風格,一種針對網絡應用的開發方式,可以降低開發的復雜性。REST從資源的角度來觀察整個網絡,分布在各處的資源由URI確定,而客戶端的應用通過URI來獲取資源的表征。

REST具體技術實現:
   Asp.Net WebAPI

 

4. REST兩個基本概念


1.資源(Resource):將信息抽象為資源,任何能夠命名的信息(包括數據和功能)都能作為一個資源,一張圖片,一個其他資源的集合等。在REST中,資源又叫做狀態,因為它跟隨時間的變化。
2.表述(Representation): REST通過URI來獲得資源的表述並對資源執行動作,並在組件間傳遞該表述。

什么是表述化狀態轉移?在REST中,資源就是狀態,互聯網就是一個巨大的狀態機:每個網頁是其一個狀態;Url是狀態的表述;REST應用通過點擊超鏈接,從一個狀態遷移到下一個狀態的狀態轉移過程,就叫轉移。

例如:Bing搜索結果的分頁列表,url如下:
第一頁:http://www.bing.cn/search?q=REST&hl=zh-CN&newwindow=1&start=0&sa=N  
第二頁:http://www.bing.cn/search?q=REST&hl=zh-CN&newwindow=1&start=10&sa=N

在Bing中,把搜索結果的每一頁視為資源(狀態),並通過url來表示(這就是表述),同一搜索關鍵字的不同分頁通過start參數來進行區分。當你從第一頁點擊第二頁的鏈接時,只是從一個狀態跳到了下一個狀態而已(這就是轉移);

 

5.REST風格架構的主要約束條件

第一.客戶-服務器:分離關注點,將用戶接口(如用戶界面)和數據存儲分離,如果接口不變,組件可獨立進化。

第二.無狀態:從客戶端道服務器的每個請求必須包含理解該請求所必需的所有信息,不能利用任何存儲在服務器上的上下文。提高了系統的可擴展性,其優點有三:可見性,監視系統不必為了確定一個請求的性質而去查看請求之外的多個請求;可靠性,減輕了從局部故障恢復的任務量,可以快速定位;可伸縮性,不必在多個請求之 間保存狀態,允許服務器快速釋放資源,並且服務器不必跨請求管理資源。缺點是,由於不能將狀態保存在服務器上的共享上下文中,增加了請求中發送的重復數 據,降低網絡性能,因此有了約束三。

第三.緩存:請求響應中的數據顯示或隱式的標記為可緩存的或不可緩存的。緩存可以為以后相同的請求重用這個響應的數據。但是緩存管理不好,會降低可靠性,導致緩存中陳舊的數據與直接訪問服務器得到的數據差別很大。

第四.統一接口:組件之間要有統一的接口,是REST風格架構區別其他風格架構的核心特征。REST由四個接口約束定義:資源的識別,Web-Based系統中資源由URI表示,數據庫存儲系統中資源可以是XML,JSON等;通過表述對資源執行的動作:表述中包含操作該資源的信息,如增刪改查,映射到HTTP協議的GET,POST,PUT,DELETE方法;自描述的消息:消息中包含如何處理該消息的信息,如由哪個WebAPI/Sevlet處理,響應中包含可不可以被緩存等信息;作為應用狀態引擎的超媒體。

 

6. REST基本設計原則

原則一: 使用HTTP的方法進行資源訪問
使用HTTP POST方法去創建資源,使用GET方法去讀取資源,使用PUT 方法去更新資源,使用DELETE方法去刪除資源。

原則二: 使用無狀態/無會話的服務設計
很長時間以來,人們采用有狀態的服務設計從而在客戶端與服務端的多次交互中維護一定的上下文。
然而,有狀態的設計使得程序很難隨着工作負載的增加而進行伸縮。比如某個服務實例擁有10000個會話的狀態,則通常很難通過增加服務實例來分擔其工作負載:工作負載被鎖定了! 反之,如果程序被設計成一個無狀態的,則可以自由增加服務實例,並且在這些實例之間平衡負載,從而使得服務具有較好的伸縮性,這在大規模分布式系統中尤其重要!!

原則三: 用目錄結構風格的URL設計來表示資源
用清晰的URL路徑表示資源可以使客戶端更容易理解和操作資源。URL可以被看作是一種自我解釋的接口,不需要太多解釋就可以讓人明白該URL指向的是什么資源以及如何獲得相關的資源。
http://www.foo.com/research/articles/{article_title}
http://www.foo.com/research/articles/{year}/{month}/{day}/{article_title}

原則四: 使用XML或JSON來傳輸數據
服務和請求的消息數據中包含了對於資源的屬性的描述,服務應該采取結構良好並且易於閱讀的方式來描述資源。XML、JSON都是結構良好的語言,並適於閱讀。JSON比XML更加簡潔。

 

7. REST安全性

REST/HTTP網絡服務直接暴露在客戶端面前,如何確保服務的安全?


安全一:REST/HTTP網絡服務的信息包可以被防火牆理解和控制。你可以按照操作和鏈接進行過濾信息包,如你可以規定從外部來的只能讀取(GET操作)自己服務器的資源。這樣對於系統管理員而言使得軟件管理更為簡單。

安全二:REST的安全性還可以利用傳輸安全協議SSL/TLS、 HTTP基本認證和摘要式認證。

        HTTP基本認證 優點是邏輯簡單明了、設置簡單。缺點顯而易見,即使是BASE64后也是可見的明文,很容易被破解、非法利用。還有就是HTTP是無狀態的,同一客戶端每次都需要驗證。對Http認證的不安全的缺點來說,可以啟用HTTPS(SSL/TLS)認證作為補充。

        摘要認證(digest authentication)
優點是摘要驗證很好地解決了使用基本驗證所擔心的安全性問題。
但是永遠沒有絕對的安全,當用戶使用字典進行窮舉破解時,還是會存在一些被破解的隱患。

安全3:還可以利用像基於信息的Web Services Security作為安全認證的補充方案。

安全4:用第三方開源的OpenID和Oauth類庫作為安全認證方案的選擇。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM