web取得了非凡的成就,考慮將web架構的基礎原理應用到其餘的同類分佈式系統當中。
html
web如何可以成爲這樣成功的應用平臺?他的指導原理是什麼?建造分佈式系統的時候,咱們應該如何應用這些原理?咱們可以使用哪些技術?爲什麼感到web的設計模型很熟悉,到那時任然與之前的平臺有很大的不一樣?企業開發者面對的挑戰,web老是適當的解決方案嗎?web
全書的目標就是描述如何基於web的架構來建造分佈式系統。而HTTP協議則利用了REST的架構原則。
json
1.WEB的架構後端
web如今是一個混合了商業,研究,政府,社會以及我的興趣的混合體,這致使web有多種多樣的用戶羣體。並且,人們更加趨向於使用web來知足本身各類各樣的需求。與之相應地,愈來愈多的網站接入到web當中。
api
今天的web架構,就是無數的簡單的,小規模的交互共同做用形成的。這些交互使用了HTTP和URL技術,在代理和資源之間通訊。在這樣的架構中,資源和URL扮演了主要的角色,並獲得了web緩存的支持以得到可伸縮性。緩存
可伸縮性:(http://www.infoq.com/cn/news/2007/10/whatisscalability 什麼是可伸縮性,使用更大的規模以處理更多的用戶數量)服務器
緩存:http://www.infoq.com/cn/caching/restful
緩存對可伸縮性的影響爲:緩存能夠減輕服務器的壓力,資源能夠在HTTP的中間件好比CDN進行緩存,而沒必要進入到最終的服務器。這樣至關於服務器能夠承擔更多的併發訪問量。
網絡
而服務邊界能夠是這些服務可以使服務隔離的進化,而不會相互影響,所以提供了鬆耦合。
架構
web中間件是一組普遍部署的就像是日用品同樣的服務器。從明顯的中間件——包含了資源的web服務器(數據計算等),到隱含的中間件——HTTP代理,緩存,內容分發網絡,他們管理者傳輸流量。這些元素在一塊兒,共同支持行星規模的網路系統的部署,卻沒有求助於錯綜複雜的對象模型,或負責的中間件解決方案。
中間件技術:http://soft.zdnet.com.cn/software_zone/2007/1003/534425.shtml
在這種中間件技術下面,web將重點放在了使用超媒體來移動信息和分享文檔。超媒體的本質是提供了一個URL,所以就存在了404的錯誤。
總結:web的架構的關鍵詞:資源,URL,緩存,web中間件,超媒體。
一句話,就是,在普遍存在的web中間件基礎上,以URL來定位資源,使用超媒體驅動資源跳轉的一種架構。並利用了web中間件的緩存能力提供了可伸縮性,利用服務邊界來提供鬆耦合性。
2從資源的角度思考
資源是基於web的系統的基礎建造模塊,一個資源能夠是任何東西,文檔,視頻,業務過程甚至一個設備。從消費者觀點看,資源是能夠與消費之交互提供服務的任何東西。咱們能夠經過抽象,講一些看似不可能的東西放到web上做爲一個資源。
2.1資源與標識符
一個URL標識了一個資源,可是一個資源能夠有多個URL。
2.2資源表述
一個表示,指的的是某個資源在某個特定時刻的狀態的轉化形式或者視圖。這個試圖被編碼爲一種或多種可轉移的格式,例如XHMTL,Atom,XML,JSON,甚至純文本,都好分割的值(CSV ),MP3或者JPEG。
一句話:資源的表述就是資源的形式。是個網頁仍是json。
對於真實世界的資源,咱們經過抽象將它轉化爲一個信息資源。
也許有一天,咱們利用3D打印直接打印出來本身想要的東西,那麼這個也是個表述吧。
對一個資源的訪問,咱們實際上是獲得了資源的一個表述。也就是說URI講表述和資源分離開來,實現了分離。這種分離,促進了後端系統和消費者應用程序之間的鬆耦合。它對可伸縮行性也有幫組,由於表述是能夠被緩存和複製的。一個資源能夠有多種表述,這些表述能夠知足不一樣的需求,不一樣的表述能夠經過web的內容協商(content negotiation)機制在運行時進行轉換格式的協商。
web 並無爲資源的表述格式規定任何特定的結構或者格式。這樣的話,一臺計算機能夠理解的格式,也許在另一天計算機上沒法理解。所以能夠經過選取一組適當的表述格式,達到在計算機之間交互的目的。(沒錯是計算機和計算機之間交互,不是人和計算機的交互)
資源表述的格式支持了服務消費者的需求。然而,這種消費者的友好型並無無限延伸至容許消費者來控制資源如何標識,演化,修改以及管理。與之相反,是由服務自身來控制他們的資源,以及資源的狀態如何展示給外部世界。這種封裝是web的鬆耦合的一個關鍵方面。
一句話:資源的表述須要有服務自身來提供和實現,消費者是不可以參與其中的。這種對服務的封裝實現服務和需求的解耦。
2.3 表述格式和URI
資源的表述未必須要經過不一樣的後綴擴展名(.htm,.xml,.json)來區分,也就是說表述不須要專有的URI。Http自己能夠經過Accept請求頭來協商內容格式,可是這個不強制,須要資源的服務或者擁有者來決定採用社麼格式回覆。
2.4 通訊的藝術
咱們如今有資源,有URI,有表述,咱們還須要有所行動,讓這一切動起來。這就HTTP method。
統一接口 :少許動詞如何與定義良好的且被普遍接受的語義相互結合,來知足大多數分佈式應用的須要。動詞的結合用來在系統之間進行通訊。
HTTP 動詞集合: GET POST PUT DELETE OPTIONS HEAD TRACE CONNECT PATCH
這些動詞足夠組成一個通用的解決方案。
除了動詞以外,HTTP還定義了一個響應碼集合(200,500,301,302,404,400),來協調有動詞的使用所引發的交互。總體來講,動詞和狀態代碼爲在網絡之上操做資源提供了一個通用的框架。舉個例子,重定向(http://blog.csdn.net/newjueqi/article/details/4782602 )。
資源,URL,HTTP動詞,就是咱們須要與在web之上的資源交互的東西。
3.從web架構到REST架構風格
Roy Fielding在他的博士研究工做中,歸納了Web的架構原理,將這些原理表現爲一個架構約束的框架,或者稱做一種「架構風格」。經過這個框架,Fielding描述了分佈式信息系統是如何建造和運做的。他描述了資源之間的相互影響,以及在此類系統中惟一標識符的角色。他也討論到了使用有限的一組操做和統一的語義來假造一種處處存在的基礎架構,可以支持任何類型的應用。Filding將這種架構風格稱做「表述性狀態轉移(REpresssentational stat Transfer ,REST)」。REST 描述了web做爲一個分佈式超媒體的應用,相互鏈接的資源經過交換表明資源狀態的表述進行通訊。
狀態或者資源的狀態:某一刻的資源 ,從理論上咱們訪問的資源只是資源當時的一個狀態,由於時間在變化。
注意:web 用戶不僅是人,也多是機器,軟件等 。而後,參考博士論文中的狀態論述:http://www.cnblogs.com/timhua/articles/2725942.html
3.1 超媒體
將超媒體做爲應用狀態的引擎:
超媒體能夠理解爲含有超連接的文本,語音,視頻,圖片等。引擎就是驅動,使變化。那麼這句話能夠簡單的理解爲:經過超連接在應用狀態之間切換。那麼問題來了,啥是應用狀態?應用狀態是和請求有關的信息數據,或者應用狀態就是請求。這句話最終能夠解釋爲:經過超連接跳轉頁面。
因此這樣看起來,web的能力除了存取資源外,還能夠在不一樣的資源之間經過超連接進行跳轉。也就是說,一個資源的表述中能夠插入另外一個資源的URI,進而能夠從一個資源導航到另外一個資源,好像個尋寶的過程。這也是爲啥一上網根本停不下來的緣由了,由於該死的連接,根本沒有盡頭,徹底停不下來。
總結:web的原理:
web 構建的基礎是資源,web的交互是經過 資源,URI,資源表述,HTTP動詞完成的。
web 資源表述的協商能力,使的能夠差異化的提供服務。而服務對此的封裝解耦了需求與實現。而公共的表述形式的普及,加速了web的應用普及。
web服務之間的邊界使服務之間隔離能夠獨立演進,web中間件的cacache能力提升了系統的可伸縮性,web的超媒體提供了資源之間的鏈接導航能力。
REST 就是充分利用web的這些基礎能力進行分佈式架構的一種風格。他的核心思想是超媒體驅動。
4.Web做爲一個應用平臺
儘管web一開始只是信息發佈平臺,不過它如今已經進化成爲了連接分佈式應用的手段。web做爲一個平臺具備這些特色:架構簡單,普遍實現和認同的HTTP協議,無所不在的公共表述格式。web不只僅是一個成功的大規模信息系統,並且能夠做爲一個平臺來支持服務的生態系統。(大平臺,小服務)
REST 設計Demo:
http://www.easemob.com/docs/rest/ 這裏環信對本身的資源設計作了介紹,很具備參考價值。
InfoQ的參考:
http://www.infoq.com/cn/articles/understanding-restful-style
http://www.infoq.com/cn/articles/how-to-design-a-good-restful-api
整理:
1,rest 是web架構的最佳實踐,是對現有的架構技術的減法,而並不是增長了更多的特性。
2,web架構的基礎
資源,url,資源表述,資源表述協商,緩存,HTTP動詞和響應嗎,超媒體
3,REST 就是充分利用web架構的這些基礎特性進行軟件架構的風格。充分web的表達能力,HTTP表達能力和普遍的HTTP中間件來架構系統。
4,REST 設計幾個內容
面向資源的思考
URL的設計
超媒體驅動
5,關於應用狀態
一個應用提供一組功能,他是咱們預先設計的交互流程。這個流程有不少的階段,這些階段能夠相互的跳轉,就像一個狀態機。所以看來應用狀態,就是咱們設計的流程階段。
每個狀態有如下三個部分組成:
顯示的內容
可執行的交互
其餘狀態的連接
6,關於超媒體驅動
超媒體驅動的是應用的狀態。趨勢應用狀態從一個階段到另外一個階段。而一個應用狀態能夠包含不少的資源
可見:
a . 超連接的設計既包含資源URL的設計,也包含應用狀態的URL設計。
b . 經過改變一個資源的狀態來驅動應用狀態的變化。