jim yeh on 一月 18th, 2008

服務導向的架構中,服務層的概念可以讓服務的應用與實作不會相互干擾。讓業務的歸業務,技術的歸技術,彼此之間則是透過應用服務來溝通,以達成以技術實作來實現業務需求。不過,當面臨業務的擴增時,需求的變化常使得應用服務面臨改變,令開發者相當困擾。

例如,當業務環境面臨改變時,系統也必須視使用情境變化而進行調整,如此將影響到應用服務的設計與實作。但這種改變與調整勢必將影響到了服務導向架構不讓軟體需求直接耦合技術實作的初衷。

換句話說,直接依據需求的變化而調整服務的設計,將無法讓業務需求與技術實作相互獨立。如果任由這樣的情形發生,設計將會愈變愈複雜,並且在未來的某一天宣告無法適應業務需求的變動,到時候情況就會變得相當麻煩。

為什麼會發生這樣的情況呢?依據同人的軟體開發經驗顯示,多變的技術與不確定的需求常常會相互影響而增加了整合的複雜性。不同的技術實作方式,常常基於一些假設,但這些假設卻成為了讓系統難以整合的風險來源,而為了解決問題往往就在相互牽就的情況下,使設計增加了沒有必要的複雜度

一般而言,服務導向架構的軟體開發會將應用服務抽離出來,並提供服務界面以供使用者界面呼叫使用,同時其它應用系統也可以透過相同的服務界面來調用應用服務。不過,問題就在於跨功能或技術領域的系統,它們很難能夠分享相同的設計模型。以功能來看,因為解決的問題不同所以設計觀點會有很大的不同;同樣的道理,技術實作方法的差異,也讓彼此在資訊的傳送上面臨極大的挑戰。

為了解決以上的困境,在軟體架構上應該保護應用服務儘量不受需求變動的影響。因此,我們必須為應用服務設計減震點來緩衝需求變動所帶來的衝擊,並且讓應用服務可以很有彈性地被重組,使得應用服務的開發變得更有效率。而且這個減震點必須可以支援跨系統甚至是跨平台或程式語言的需求,因為這樣才能不會受限於不同的技術領域,而達到完全地整合各種異質性系統的目的。

如何能滿足以上設計需求呢?Façade Pattern 可以符合這些需求,設計 Service Façade 讓它來負責實際應用服務的調用,以消除服務應用端與服務實作之間的耦合,參考如下圖所示。

service-facade.PNG

如圖所示,Presentation 可以直接透過 ApplicationServices 的服務界面來調用應用服務,Presentation 與 ApplicationServices 之間分享相同的語意模型 BizModel。因此 Presentation 在調用應用服務的過程中,可以傳遞 BizModel 中所設計的領域物件來當成調用應用服務的參數,同時也可以取得應用服務執行完畢後所回傳的 BizModel 領域物件。

然而,OtherApplication 卻可能沒有 BizModel 的觀念可以直接調用 ApplicationServices 的應用服務。實務上也很可能因為採用不同的技術領域,而使得無法採用相同的 BizModel 來調用應用服務。因此,我們必須提供不同的服務界面讓 OtherApplication 來調用服務,並且設計 TxnMessage 來傳送或取得調用應用服務所需的資訊或服務執行結果。

如此,OtherApplication 便可透過 ServceFaçade 來取用應用服務,只要依據實際功能需求來用 ServiceFaçadeImpl 實現 ServiceFaçade,讓它可以產生適合的 BizModel 領域物件,便可透過 ApplicationServices 來調用實際的應用服務。

其實如果不用 ServiceFaçade 的話,為 OtherApplication 定義新的應用服務界面也是可以解決 OtherApplication 無法存取 BizModel 的問題。但如此的設計將會使得應用服務元件產生巢狀交易的複雜情況。

因為要讓現有的應用服務可以重覆使用,以增加軟體開發的效率,勢必會讓新的服務去呼叫到原有的應用服務元件。但通常應用服務會牽涉到交易的實現,應用服務呼叫應用服務會讓異常的處理變得相當複雜。

運用 ServiceFaçade 可以避免這樣的問題,使 ServiceFaçade 與 ApplicationServices 之間權責分明,同時還可以讓不同應用服務的調用由同一個 ServiceFaçade 來協調,簡化系統耦合的複雜度、以及利於應用服務調用的控管。

所以,當發現系統相互關聯變得複雜度時,ServiceFaçade 是個簡單又具有彈性的設計概念,是可以讓軟體架構穩固又可以適應變化的秘密武器呀。



     

Leave a Reply

You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="">