自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

REST構(gòu)架風(fēng)格介紹:狀態(tài)表述轉(zhuǎn)移

開(kāi)發(fā) 架構(gòu)
本文總結(jié)了一些REST風(fēng)格構(gòu)架設(shè)計(jì)的經(jīng)驗(yàn),介紹了REST架構(gòu)的語(yǔ)言生態(tài)環(huán)境,狀態(tài)表述轉(zhuǎn)移,無(wú)狀態(tài)服務(wù)器等特點(diǎn),并通過(guò)舉例Google來(lái)說(shuō)明REST風(fēng)格的味道。

REST(Representational State Transfer)HTTP協(xié)議的作者Roy Fielding博士在其博士論文中提出的一種互聯(lián)網(wǎng)應(yīng)用構(gòu)架風(fēng)格。與以遠(yuǎn)程對(duì)象為核心的ORB和以服務(wù)為核心的SOA相比,以資源為核心的REST讓我們從嶄新的視角審視互聯(lián)網(wǎng)應(yīng)用。REST為互聯(lián)網(wǎng)應(yīng)用量身定做的簡(jiǎn)潔模型、與HTTP協(xié)議的完美結(jié)合、構(gòu)架的高擴(kuò)展性,為互聯(lián)網(wǎng)應(yīng)用構(gòu)架設(shè)計(jì)和異構(gòu)系統(tǒng)集成設(shè)計(jì)帶來(lái)了一股清新的空氣。

語(yǔ)言生態(tài)環(huán)境

計(jì)算機(jī)發(fā)展至今,產(chǎn)生了許許多多不同的語(yǔ)言,每種語(yǔ)言都定義了自己獨(dú)特的生態(tài)環(huán)境。在這個(gè)生態(tài)環(huán)境內(nèi)的程序共享相同的類(lèi)型系統(tǒng)、運(yùn)行時(shí)環(huán)境、并發(fā)模型等。雖然所有程序的本質(zhì)是相同的:從問(wèn)題領(lǐng)域到機(jī)器領(lǐng)域的映射,但無(wú)法回避的是不同生態(tài)環(huán)境的程序很難跨越彼此的邊界。同樣是int,在AB語(yǔ)言通常截然不同(CLRJVM能部分解決類(lèi)型共享問(wèn)題),更不用說(shuō)A語(yǔ)言具有但B語(yǔ)言不具有的某些語(yǔ)言特性(CLRJVM沒(méi)法解決)。

當(dāng)系統(tǒng)可以在單一的生態(tài)環(huán)境中自給自足時(shí),跨越生態(tài)環(huán)境的問(wèn)題并不存在;但在多數(shù)互聯(lián)網(wǎng)應(yīng)用中,系統(tǒng)的各個(gè)部分通常既是生產(chǎn)者又是消費(fèi)者,必須要打破生態(tài)環(huán)境的界限才能相互協(xié)作。比如,A公司的Service A,需要對(duì)外提供服務(wù),而Service A又依賴(lài)于B公司的Service BC公司的Service C;由于無(wú)法保證不同公司都采用同樣的語(yǔ)言,因此各服務(wù)的接口必須保證語(yǔ)言無(wú)關(guān)性。在我所了解的范圍內(nèi),有3種跨域生態(tài)環(huán)境的方式:

1.      ORB(Object Request Broker)

CORBA為代表,其核心概念是遠(yuǎn)程對(duì)象(remote object)。熟悉.Net Remoting的朋友應(yīng)該能體會(huì)其風(fēng)格(需要說(shuō)明的是.Net Remoting只跨越微軟的生態(tài)環(huán)境)。不同生態(tài)環(huán)境的程序可以像調(diào)用本地對(duì)象一樣調(diào)用遠(yuǎn)程對(duì)象代理的方法,ORB會(huì)負(fù)責(zé)連接到遠(yuǎn)程的對(duì)象,并處理數(shù)據(jù)的序列化與反序列化。

2.      SOA

其核心概念是服務(wù)(Service)。比如:我們要提供整數(shù)加法Web服務(wù),我們會(huì)很自然地想到通過(guò)類(lèi)似下面的url來(lái)表達(dá)服務(wù)接口:

http://www.example.com/add?a=1&b=2

并通過(guò)xml結(jié)構(gòu)表達(dá)結(jié)果:

3.      REST

其核心概念是資源(Resource)。在REST的世界中,沒(méi)有服務(wù)的概念,同樣是上面的例子,在REST的世界中,http://www.example.com/add?a=1&b=2是一個(gè)xml網(wǎng)頁(yè)資源的id,而非服務(wù)的接口。所以,REST讓我們從資源的角度來(lái)審視互聯(lián)網(wǎng)應(yīng)用并指導(dǎo)我們的設(shè)計(jì),這是它與ORB和SOA最本質(zhì)的區(qū)別。下面我們將更詳細(xì)的介紹,REST以資源為核心的模型和相應(yīng)的設(shè)計(jì)風(fēng)格。

狀態(tài)表述轉(zhuǎn)移

REST的世界中,資源即狀態(tài),而互聯(lián)網(wǎng)就是一個(gè)巨大的狀態(tài)機(jī):每個(gè)網(wǎng)頁(yè)是其一個(gè)狀態(tài);url是狀態(tài)的表述;REST風(fēng)格的應(yīng)用則是從一個(gè)狀態(tài)遷移到下一個(gè)狀態(tài)的狀態(tài)轉(zhuǎn)移過(guò)程。早期互聯(lián)網(wǎng)只有靜態(tài)頁(yè)面的時(shí)候,通過(guò)超鏈接在靜態(tài)網(wǎng)頁(yè)間瀏覽跳轉(zhuǎn)的page->link->page->link…模式就是一種典型的狀態(tài)轉(zhuǎn)移過(guò)程。

無(wú)狀態(tài)服務(wù)器 

REST風(fēng)格應(yīng)用可以實(shí)現(xiàn)交互,但它卻天然地具有服務(wù)器無(wú)狀態(tài)的特征。在狀態(tài)遷移的過(guò)程中,服務(wù)器不需要記錄任何Session,所有的狀態(tài)都通過(guò)url的形式記錄在了客戶(hù)端。PS:更準(zhǔn)確地說(shuō),這里的無(wú)狀態(tài)服務(wù)器,是指服務(wù)器不保存會(huì)話(huà)狀態(tài)(Session);而資源本身則是天然的狀態(tài),通常是需要被保存的;本文提到的無(wú)狀態(tài)服務(wù)器均指無(wú)會(huì)話(huà)狀態(tài)服務(wù)器。

舉個(gè)例子:一個(gè)心理測(cè)試的應(yīng)用,需要用戶(hù)做2次選擇題,每次可選A、B兩種答案,2次選擇完畢之后將告知用戶(hù)屬于何種心理類(lèi)型。

如果按ORB或SOA的服務(wù)思維,很容易想到在服務(wù)器端保存Session,每次選擇以后修改Session,根據(jù)Session產(chǎn)生結(jié)果。但如果以REST的狀態(tài)表述轉(zhuǎn)移模型為指導(dǎo),我們會(huì)自然地得出這樣設(shè)計(jì):


每一個(gè)頁(yè)面表示一個(gè)狀態(tài)(存在于客戶(hù)端),頁(yè)面包含了到下一個(gè)頁(yè)面的超鏈接,每當(dāng)用戶(hù)選a或選b時(shí)分別轉(zhuǎn)移到下一個(gè)相應(yīng)的狀態(tài)。這樣,所有的會(huì)話(huà)狀態(tài)其實(shí)都是通過(guò)url的形式保存在了客戶(hù)端,服務(wù)器端實(shí)現(xiàn)了無(wú)狀態(tài)。另外,需要說(shuō)明的是,雖然上圖有7個(gè)狀態(tài),但并非一定需要在服務(wù)器預(yù)先生成7個(gè)靜態(tài)頁(yè)面,它們完全可以是動(dòng)態(tài)頁(yè)面,這不影響狀態(tài)轉(zhuǎn)移的概念模型以及服務(wù)器無(wú)狀態(tài)的特征。

有構(gòu)架設(shè)計(jì)經(jīng)驗(yàn)的朋友應(yīng)該很清楚,與有狀態(tài)服務(wù)設(shè)計(jì)相比,無(wú)狀態(tài)服務(wù)容易實(shí)現(xiàn)系統(tǒng)性能的橫向擴(kuò)展。通過(guò)增加硬件,部署多個(gè)無(wú)狀態(tài)服務(wù),并進(jìn)行load balance不會(huì)受到制約;而有狀態(tài)服務(wù)模式,Session的存儲(chǔ)、共享都會(huì)帶來(lái)性能瓶頸,且無(wú)法通過(guò)增加硬件消除。

Google搜索就是一個(gè)典型的無(wú)狀態(tài)服務(wù)。試想一下,當(dāng)你搜索“周杰倫”以后,Google提示你有數(shù)百萬(wàn)的結(jié)果,并每10條一頁(yè)分成若干頁(yè),Google會(huì)把結(jié)果保存進(jìn)服務(wù)器Session嗎,然后當(dāng)你翻頁(yè)的時(shí)候,再?gòu)腟ession中取嗎?顯然這樣龐大的Session,即使是Google也無(wú)法承受。來(lái)看看Google的url:

第一頁(yè):http://www.google.cn/search?q=%E5%91%A8%E6%9D%B0%E4%BC%A6&hl=zh-CN&newwindow=1&start=0&sa=N  

第二頁(yè):http://www.google.cn/search?q=%E5%91%A8%E6%9D%B0%E4%BC%A6&hl=zh-CN&newwindow=1&start=10&sa=N 

Google把搜索結(jié)果的每一頁(yè)視為資源(狀態(tài)),并通過(guò)url來(lái)表示,同一搜索關(guān)鍵字的不同分頁(yè)通過(guò)start參數(shù)來(lái)進(jìn)行區(qū)分。當(dāng)你從第一頁(yè)點(diǎn)擊第二頁(yè)的鏈接時(shí),只是從一個(gè)狀態(tài)跳到了下一個(gè)狀態(tài)而已;對(duì)于Google而言,其實(shí)是一條新的查詢(xún)(按REST的觀(guān)點(diǎn),獲取新的資源),而兩次查詢(xún)很可能是由不同的服務(wù)器在處理,而用戶(hù)卻感覺(jué)Google似乎記住了會(huì)話(huà)。

從上面的例子中,我們初步體會(huì)到了一點(diǎn)REST風(fēng)格的味道。但需要說(shuō)明,REST風(fēng)格包含了無(wú)狀態(tài)服務(wù)器的特征;但反過(guò)來(lái),并非具有無(wú)狀態(tài)服務(wù)器特征的都是REST。SOA同樣可以是無(wú)狀態(tài)的,REST的核心還是資源。 

【編輯推薦】

  1. Sun即將啟動(dòng)云計(jì)算策略 核心基于REST架構(gòu)
  2. 熱門(mén)Web開(kāi)發(fā)方式 REST實(shí)現(xiàn)原理淺析
  3. 使用 XML 實(shí)現(xiàn) REST 式的 SOA
責(zé)任編輯:yangsai 來(lái)源: 博客園
相關(guān)推薦

2021-08-31 19:12:51

Java服務(wù)安全

2010-01-08 12:03:42

ibmdwREST

2010-01-07 09:59:16

RESTMVC

2024-01-23 09:08:47

軟件架構(gòu)REST

2011-04-28 09:23:36

REST

2011-10-19 13:47:57

ibmdwRationalWAS

2021-01-31 23:58:04

MySQL狀態(tài)表數(shù)據(jù)源

2023-01-10 09:48:03

RESTAPIJersey

2010-02-25 16:07:28

WCF REST

2010-01-28 16:05:09

C++風(fēng)格與技巧

2025-04-17 01:11:00

2009-06-16 13:30:32

REST無(wú)狀態(tài)

2010-02-23 14:24:50

WCF狀態(tài)保存

2010-04-22 10:59:45

Lvs負(fù)載均衡

2010-06-09 14:43:27

2010-06-13 17:46:47

2009-07-29 17:45:09

ibmdwWebREST

2009-07-31 16:26:28

ibmdwREST

2009-12-23 11:10:38

ADO.NET狀態(tài)

2009-12-30 17:44:22

Silverlight
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)