通過用例和模擬對象簡化 SOA 開發——特別在您的項目涉及多個團隊時——并提高 SOA 應用程序質量。借助于可重用服務和需要很少的新代碼的應用程序(因為可以依賴這些可重用服務),面向服務的體系結構 (SOA) 可以大幅度提高應用程序開發的速度。
但是 SOA 還可能大大增加應用程序開發的復雜性,因為團隊需要同時進行應用程序的不同部分的工作,而且要在最后成功地將各個部分組合起來。
SOA 開發問題
使用 SOA 開發應用程序可提供更多的應用程序部署選項,但也使得開發工作變得越發困難。這是因為 SOA 將應用程序開發拆分為兩個截然不同的部分:
例如,某個金融應用程序的 SOA 可能如圖 1 中所示。
圖 1 個人金融應用程序和服務
通常由獨立的團隊分別負責同時開發這兩個獨立的部分。一個團隊負責開發 SOA-SC——對用戶而言的應用程序。另一個團隊負責開發 SOA-SP,或許存在多個負責此項任務的團隊,而每個團隊負責開發若干服務。雖然可能已經實現了一些提供程序,但可能仍然需要專門為此應用程序實現其他的提供程序。
而這給我們提出了第一個問題:如果某些提供程序尚未實現,協調程序開發團隊如何開發其負責的應用程序部分呢?
這兩個團隊——開發服務的團隊和開發協調程序的團隊——需要使其活動同步。他們必須就服務 API 達成一致;服務 API 可以是簡單的 Java™ 接口或 Java Message Service (JMS) 消息格式和隊列名稱,但必須就此達成一致。但僅就接口達成一致是不夠的;服務具有行為,因此團隊必須就服務的行為達成一致。服務并不會始終成功地工作,因此團隊還必須就錯誤情況和相應的響應達成一致。
在理想的情況下,多個團隊可以非常容易地協調工作,最初的決策可以稍后進行修改,而所造成的影響卻非常小,并且評估工作非常靈活,此外還會不斷地進行改進。在現實世界中,團隊之間經常存在協作問題,往往較早地(甚至不成熟地)做出不可更改的決策,而且評估方法是固定的。
這樣就帶來了第二個問題:協調程序和提供程序團隊如何較早而可靠地就服務如何工作達成一致?
經常通過多個提供程序來實現服務冗余。這樣就可以在提供程序之間提供負載平衡和故障轉移功能,從而使得協調程序的服務體驗更為一致和可靠。冗余可以通過多次部署同一服務實現來實現。不過,當不同的供應商部署了不同的提供程序時,服務幾乎肯定具有不同的實現。盡管如此,對于協調程序,所有提供程序的全部實現的工作方式都必須一致,以便協調程序可以采用可交換的方式來調用提供程序。服務的不同實現(特別是來自不同供應商的不同實現)是由不同的團隊開發的,而這些團隊必須加以協調,以確保開發的是相同的服務。
因此,第三個問題就是:多個提供程序團隊如何實現相同的服務,以確保他們的實現具有兼容性?
以上是使用 SOA 進行開發的主要問題。必須實現尚未開發的服務來開發協調程序,協調程序團隊和提供程序團隊必須就服務如何工作達成一致,而且,多個提供程序團隊也必須就服務如何工作達成一致。如果沒有良好的流程,這就會導致一片混亂,如果不對其進行檢查,將會導致 SOA 項目失敗。
SOA 開發流程
下面給出用于對協調程序和提供程序團隊進行同步的簡單流程,以幫助確??芍赜梅找约笆褂眠@些服務的應用程序能夠成功地進行開發:
這個簡單的流程處理了以下問題:如何確定服務的范圍以及如何保持團隊的一致性和高效率,從而避免發生意外。公正地說,還有許多其他問題仍然沒有通過此流程得到解決。該流程并沒有涉及服務自身如何開發或協調應用程序如何開發的問題。它并不涉及服務的質量問題(即服務的可靠性問題),而是只定義服務如何提供必要的行為。該流程總體上也不處理傳統獨立應用程序如何使用 SOA 重新進行體系結構設計,以及如何發現或設計服務。所有這些問題都是必要的,但其并不在此流程的范圍之內。
此流程使協調應用程序和服務實現協同工作,并允許團隊以相當獨立的方式同時對這兩個部分進行開發。這并非 SOA 項目所需的全部內容,但卻是一個不錯的起點。
為了說明此流程,我將討論如何實現一個簡單服務。它就是大家都喜歡用的服務示例,即股票報價服務。為了讓內容更豐富一些,我提供了以下三種類型的信息:
此示例應該足以闡釋該流程的工作過程。
服務用例
此 SOA 開發流程中的第一步是開發描述服務的服務用例。
Alistair Cockburn 將用例 定義為“系統涉眾之間有關系統的行為的協定”(請參閱參考資料部分列出的 Writing Effective Use Cases)。用例必須適合所定義的系統范圍,能夠代表此情況下使用系統的主要參與者的觀點,且能夠在一致的抽象層次上表示參與者的系統使用情況。
Alistair 給出的一個例子是網上的股票購買服務,其中,購買者使用與股票代理的網站協同工作的個人金融應用程序來購買股票。系統范圍既包含金融應用程序,又包含代理的網站。購買者是主要的參與者。抽象級別為應用程序和網站之間的交互,而不是應用程序或網站內的詳細信息。用例將描述主要成功方案(購買者根據這些方案購買股票)和一些可能出現錯誤的擴展。
因此,用例是關于以下內容的文本描述:希望系統如何工作、將涉及到哪些人以及他們之間如何交互、系統在正常運行時如何工作,以及出現錯誤時應該如何處理。它關心的是系統將做什么,而不考慮將如何 實現。
現在,假定所討論的不是系統或應用程序,而是一個 SOA 服務。用例技術仍然適用??梢圆捎么思夹g來描述服務使用者與服務提供程序如何進行交互,說明服務做什么 而不用描述其如何 實現。服務用例 的最初草稿應將重點放在服務的行為上。由于這是必須調用的服務,因此后面的用例草稿還應該指定調用協議——將用于調用服務的技術、傳輸和數據格式。(用例純粹主義者甚至可能說協議不屬于用例的實現細節,他們是對的。但服務用例不僅描述服務,而且還要描述如何調用該服務,因此協議是使用者和提供程序參與者之間的協定的一部分,必須在某個地方加以指定。)
因此,開發用例的第一步是對服務完成的操作進行充分的描述。此描述代表了使用者對提供程序必須提供的行為的要求,主要由協調程序開發團隊創建,但同樣以提供程序開發團隊提供的輸出為基礎。這兩種類型的開發團隊必須對用例滿意才行,因為這些用例是對所有團隊開發其負責的應用程序部分的要求。
服務不僅要在條件良好的情況下正常工作,而且還要能夠恰當地處理出現錯誤的情況,這非常重要。因此,您的服務用例應該對錯誤情況和服務無法成功處理的錯誤輸入加以處理。其中很多錯誤路徑最終都表現為用例的備用路徑。其他錯誤場景也可能非常極端,因而需要各自的錯誤用例。在這兩種方法中,用例都必須記錄服務如何像成功路徑一樣全面地處理錯誤。
示例用例
例如,讓我們看看股票報價示例的服務用例。它需要做三件事,因此需要以下三個服務用例:
1. 簡單報價:使用者傳入股票代碼;提供程序返回指定的股票的當前價格。
2. 復雜報價:使用者傳入股票代碼;提供程序返回指定股票的當前價格,當前的最高價格、最低價格以及交易量。
3. 歷史報價:使用者傳入股票代碼和日期;提供程序返回指定股票和日期的復雜報價。
即便對于這樣的簡單示例,仍然需要確定很多問題并將其添加到用例中,如下所示:
即使開發本文中的簡單用例也不簡單。用例非常麻煩,必須考慮周全才能圓滿地完成開發工作。此時的細心工作是非常不錯的一項投資;利用好的服務用例可以開發良好的服務測試和服務模擬,從而幫助開發團隊正常進行開發工作。
共3頁: 1 [2] [3] 下一頁 |