面向資源的架構(gòu)(ROA)概述

【注】本文譯自:?「鏈接」
了解面向資源的架構(gòu) (ROA)、其價(jià)值以及最佳實(shí)踐。

面向服務(wù)的架構(gòu) (Service-Oriented Architecture,SOA) 和面向資源的架構(gòu) (Resource-Oriented Architecture,ROA) 是用于實(shí)現(xiàn)健壯、可擴(kuò)展的分布式應(yīng)用程序架構(gòu)的架構(gòu)設(shè)計(jì)模式。分布式架構(gòu)由通過(guò)定義良好的接口在網(wǎng)絡(luò)上使用的組件組成。在 ROA 中,這些組件被稱為資源,而在 SOA 中,它們被稱為服務(wù)。本文概述了面向資源的體系結(jié)構(gòu)。
什么是面向資源的架構(gòu) (ROA)?
面向資源的架構(gòu) (ROA) 是一種架構(gòu)風(fēng)格,它擴(kuò)展了 REST 架構(gòu)風(fēng)格,并提供了更廣泛、可擴(kuò)展、靈活且與傳輸無(wú)關(guān)的架構(gòu)。面向資源的架構(gòu) (ROA) 范式建立在資源的概念之上。資源是一個(gè)獨(dú)立的、可識(shí)別的實(shí)體,其狀態(tài)可以被分配一個(gè)統(tǒng)一的資源定位符 (URI)。服務(wù)代表所請(qǐng)求操作的執(zhí)行,而資源代表可通過(guò)一致的標(biāo)準(zhǔn)化接口進(jìn)行管理的分布式組件。
面向資源架構(gòu)的特征之一是與傳輸無(wú)關(guān)。因此,必須有特定的機(jī)制將面向資源的服務(wù)暴露給外部世界。當(dāng)消費(fèi)者請(qǐng)求統(tǒng)一資源定位器(Uniform Resource Locator,URL)并指定訪問方法(例如,GET、PUT、POST 和 DELETE)時(shí),該 URL 將轉(zhuǎn)換為相對(duì)的內(nèi)部 URI。訪問方法被轉(zhuǎn)化為動(dòng)作。
面向資源的架構(gòu)僅圍繞四個(gè)概念建模:
資源
URI
表述
鏈接和連通性
以下是面向資源架構(gòu)的四個(gè)屬性:
可尋址性
無(wú)狀態(tài)性
連通性
統(tǒng)一的接口
面向資源的架構(gòu):資源
資源是 ROA 的基石;資源是信息的邏輯表示。例如,學(xué)生是數(shù)據(jù)點(diǎn)的抽象集合,可以用多種方式表示,包括 XHTML、JSON 和 XML。 資源名稱包括以下內(nèi)容:
資源的類型
資源標(biāo)識(shí)符
父元素的資源名
API 服務(wù)的名稱
資源是 REST 或 RESTful 架構(gòu)中最重要的信息抽象。術(shù)語(yǔ)“資源”是指任何可識(shí)別的信息。這些信息可以是文檔、計(jì)算機(jī)、汽車、臨時(shí)服務(wù)(例如“俄亥俄州今天的天氣”)、其他資源的集合、個(gè)人、學(xué)生等。
每個(gè)不可變資源表示都可以通過(guò)相對(duì)的統(tǒng)一資源指示符 (URI) 來(lái)標(biāo)識(shí),它可能包括到其他資源以及其他不可變資源的連接。請(qǐng)注意,一個(gè)資源也可以有多個(gè) URI。
每種資源應(yīng)具有以下特征:
是唯一的
必須至少有一個(gè)表述
具有屬性,模式可以被訪問并提供上下文
統(tǒng)一資源標(biāo)識(shí)符(URI)
統(tǒng)一資源標(biāo)識(shí)符 (Uniform Resource Identifier,URI) 是包含資源名稱和地址的字符序列,用于標(biāo)識(shí)邏輯或物理資源。請(qǐng)注意,資源必須具有一個(gè)或多個(gè) URI。 沒有 URI,一條信息不被視為資源,因?yàn)樗荒鼙灰没蛟L問。 您可以使用 URI 來(lái)標(biāo)識(shí)任何事物,例如現(xiàn)實(shí)世界的對(duì)象、網(wǎng)頁(yè)、書籍等。
下面是一個(gè) URI 的例子:
語(yǔ)法::
示例:
http://payroll/employee/1234
下表說(shuō)明了如何指定資源的相對(duì) URI:
動(dòng)作相對(duì) URI目的
Read/student/3讀取 ID 是 3 的學(xué)生記錄
Delete/student/4刪除 ID 是 4 的學(xué)生記錄
面向資源架構(gòu)ROA的特性
以下是面向資源的架構(gòu)的四個(gè)基本屬性:
可尋址性
可尋址性是面向資源架構(gòu)的一個(gè)基本特征。如果應(yīng)用程序?qū)⑵鋽?shù)據(jù)集的感興趣方面發(fā)布為服務(wù)端點(diǎn),則可以認(rèn)為該應(yīng)用程序是可尋址的。這些服務(wù)可以反過(guò)來(lái)用于處理應(yīng)用程序的數(shù)據(jù)。由于 ROA 中的資源使用 URI 公開,因此應(yīng)用程序應(yīng)使用 URI 公開其數(shù)據(jù)。
無(wú)狀態(tài)
無(wú)狀態(tài)是面向資源架構(gòu)的另一個(gè)特征,這意味著該架構(gòu)中的每個(gè) HTTP 請(qǐng)求都是獨(dú)立發(fā)生的。換句話說(shuō),當(dāng)客戶端向服務(wù)器請(qǐng)求資源時(shí),客戶端必須提供服務(wù)器請(qǐng)求成功所需的所有信息。服務(wù)器從不存儲(chǔ)來(lái)自先前請(qǐng)求的信息,也就是說(shuō),服務(wù)器上不存儲(chǔ)狀態(tài)信息。如果服務(wù)器需要來(lái)自較早請(qǐng)求的信息來(lái)處理請(qǐng)求,則客戶端必須在另一個(gè)請(qǐng)求中再次發(fā)送該信息。
連通性
在面向資源的架構(gòu)中,表述是超媒體:包含數(shù)據(jù)和其他資源鏈接的文檔。RESTful Web 服務(wù)遵循超媒體作為應(yīng)用程序狀態(tài)引擎 (Hypermedia As the Engine Of Application State, HATEOS) 原則。這是數(shù)據(jù)格式影響應(yīng)用程序中轉(zhuǎn)換狀態(tài)的原則。到其他資源的鏈接嵌入在響應(yīng)中,但對(duì)于相同的資源,它們可能會(huì)根據(jù)其當(dāng)前狀態(tài)而有所不同。
網(wǎng)絡(luò)最重要的特征之一是它的互連性。也就是說(shuō),互聯(lián)網(wǎng)上的幾乎所有信息都通過(guò)超鏈接鏈接在一起。超鏈接可用于將互聯(lián)網(wǎng)上可訪問的任何資源連接到另一個(gè)資源?;?ROA 構(gòu)建的應(yīng)用程序應(yīng)將其所有資源相互鏈接,反之亦然。當(dāng)我們?yōu)橘Y源選擇合適的表述時(shí),我們可以在應(yīng)用程序中實(shí)現(xiàn)連通性。
統(tǒng)一接口
您應(yīng)該有一組定義良好的方法來(lái)操作應(yīng)用程序中的資源。例如,HTTP 提供了以下您可能通常需要在任何應(yīng)用程序中執(zhí)行的常見操作:
HTTP GET – 獲取一個(gè)資源
HTTP POST – 創(chuàng)建新資源
HTTP PUT – 修改一個(gè)存在的資源
HTTP DELETE – 刪除一個(gè)存在的資源
HEAD 和 OPTIONS HTTP 方法
下面是您應(yīng)該了解的另外兩個(gè)重要的 HTTP 方法:
HTTP HEAD – 用于檢索資源的元數(shù)據(jù)表述
HTTP OPTIONS –?用于檢查特定資源支持哪些 HTTP 方法
總結(jié)
面向資源的體系結(jié)構(gòu)是無(wú)狀態(tài)的,并以資源為中心。URI 用于標(biāo)識(shí)每個(gè)資源。您總是可以在計(jì)算機(jī)上同時(shí)擁有同一資源的多個(gè)副本。一個(gè)資源也可以有多個(gè) URI。