Web架構特性及REST架構風格(部分內容摘自網絡)
良好的Web架構風格:
1. 客戶/服務器模式: 實現了UI與數據的分離。
2. 服務端無狀態性: 可見性,可靠性,可伸縮性等方面的改善。
可見性-無狀態性使得服務器不必要維護海量的上下文(Context)。
可靠性-無狀態性減少了服務器從局部錯誤中恢復的任務量。
可伸縮性-無狀態性使得服務器可以很容易的釋放資源。
3. 緩存: 減少服務端不必要的處理。
4. 可伸縮性: 便于分布式和集群部署。
上面的2,3點也是影響4的主要因素。而隨著系統用戶規模的指數上升,可伸縮性將變的至關重要。
現在大多數應用程序都忽略或者違反了上述2, 3的風格。當然也肯定失去了4帶來的好處。
比如Java Servlet中HttpSession的應用,使服務器端保存了客戶端的狀態。
時下流行的動態頁面的做法也使得資源緩存變得困難或者不可能。
這些都直接影響了應用的可伸縮性。
改善現狀的思路是,把服務端的處理和狀態前移,由客戶端來實現。使服務端回歸到無狀態的特性。
以采用ajax技術的應用系統為例:因為不需要完全刷新就可以與服務器進行交互,使得有狀態客戶機成為可用選擇。基于瀏覽器的應用程序代碼可以在必要時獲取新的服務器數據,并把這些數據織入當前頁面。
將處理和狀態前移到每個客戶機上后,實現了無狀態的服務端;同時緩存服務器可以緩存ajax引擎(比如dojo, prototype etc.),以及狀態無關的數據。
個人理解,多種瀏覽器的plug-in技術(Sun的applet, MS的ActiveX等等),都應該是這種思路的不同技術實現。
經過以上分析整理,實際上已經涉及到了時下流行的一個概念-REST.
REST(Representational State Transfer)來源于Dr. Roy Thomas Fielding, <Architectural Styles and the Design of Network-based Software Architectures>
當瀏覽器瀏覽訪問一個url資源時,返回的頁面即為該url資源的representation,這個representation給瀏覽器一個state,當
瀏覽器訪問下一個url資源時,瀏覽器的state就transfer了。
REST其本身只是為分布式超媒體系統(distributed hypermedia systems)設計的一種架構風格,而不是某個標準,框架。
REST的設計準則
1.網絡上的所有事物都被抽象為資源(resource);
2.每個資源對應一個唯一的資源標識符(resource identifier);
3.通過通用的連接器接口(generic connector interface)對資源進行操作;
4.對資源的各種操作不會改變資源標識符;
5.所有的操作都是無狀態的(stateless)。
REST中的資源所指的不是數據,而是數據和表現形式的組合。
REST是基于Http協議的,任何對資源的操作行為都是通過Http協議來實現。以往的Web開發大多數用的都是Http協議中的GET和POST方法,對其他方法很少使用,這實際上是因為對Http協議認識片面的理解造成的。Http不僅僅是一個簡單的運載數據的協議,而是一個具有豐富內涵的網絡軟件的協議。他不僅僅能對互聯網資源進行唯一定位,而且還能告訴我們如何對該資源進行操作。Http把對一個資源的操作限制在4個方法以內:GET, POST,PUT和DELETE,這正是對資源CRUD操作的實現。由于資源和URI是一一對應的,執行這些操作的時候URI是沒有變化的,這和以往的 Web開發有很大的區別。正由于這一點,極大的簡化了Web開發,也使得URI可以被設計成更為直觀的反映資源的結構,這種URI的設計被稱作 RESTful的URI。這位開發人員引入了一種新的思維方式:通過URL來設計系統結構。當然了,這種設計方式對一些特定情況也是不適用的,也就是說不是所有的URI都可以RESTful的。
REST 之所以可以提高系統的可伸縮性,就是因為它要求所有的操作都是無狀態的。由于沒有了上下文(Context)的約束,做分布式和集群的時候就更為簡單,也可以讓系統更為有效的利用緩沖池(Pool)。并且由于服務器端不需要記錄客戶端的一系列訪問,也減少了服務器端的性能。
良好的Web架構風格:
1. 客戶/服務器模式: 實現了UI與數據的分離。
2. 服務端無狀態性: 可見性,可靠性,可伸縮性等方面的改善。
可見性-無狀態性使得服務器不必要維護海量的上下文(Context)。
可靠性-無狀態性減少了服務器從局部錯誤中恢復的任務量。
可伸縮性-無狀態性使得服務器可以很容易的釋放資源。
3. 緩存: 減少服務端不必要的處理。
4. 可伸縮性: 便于分布式和集群部署。
上面的2,3點也是影響4的主要因素。而隨著系統用戶規模的指數上升,可伸縮性將變的至關重要。
現在大多數應用程序都忽略或者違反了上述2, 3的風格。當然也肯定失去了4帶來的好處。
比如Java Servlet中HttpSession的應用,使服務器端保存了客戶端的狀態。
時下流行的動態頁面的做法也使得資源緩存變得困難或者不可能。
這些都直接影響了應用的可伸縮性。
改善現狀的思路是,把服務端的處理和狀態前移,由客戶端來實現。使服務端回歸到無狀態的特性。
以采用ajax技術的應用系統為例:因為不需要完全刷新就可以與服務器進行交互,使得有狀態客戶機成為可用選擇。基于瀏覽器的應用程序代碼可以在必要時獲取新的服務器數據,并把這些數據織入當前頁面。
將處理和狀態前移到每個客戶機上后,實現了無狀態的服務端;同時緩存服務器可以緩存ajax引擎(比如dojo, prototype etc.),以及狀態無關的數據。
個人理解,多種瀏覽器的plug-in技術(Sun的applet, MS的ActiveX等等),都應該是這種思路的不同技術實現。
經過以上分析整理,實際上已經涉及到了時下流行的一個概念-REST.
REST(Representational State Transfer)來源于Dr. Roy Thomas Fielding, <Architectural Styles and the Design of Network-based Software Architectures>
當瀏覽器瀏覽訪問一個url資源時,返回的頁面即為該url資源的representation,這個representation給瀏覽器一個state,當
瀏覽器訪問下一個url資源時,瀏覽器的state就transfer了。
REST其本身只是為分布式超媒體系統(distributed hypermedia systems)設計的一種架構風格,而不是某個標準,框架。
REST的設計準則
1.網絡上的所有事物都被抽象為資源(resource);
2.每個資源對應一個唯一的資源標識符(resource identifier);
3.通過通用的連接器接口(generic connector interface)對資源進行操作;
4.對資源的各種操作不會改變資源標識符;
5.所有的操作都是無狀態的(stateless)。
REST中的資源所指的不是數據,而是數據和表現形式的組合。
REST是基于Http協議的,任何對資源的操作行為都是通過Http協議來實現。以往的Web開發大多數用的都是Http協議中的GET和POST方法,對其他方法很少使用,這實際上是因為對Http協議認識片面的理解造成的。Http不僅僅是一個簡單的運載數據的協議,而是一個具有豐富內涵的網絡軟件的協議。他不僅僅能對互聯網資源進行唯一定位,而且還能告訴我們如何對該資源進行操作。Http把對一個資源的操作限制在4個方法以內:GET, POST,PUT和DELETE,這正是對資源CRUD操作的實現。由于資源和URI是一一對應的,執行這些操作的時候URI是沒有變化的,這和以往的 Web開發有很大的區別。正由于這一點,極大的簡化了Web開發,也使得URI可以被設計成更為直觀的反映資源的結構,這種URI的設計被稱作 RESTful的URI。這位開發人員引入了一種新的思維方式:通過URL來設計系統結構。當然了,這種設計方式對一些特定情況也是不適用的,也就是說不是所有的URI都可以RESTful的。
REST 之所以可以提高系統的可伸縮性,就是因為它要求所有的操作都是無狀態的。由于沒有了上下文(Context)的約束,做分布式和集群的時候就更為簡單,也可以讓系統更為有效的利用緩沖池(Pool)。并且由于服務器端不需要記錄客戶端的一系列訪問,也減少了服務器端的性能。