天天看點

【什麼是soa roa 談談兩種技術的原理及适用場景】

本真REST當然是對面向資源架構的一種實作,而并非一種純粹的技術決策。是以當讨論本真REST時,真正bai應該讨論的問題是:其基礎支撐——面向資源的架構(ROA)——是否真的适合作為你的SOA實作。

為正确評估該問題,讓我們首先回想一下SOA的架構風格,它是基于企業業務架構的功能性分解,并且引入了兩個高層次的抽象:企業業務服務和業務流程。企業業務服務代表的是現有IT能力(和企業的業務功能相一緻)。業務流程編排業務服務,并定義業務的整體功能。

而REST是一組被稱之為面向資源架構(ROA)的架構準則。ROA建構在資源這一概念之上;每個資源都是一個能夠直接通路的分布式元件,可通過一個标準的、通用的接口來處理。是以,面向資源的架構(ROA)其最根本的還是一種基于資源的分解[3]。

為了評估本真REST是否适用于面向SOA的實作,我們真正需要回答的問題是,“服務和資源之間到底是什麼關系?”

服務 vs. 資源

何為服務?

在最簡單的情況下,服務可以被定義為一個自包含、獨立開發、可部署、可管理和可維護的軟體實作,它從整體上為企業提供特定的與業務相關的功能,并且在設計上是“可內建的”。“服務”可以通過動詞(verb)來定義(例如,“驗證客戶信用積分”,這描述了服務實作的業務功能)。

服務并不是某個程式設計結構或一組APIs,而是一個用于實作企業解決方案的架構(設計單元、實作以及維護)和部署構件。服務接口(尤其對某個給定的服務而言)定義服務功能,并且可由多種方式實作。存在兩種基本的定義服務接口的方法——RPC風格和消息(messaging)風格,RPC風格實作使用服務調用語義并且通過服務接口中的一組參數來定義。而消息風格的服務接口被有效地固定(本質上隻需要進行“執行”操作)使用XML文檔作為輸入和輸出(這和GoF設計模式非常相似)。在這種情況下,服務語義是由輸入和輸出消息的語義來确定[4]。

過去,服務通常被定義為一組方法的集合,但正如參考文獻[2]中解釋的那樣,這些方法彼此互相獨立[5],但作為整體它們共享同一個命名空間,這樣簡化了對服務的管理。

何為資源?

在最簡單的情況下,資源可以被定義為一個可直接通路的、獨立開發的、可部署的、可管理的和可維護的軟體構件,它支援特定的資料。資源可以通過名詞(noun)來定義,比如“醫生的預約”就描述了資源提供的資料。某一資源也可以和其他資源相關聯并為它們提供引用(連結)。實際上,一個資源就類似于一個對象[6],不過它是帶有預定義(CRUD)接口語義的對象。

REST中的語義基于HTTP操作集,如下所示[5]:

createResource——建立一個新的資源(以及相應的唯一标示)– PUT

getResourceRepresentation——擷取資源資訊– GET

deleteResource ——删除資源(可選地包括相關聯的資源)– DELETE(隻是引用的資源),POST(當需要删除相關聯的資源時使用)

modifyResource——更改資源— POST

getMetaInforatmion——取得資源中繼資料資訊—HEAD

資源通過兩部分定義:資源URL和資源所提供的所有操作上定義的輸入/輸出參數[7]。這和服務不同,服務的方法之間是完全獨立,并且能夠以獨立端點(endpoints)的方式部署,而資源上的方法遵循OO語義,這意味着所有的方法(除createResource以外)都必須依附于底層的某個資源(同一個URL)。

資源和服務之間的根本差異

基于上述對資源和服務的定義,憑直覺它們顯然是不同的。我們先繼續深究這些差别,然後再讨論它們是如何對最終架構産生影響的。

正如文獻[6]中描述的:

REST不僅不是面向服務的,相反,面向服務和REST風馬牛不相及

文獻[7]中進一步闡明了二者之間的差別:

如果把WS-*比作是網際網路世界的RPC,那麼REST就是網際網路世界的資料庫管理系統(DBMS)……傳統的基于SOA的內建表現了不同軟體構件之間通過各種過程或方法進行互動。REST有效地将每個軟體構件看作一組資料庫表,而這些構件之間使用SELECT, INSERT, UPDATE和DELETE來通信。(或如你所想的使用GET, PUT, POST, DELETE)。那業務邏輯放在哪裡呢?在存儲過程中?不太對,其實在觸發器中。

這裡我們用J2EE打個稍微不太恰當的比方。我們把服務想象成無狀态會話bean,而資源想象成實體bean。

服務(或會話beans)作為控制器控制執行所需的操作,不管底層是哪個資源。打個比方,某個支出賬戶服務可能會用到賬戶ID、支出金額和支出所需賬戶。這樣的服務可以支出任何現有賬戶。

資源(或實體bean)充當資料通路機制,其面對給定資料類型的某一執行個體。比如,為了從某一賬戶支出,需要先找到這一賬戶相關的資訊,然後才能更新它,進而向所需賬戶進行支出。另外提醒一下,與能實作任意所需的方法的實體bean不同的是,一個REST資源隻有一個更改資源的方法。這意味着真實的業務操作——支出——隻能編碼成消息請求的一部分。