鄭燦
(1.上海電力學(xué)院校長辦公室,上海200090;2.同濟(jì)大學(xué)軟件工程學(xué)院,上海 200092)
表述性狀態(tài)轉(zhuǎn)移(REpresentational State Transfer,REST)是一種分布式超媒體系統(tǒng)的軟件架構(gòu)風(fēng)格,它由HTTP協(xié)議的關(guān)鍵作者之一Roy Fielding博士在2000年的博士論文中提出并加以定義[1].REST從資源的角度來觀察整個(gè)應(yīng)用,分布在系統(tǒng)各處的資源由URI統(tǒng)一標(biāo)識,而客戶端則通過標(biāo)準(zhǔn)的HTTP方法來訪問資源.資源有多種表述方式,客戶端對資源的訪問使應(yīng)用改變了狀態(tài),隨著訪問資源的不斷表述,應(yīng)用也不斷地轉(zhuǎn)變狀態(tài),即所謂“表述性狀態(tài)轉(zhuǎn)移”.
文獻(xiàn)[2]提到了REST的5個(gè)關(guān)鍵原則,即:為所有資源定義標(biāo)識;將所有資源鏈接在一起;使用標(biāo)準(zhǔn)方法;資源多重表述;無狀態(tài)通信.具備了這5個(gè)原則的Web服務(wù)即可稱為Restful的Web服務(wù).
資源多重表述是REST的基本原則之一,它將資源用多種數(shù)據(jù)格式進(jìn)行表述.常用的數(shù)據(jù)格式有HTML,XML,JSON等.采用資源多重表述可以滿足不同的客戶端應(yīng)用的需要,如采用HTML和XML作為資源表述方式,資源就可以被標(biāo)準(zhǔn)瀏覽器所使用.此外,不同的資源表述方式在資源獲取的性能上存在差異[3-5].本文主要通過算法比較了不同資源表述方式在資源獲取時(shí)的性能差異.
本文基于RESTEasy設(shè)計(jì)開發(fā)了一個(gè)書店Rest服務(wù).對書店的資源(每一本書)都采用了資源多重表述方式,然后在獲取資源時(shí)比較不同方式下所耗費(fèi)的時(shí)間和空間.這些資源表述方式主要有以下幾種:XML(Extensible Markup Language);Atom;JSON(JavaScript Object Notation); Jackson JSON;YAML(YAML Ain’t Markup Language);Fastinfoset;KRYO;Hessian;Protobuf.
(1)XML是一種可擴(kuò)展標(biāo)記語言,作為Internet環(huán)境中跨平臺、依賴于內(nèi)容的技術(shù),是處理結(jié)構(gòu)化文檔信息的常用工具.XML作為一種簡單的數(shù)據(jù)存儲語言,可以使用一系列簡單的標(biāo)記描述數(shù)據(jù),而這些標(biāo)記可以用方便的方式建立.雖然XML占用的空間比二進(jìn)制數(shù)據(jù)更多,但XML極其簡單,易于掌握和使用.
(2)Atom是一種基于XML用來聯(lián)合內(nèi)容的文件格式,常用作經(jīng)常更新的博客和網(wǎng)站的統(tǒng)一發(fā)布標(biāo)準(zhǔn).
(3)JSON是一種輕量級的數(shù)據(jù)交換格式,易于閱讀和編寫,同時(shí)也易于機(jī)器解析和生成.它是基于JavaScript Programming Language,Standard ECMA-262 3rd Edition-December 1999的一個(gè)子集.JSON采用完全獨(dú)立于語言的文本格式,是一種理想的數(shù)據(jù)交換語言.
(4)YAML是一種用來表達(dá)資料序列的編程語言.與XML不同,這種語言以數(shù)據(jù)為中心,而不是以標(biāo)記語言為重點(diǎn).它具有可讀性好、與腳本語言的交互性好、信息模型一致、易于實(shí)現(xiàn)等優(yōu)點(diǎn).
(5)Fastinfoset即快速信息集,是一種為XML信息集提供二進(jìn)制編碼來替代XML的技術(shù)框架.它提供更優(yōu)于基于文本的XML序列化性能和大小的序列化格式.
(6)KRYO是一個(gè)快速高效的Java對象網(wǎng)絡(luò)序列化框架,其主要特點(diǎn)是性能高效、易用,可以采用序列化對象,使其進(jìn)入文件、數(shù)據(jù)庫或網(wǎng)絡(luò).
(7)Hessian是一種用于連接Web Services的簡單二進(jìn)制協(xié)議,可使各種Web Services不需要復(fù)雜的框架就可以做到無縫連接.由于它是二進(jìn)制協(xié)議,故其發(fā)送或接收二進(jìn)制數(shù)據(jù)時(shí)不需要擴(kuò)展任何協(xié)議.
(8)Protobuf是用于結(jié)構(gòu)化數(shù)據(jù)序列化的靈活、高效、自動的方法,比XML更小、更快,也更簡單.Protobuf的使用者可以自定義數(shù)據(jù)結(jié)構(gòu),然后使用代碼生成器生成的代碼來讀寫這個(gè)數(shù)據(jù)結(jié)構(gòu),甚至可以在無需重新部署程序的情況下更新數(shù)據(jù)結(jié)構(gòu).Google公司內(nèi)部的RPC協(xié)議和文件格式基本都使用了Protobuf.
本文所設(shè)計(jì)的書店REST服務(wù),涉及的資源對象類見圖1.每本書都有一系列的信息字段,如書號、書名、作者、價(jià)格、出版時(shí)間、簡介等,其中作者又包括編號、姓名、年齡和出生日期等信息.一系列的書組成書列.本文資源獲取的單元主要為書列,以獲取100本、1 000本和10 000本書的書列為例,比較其資源獲取時(shí)間和空間耗費(fèi).

圖1 資源對象類示意
本文主要使用RESTEasy框架來開發(fā)此書店REST應(yīng)用.RESTEasy框架提供了豐富的資源表述方式,如XML,JSON,YAML,F(xiàn)astinfoset,Atom等,本文在使用上述框架自帶的資源表述方式的供應(yīng)器(Provider)以外,還擴(kuò)展了幾種資源表述方式供應(yīng)器,如KRYO,Hessian,Protobuf,使資源表述方式更加豐富.這些資源表述方式都是二進(jìn)制的序列化格式,性能較為優(yōu)異,在業(yè)界較為流行,應(yīng)用也很普遍.
本文所采用的資源獲取性能比較算法主要依據(jù)時(shí)間耗費(fèi)和空間耗費(fèi)兩個(gè)指標(biāo),具體比較算法為:計(jì)算取得n本書的書列時(shí),使用各種資源表述方式所需要的資源獲取時(shí)間和占用空間.在設(shè)置HTTPGET方法無緩存的情況下重復(fù)100次,然后計(jì)算100次資源獲取的平均時(shí)間和占用空間的平均值,并進(jìn)行比較.本文共比較了3組資源表述方式,n分別為100,1 000,10 000.需要注意的是,如設(shè)置資源獲取無緩存,則GET方法的響應(yīng)必須要設(shè)置NoCache,以避免緩存對資源獲取造成的影響.
表1為獲取100本、1 000本和10 000本書的書列時(shí)各種資源表述方式所需要的時(shí)間值,該時(shí)間值是指100次資源獲取時(shí)間的平均值.

表1 時(shí)間耗費(fèi)數(shù)據(jù)結(jié)果統(tǒng)計(jì)ms
表2為獲取100本、1 000本和10 000本書的書列時(shí)各種資源表述方式所需要占用的空間耗費(fèi)數(shù)據(jù),這個(gè)空間指的是100次資源獲取所占用空間大小的平均值.

表2 空間耗費(fèi)數(shù)據(jù)結(jié)果統(tǒng)計(jì)字節(jié)
由表1和表2可知,采用不同的資源表述方式,其時(shí)間耗費(fèi)和空間耗費(fèi)均存在差異.
(1)在獲取100本書的資源時(shí),時(shí)間耗費(fèi)從少到多依次為:Kryo,Hessian,Protobuf,F(xiàn)astinfoset,JSON(jettison),Jackson,Atom,XML,YAML.空間耗費(fèi)從少到多依次為:Hessian,Kryo,Protobuf,F(xiàn)astinfoset,Jackson,JSON(jettison),XML,Atom,YAML.
(2)在獲取1 000本書的資源時(shí),時(shí)間耗費(fèi)從少到多依次為:Hessian,Kryo,F(xiàn)astinfoset,Protobuf,Jackson,JSON(jettison),Atom,XML,YAML.空間耗費(fèi)從少到多依次為:Hessian,Kryo,Protobuf,F(xiàn)astinfoset,JSON(jettison),Jackson,Atom,XML,YAML.
(3)在獲取10 000本書的資源時(shí),時(shí)間耗費(fèi)從少到多依次為:Hessian,Kryo,F(xiàn)astinfoset,Jackson,JSON(jettison),Protobuf,Atom,XML,YAML.空間耗費(fèi)從少到多依次為:Hessian,Kryo,Protobuf,F(xiàn)astinfoset,JSON(jettison),Jackson,Atom,XML,YAML.
將所有時(shí)間耗費(fèi)數(shù)據(jù)匯集在一起,見圖2.將所有空間耗費(fèi)數(shù)據(jù)匯集在一起,見圖3.

圖2 資源獲取時(shí)間耗費(fèi)對比

圖3 資源獲取空間耗費(fèi)對比
由圖2和圖3可知,采用不同的資源表述方式,其資源獲取時(shí)的時(shí)間耗費(fèi)和空間耗費(fèi)均存在差異.在本文所采用的資源和算法實(shí)現(xiàn)下,以二進(jìn)制字節(jié)碼作為序列化結(jié)果的資源表述方式(如Hessian,Kryo,F(xiàn)astinfoset,Protobuf),其資源獲取時(shí)的時(shí)間耗費(fèi)和空間耗費(fèi)都較少,性能較好.另外,資源獲取的時(shí)間耗費(fèi),與采用不同的資源表述方式進(jìn)行序列化和反序列化所耗費(fèi)的時(shí)間大小,以及序列化結(jié)果的空間大小有一定的關(guān)系.
(1)資源多重表述是REST的基本原則之一.不同的資源表述方式對于資源訪問有著性能差異.在本文所設(shè)計(jì)的書店REST服務(wù)應(yīng)用中,對于書列資源,以二進(jìn)制字節(jié)碼作為序列化結(jié)果的資源表述方式在資源獲取時(shí)的時(shí)間耗費(fèi)較少,性能較好.
(2)選擇不同的資源表述方式不僅需要考慮客戶端應(yīng)用的需要,也應(yīng)考慮其性能指標(biāo).使用二進(jìn)制字節(jié)碼作為序列化結(jié)果的資源表述方式在犧牲可讀性的同時(shí)可以提供更優(yōu)的性能.
[1]FIELDINGR T.Architectural styles and the design of networkbased software architectures[EB/OL].[2011-04-15]http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm.
[2]TILKOV Stefan.A brief introduction to REST[EB/OL].[2007-12-10]http://www.infoq.com/articles/restintroduction.
[3]鄧濤.REST服務(wù)開發(fā)實(shí)戰(zhàn)[EB/OL].[2011-02-22]http://www.infoq.com/cn/articles/dt-rest-service.
[4]許卓明,栗明,董逸生.基于RPC和基于REST的Web服務(wù)交互模型比較分析[J].計(jì)算機(jī)工程,2003,29(20):6-8.
[5]馮新?lián)P,沈建京.REST和RPC:兩種Web服務(wù)架構(gòu)風(fēng)格比較分析[J].小型微型計(jì)算機(jī)系統(tǒng),2010(7):1 393-1 396.
(編輯胡小萍)