本文總結了一些rest風格構架設計的經驗,介紹了rest架構的語言生態環境,狀態表述轉移,無狀態伺服器等特點,並通過舉例google來說明rest風格的味道。
ad:rest(representational state transfer)是http協議的作者roy fielding博士在其博士**中提出的一種網際網路應用構架風格。與以遠端物件為核心的orb和以服務為核心的soa相比,以資源為核心的rest讓我們從嶄新的視角審視網際網路應用。rest為網際網路應用量身定做的簡潔模型、與http協議的完美結合、構架的高擴充套件性,為網際網路應用構架設計和異構系統整合設計帶來了一股清新的空氣。
語言生態環境
計算機發展至今,產生了許許多多不同的語言,每種語言都定義了自己獨特的生態環境。在這個生態環境內的程式共享相同的型別系統、執行時環境、併發模型等。雖然所有程式的本質是相同的:從問題領域到機器領域的對映,但無法迴避的是不同生態環境的程式很難跨越彼此的邊界。同樣是int,在a和b語言通常截然不同(clr和jvm能部分解決型別共享問題),更不用說a語言具有但b語言不具有的某些語言特性(clr和jvm沒法解決)。
當系統可以在單一的生態環境中自給自足時,跨越生態環境的問題並不存在;但在多數網際網路應用中,系統的各個部分通常既是生產者又是消費者,必須要打破生態環境的界限才能相互協作。比如,a公司的service a,需要對外提供服務,而service a又依賴於b公司的service b和c公司的service c;由於無法保證不同公司都採用同樣的語言,因此各服務的介面必須保證語言無關性。在我所了解的範圍內,有3種跨域生態環境的方式:
1.orb(object request broker)
以corba為代表,其核心概念是遠端物件(remote object)。熟悉.net remoting的朋友應該能體會其風格(需要說明的是.net remoting只跨越微軟的生態環境)。不同生態環境的程式可以像呼叫本地物件一樣呼叫遠端物件**的方法,orb會負責連線到遠端的物件,並處理資料的序列化與反序列化。
2.soa
其核心概念是服務(service)。比如:我們要提供整數加法web服務,我們會很自然地想到通過類似下面的url來表達服務介面:
並通過xml結構表達結果:
3.rest
其核心概念是資源(resource)。在rest的世界中,沒有服務的概念,同樣是上面的例子,在rest的世界中,是乙個xml網頁資源的id,而非服務的介面。所以,rest讓我們從資源的角度來審視網際網路應用並指導我們的設計,這是它與orb和soa最本質的區別。下面我們將更詳細的介紹,rest以資源為核心的模型和相應的設計風格。
狀態表述轉移
在rest的世界中,資源即狀態,而網際網路就是乙個巨大的狀態機:每個網頁是其乙個狀態;url是狀態的表述;rest風格的應用則是從乙個狀態遷移到下乙個狀態的狀態轉移過程。早期網際網路只有靜態頁面的時候,通過超連結在靜態網頁間瀏覽跳轉的page->link->page->link…模式就是一種典型的狀態轉移過程。
無狀態伺服器
rest風格應用可以實現互動,但它卻天然地具有伺服器無狀態的特徵。在狀態遷移的過程中,伺服器不需要記錄任何session,所有的狀態都通過url的形式記錄在了客戶端。ps:更準確地說,這裡的無狀態伺服器,是指伺服器不儲存會話狀態(session);而資源本身則是天然的狀態,通常是需要被儲存的;本文提到的無狀態伺服器均指無會話狀態伺服器。
舉個例子:乙個心理測試的應用,需要使用者做2次選擇題,每次可選a、b兩種答案,2次選擇完畢之後將告知使用者屬於何種心理型別。
如果按orb或soa的服務思維,很容易想到在伺服器端儲存session,每次選擇以後修改session,根據session產生結果。但如果以rest的狀態表述轉移模型為指導,我們會自然地得出這樣設計:
每乙個頁面表示乙個狀態(存在於客戶端),頁面包含了到下乙個頁面的超連結,每當使用者選a或選b時分別轉移到下乙個相應的狀態。這樣,所有的會話狀態其實都是通過url的形式儲存在了客戶端,伺服器端實現了無狀態。另外,需要說明的是,雖然上圖有7個狀態,但並非一定需要在伺服器預先生成7個靜態頁面,它們完全可以是動態頁面,這不影響狀態轉移的概念模型以及伺服器無狀態的特徵。
有構架設計經驗的朋友應該很清楚,與有狀態服務設計相比,無狀態服務容易實現系統效能的橫向擴充套件。通過增加硬體,部署多個無狀態服務,並進行
load balance
不會受到制約;而有狀態服務模式,
session
的儲存、共享都會帶來效能瓶頸,且無法通過增加硬體消除。
google搜尋就是乙個典型的無狀態服務。試想一下,當你搜尋「周杰倫」以後,google提示你有數百萬的結果,並每10條一頁分成若干頁,google會把結果儲存進伺服器session嗎,然後當你翻頁的時候,再從session中取嗎?顯然這樣龐大的session,即使是google也無法承受。來看看google的url:
第一頁:
第二頁:
google把搜尋結果的每一頁視為資源(狀態),並通過url來表示,同一搜尋關鍵字的不同分頁通過start引數來進行區分。當你從第一頁點選第二頁的鏈結時,只是從乙個狀態跳到了下乙個狀態而已;對於google而言,其實是一條新的查詢(按rest的觀點,獲取新的資源),而兩次查詢很可能是由不同的伺服器在處理,而使用者卻感覺google似乎記住了會話。
從上面的例子中,我們初步體會到了一點rest風格的味道。但需要說明,rest風格包含了無狀態伺服器的特徵;但反過來,並非具有無狀態伺服器特徵的都是rest。soa同樣可以是無狀態的,rest的核心還是資源。
http協議狀態表
1xx 臨時響應 表示臨時響應並需要請求者繼續執行操作的狀態碼。100 繼續 請求者應當繼續提出請求。伺服器返回此 表示已收到請求的第一部分,正在等待其餘部分。101 切換協議 請求者已要求伺服器切換協議,伺服器已確認並準備切換。2xx 成功 表示成功處理了請求的狀態碼。200 成功 伺服器已成功處...
Working 流程關係狀態表
主表單 select from ce administration procure t where t.id hze992733d668dc6013d671df4760349 流程例項表 記錄建立的流程基本資訊與當前表單名稱的資訊 select from tw horizon instance t ...
全新Web開發風格 REST架構介紹
rest架構風格是全新的針對web應用的開發風格,是當今世界最成功的網際網路超 分布式系統架構,它使得人們真正理解了http協議本來面貌。隨著rest架構成為主流技術,一種全新的網際網路網路應用開發的思維方式開始流行。rest是什麼 rest是英文representational state tra...