我的觀點是,SOA對不同的需求需要不同對待。在本文中,我只關心J2EE架構方面的SOA,而我認為這意味著功能重用。其他從J2EE觀點來看SOA的優點還有:
1、松耦合的組件,這是軟件設計中重要的部分
2、引入ESB作為消息層意味著強制“面向接口編程,而不是實現”
3、異步消息增加了應用的伸縮性
讓我們通過問三個特定的問題來看一下軟件重用中更細節的問題:
1、為什么重用軟件是重要的?
2、SOA是如何提出解決軟件重用問題的?
3、是否SOA的允諾能夠使軟件重用應用到現實中?
首先,軟件重用是重要的原因如下:
1、時間和花費上的效率—能夠重用已經的組件來滿足陳述的業務需求將節省大量的時間和金錢。
2、重要的特性包括但不限于如穩定性/性能/可管理性/文檔/可配置性。因為一個組件被重用的次數越多,對這個組件的投資也越多,他的優勢也越多。
3、 良好設計的可重用框架無論在哪里被使用都擁有正面的效果,而且你愿意的話可以封裝更好的想法來解決通用問題。
因此我們需要重用性。那么最簡單的方法是什么呢?就是打包軟件作為一組良好定義的組件來滿足離散的功能需求。然后,如果其他應用需要相同的組件,他就可以重用了。還有些細節需要考慮,如如何配置,但這些細節已經偏離了主題:重用任何語言編寫的代碼,那些代碼必須被設計成一組離散的組件或重構為集合。
其次,SOA是如何解決軟件重用的問題呢?是通過基于組件模型來構建和引入一個重要的強制約定:組件間的通訊要通過下發到ESB的消息來進行,而這就確保了松耦合。實際上,最廣泛布署的SOA實現—Web services可以通過使消息層技術中性來縫合用不同語言開發的組件。
最后,SOA對軟件重用的允諾真有實際意義嗎?不,我想念如果SOA在1945(大概是和ENIAC同時代吧)被發明的話確實可以解決軟件重用的問題。但沒有,現存的大量代碼是用不同的開發語言編寫的,有COBOL/C/C++/C#和其他語言。這些代碼沒有作為離散的組件來編寫,因此也沒有SOA來解決。事實上,我認為有大量的SOA項目的工作是花費在重構相同的代碼庫。
現在,讓我們來看一下對于J2EE應用SOA可以解決的一些問題。
SOA缺點
SOA缺點包括下面三方面:
1、 SOA自身的缺點,主要當前還沒有成熟的實現
2、 SOA的復雜性
3、 廠商對SOA在更廣泛的J2EE產品和方案中的位置
那么我們就心批判的眼光來看一下:
·并沒有像J2EE規范那樣有自己的正式規范。雖然有一個發布的規范,但那個太復雜了并且沒有遵循80:20法則(80%的應用需要簡單的SOA,只有20%的應用需要更強大而復雜的功能)
·有狀態會話依然存在廣泛爭議而且現在還沒有被SOA的缺省實現(Web services)所解決。而無狀態會話已經是完全支持了。
·由于缺省正式或推薦的規范,Web services已經成為許多人眼里SOA的代名詞了,但Web services通常是過于強大了。
·SOA增加了復雜性?赡苣愀矚g硬編碼和緊耦合,而不需要XML配置文件來運行簡單的應用。
·SOA兼容的應用對本身來說沒有什么意義。其商業價值來自于能夠提供離散的功能塊,通過SOA被用于其他的應用和模塊。例如,如果你對訂單的較驗規則是通過JSP頁面中的Java代碼來實現的,那么你還需要重構代碼將其放到服務端對象中以便于SOA調用,—但很多廠商并沒有提及這一點。
·在某些情況下,廠商將SOA作為網頁應用框架的替代者!我認為,WAF是SOA定義功能中的消費者,只是作為一種補充,而不存在竟爭關系。
· 與廠商提供的相反,一些應用根本不需要SOA而只需要簡單使用MVC框架就可以了。這很短視嗎?我不這么認為,即使SOA的特性是需要的,在上面的情況下,最重要的部分是用來服務于企業服務總線的良好定義的業務邏輯層,而不是ESB自身。
雖然我不認為SOA是一顆解決現有和新建應用中問題的銀彈,但我相信SOA在他相應的位置上還是有其內在的價值的,F在讓我們來看一下在應用中增加有效的SOA解決方案是如何提供體現其商業價值的。
建議的SOA分類
現在,你應該對我保持事物的簡單性的熱忱表示感激吧。但我本質上并不是簡單論者,我是一個實用主義者。對軟件項目來說,我認為實用主義是一方面要平衡項目的商業和實際價值,另一方面是使用軟件設計上的最佳實踐。簡單的說,就是在我們現有條件下構建我們所能創建的最好的系統。
一個實用主義的好例子來自于民間的工程歷史。在修鐵路時常修木橋,而我們知道用鐵橋會更好。當鐵路公司的股東想使鐵路盡快開工而且初始投資要有限制時,他就是這是最好的工程方案了。是否聽起來耳熟?同樣的原則可以應用于軟件工程。
根據實用主義的精神,我建議將SOA分為三個級別:簡單/中等/復雜,衡量標準是需要滿足的業務需求。如果你需要簡單的SOA,那么不要浪費時間和金錢在復雜的SOA上。
文章來源于領測軟件測試網 http://www.kjueaiud.com/