最近,
SOA
成為跨技術平臺(特別是
J2EE
和
.Net
)軟件開發中的熱門話題。然而,如果我們比較一下圍繞著
SOA
的宣傳和
90
年代后期
EJB
和服務件的宣傳,你會發現這沒有什么區別。
1998
年,
EJB
帶領互聯網的潮流并推翻了以
CORBA
為統治和由
PB/Oracle Forms
和其他主導的
CS
架構標準。
SOA
,作為一種新技術的術語,還不具有那么大的破壞性。
SOA
只是一種想法
/
概念和一組構建應用功能的最佳實踐。相反地,
J2EE
是一套完整地開發技術,可以用來設計所有的東西。
我對
SOA
的主要關注在于企業級
Java
應用通用的問題:復雜性。次要關注的是
SOA
通常作為一種解決方案被用來跨越
J2EE
應用各層,雖然這好像沒有什么意義。本文提取出
SOA
的基本元素并介紹他們。一旦我們理解這些,就可以理解
SOA
系統中的更復雜的組件了。最后,我們可以了解一下
SOA
給
J2EE
應用帶來的實際價值,同時并不增加無用的復雜性。
本文分為個部分:首先,提出了我對
SOA
作為一種標準參考點的定義。其次,檢查那些主要的軟件工程問題通過
SOA
可以解決而不是用
SOA
來檢查。再次,會給出基于復雜需求的
SOA
的建議分類。最后,給出三種主要
SOA
分類的建議實現。
SOA
是什么?
SOA
有很多定義。下面是我的定義:
SOA
是宏級別的應用到應用架構級的設計模式:
1
、可選地暴露應用的功能作為一組離散的組件。
2
、使這些組件能被用來構建更復雜的組件和應用。
3
、僅包含基于消息的組件內部通訊。
我還遺漏了什么呢?還有一些方面,包括:
1
、安全性
2
、事務
3
、狀態或無狀態會話
4
、消息數據
5
、消息特性
6
、消息協議
7
、消息內容
8
、具體技術實現
這些方面也是重要的,但不是主要的。我的定義提取了
SOA
的核心規則,但沒有拋棄概念本身。
注意我在定義中引用了設計模式。我認為這是關鍵。
SOA
不是什么新技術,事實上,其最吸引人的一個地方是可以利用現有的技術并使其泛出新的光芒。對我來說,
SOA
更像是一幅藍圖,一組最佳實踐,或者說是一個定義下一代的軟件應用應該如何設計和實現的規范。
基礎
SOA
方法
從上面的定義,我們應該可以標識出組成
SOA
應用的必須提供的軟件服務的最小集合。簡潔地說,這些服務是:
1
、消息層,允許消息通過特定的協議傳輸和接收。用
SOA
的說法,這一層稱為企業服務母線或簡寫為
ESB
。
2
、一個組件模型,如應用必須遵循的發送和接收來消息母線的消息的最小約定。
取決于你自己的業務需求,這兩種服務可以極度的擴大,但在核心來說,消息層和通用組件模型就代表了
SOA
。
注意,我沒有在
SOA
的定義中包含自動定位和發現服務(在大部分
J2EE
場景中,這是很有殺傷力的)。在
UDDI
(通用描述
/
發現
/
集成協議)后的原始想法是認為企業最終會使用軟件服務(通過一個大的基于元數據搜索服務倉庫)來購買和銷售。這個美夢至少也得十年后,也許永遠不會實現,因為人們是需要做的實際的業務而不是軟件。
J2EE
應用不需要自動發現服務,例如登錄或支付服務,這些服務應該在初始化時設置。不要誤導我,如果這些服務的實現不應該硬編碼到應用中,那么你也不需要
SOA
來解決這些問題了。
為什么要
SOA
?
最近的兩撥企業級軟件開發的主浪潮是
C/S
架構和多層架構。雖然多層架構提供了
C/S
架構中布署
/
平臺支持
/
性能
/
伸縮性上更好的效果,但兩者都沒有解決一個關鍵的企業級計算機領域的軟件工程問題:如何重用軟件功能。作為軟件開發人員和架構師,我們始終沒有完全解決軟件重用的問題。再往下看,你會看到我也不認為
SOA
能解決這個問題。然而,我認為軟件重用是
SOA
出現的最重要原因(至少在
J2EE
應用中是這樣)。
其他
SOA
使用現有的
Jini
和風格計算。基于
Jini
環境的特點如下:
1
、自動發現組件
/
服務
2
、自愈的
然而,這些特性并沒有與
J2EE
應用等同的重要性。使用
JDBC
配置數據庫的位置只需要一次。我期望數據庫來提供容錯和除錯功能,而且我不需要
J2EE
應用來嘗試當產品實例當機時自動發現其他的數據庫實例。另一方面,對一個有
2000
個工作站的辦公室來說自動發現一個彩色打印機是一件好事,這也是符合
Jini
硬件的一個關鍵好處。
平等地說,在一個真實的全球網格計算環境中,自動發現和枚舉計算資源來解決問題是基礎框架的關鍵部分,但這不是一個
J2EE
環境,那兒硬件預先計算的以便在定義用戶數據和服務性能之間平衡。
我的觀點是,
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
增加了復雜性。可能你更喜歡硬編碼和緊耦合,而不需要
XML
配置文件來運行簡單的應用。
·SOA
兼容的應用對本身來說沒有什么意義。其商業價值來自于能夠提供離散的功能塊
,
通過
SOA
被用于其他的應用和模塊。例如,如果你對訂單的較驗規則是通過
JSP
頁面中的
Java
代碼來實現的,那么你還需要重構代碼將其放到服務端對象中以便于
SOA
調用
,—
但很多廠商并沒有提及這一點。
·
在某些情況下,廠商將
SOA
作為網頁應用框架的替代者!我認為,
WAF
是
SOA
定義功能中的消費者,只是作為一種補充,而不存在竟爭關系。
·
與廠商提供的相反,一些應用根本不需要
SOA
而只需要簡單使用
MVC
框架就可以了。這很短視嗎?我不這么認為,即使
SOA
的特性是需要的,在上面的情況下,最重要的部分是用來服務于企業服務總線的良好定義的業務邏輯層,而不是
ESB
自身。
雖然我不認為
SOA
是一顆解決現有和新建應用中問題的銀彈,但我相信
SOA
在他相應的位置上還是有其內在的價值的。現在讓我們來看一下在應用中增加有效的
SOA
解決方案是如何提供體現其商業價值的。
建議的
SOA
分類
現在,你應該對我保持事物的簡單性的熱忱表示感激吧。但我本質上并不是簡單論者,我是一個實用主義者。對軟件項目來說,我認為實用主義是一方面要平衡項目的商業和實際價值,另一方面是使用軟件設計上的最佳實踐。簡單的說,就是在我們現有條件下構建我們所能創建的最好的系統。
一個實用主義的好例子來自于民間的工程歷史。在修鐵路時常修木橋,而我們知道用鐵橋會更好。當鐵路公司的股東想使鐵路盡快開工而且初始投資要有限制時,他就是這是最好的工程方案了。是否聽起來耳熟?同樣的原則可以應用于軟件工程。
根據實用主義的精神,我建議將
SOA
分為三個級別:簡單
/
中等
/
復雜,衡量標準是需要滿足的業務需求。如果你需要簡單的
SOA
,那么不要浪費時間和金錢在復雜的
SOA
上。
級別
1
:簡單的
SOA
樣例實現:
1
、使用自己的
POJO
隊列來實現發送和接收消息。
2
、帶有
MDB
(消息驅動
Bean
)的
JMS
隊列
/
主題作為消息的消費者。
這里涵蓋的關鍵
SOA
概念有:
1
、企業服務總線
2
、生產者
/
消費者的組件模型。
<shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 326.25pt; HEIGHT: 233.25pt" alt="" type="#_x0000_t75"><imagedata o: src="file:///C:%5CDOCUME~1%5CWast%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image001.jpg"></imagedata></shape>
Figure 1. Schematic illustrating the core components of the simple SOA. Click on thumbnail to view full-sized image.
級別
2
:中等的
SOA
樣例實現:
1
、帶有
MDB
的
JMS
隊列
/
主題作為消息的消費者,并附加其他特性如安全性
/
事務
/JMS
元數據屬性等
2
、
Web services
,例如
Apache Axis
這里涵蓋的關鍵
SOA
概念在包含簡單
SOA
外還有:
1
、用來增加健壯性和可靠性的錯誤
/
重試隊列。
2
、引入
XML
作為消息的有效負載內容來代替序列化
Java
對象,從而支持其他技術。如
.Net
<shape id="_x0000_i1026" style="WIDTH: 326.25pt; HEIGHT: 233.25pt" alt="" type="#_x0000_t75"><img alt="" src="http://blog.csdn.net/images/blog_csdn_net/wast/157182/r_No0091-02.jpg"></shape>
Figure 2. Schematic illustrating the core components of the medium-complexity SOA. Click on thumbnail to view full-sized image.
級別
3
:復雜的
SOA
樣例實現:
1
、帶有
MDB
的
JMS
隊列
/
主題作為消息的消費者,并附加其他特性如安全性
/
事務
/JMS
元數據屬性等
2
、
Web services
3
、廠商
/
標準相關的
SOA
兼容工具包(如專門的金融服務)
這里涵蓋的關鍵
SOA
概念在包含中等
SOA
外還有:
1
、良好定義而且嚴格的組件模型(例如
Java
業務集成
/
服務組件架構及其他)
2
、增強的廠商支持,如可插拔的新生產者
/
消費者組件創建
3
、詳細枚舉特定
SOA
實現上可用服務的組件注冊表。
<shape id="_x0000_i1027" style="WIDTH: 326.25pt; HEIGHT: 233.25pt" alt="" type="#_x0000_t75"><imagedata o: src="file:///C:%5CDOCUME~1%5CWast%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image005.jpg"></imagedata></shape>
Figure 3. Schematic illustrating the core components of the complex SOA. Click on thumbnail to view full-sized image.
小結
目前
SOA
是作為一種架構體現,也將會成為與
C/S
或多層架構一樣存在。但是,他目前還是不夠成熟而且只是作為廠商利用的工具。我對
SOA
的建議是,從簡單的做起并保持
SOA
盡可能的簡單。不要將
SOA
與
Web services
等同起來,也不要強制使用
SOA
的設計模式在
J2EE
應用的各層上,告別是網頁層。
那么我會為大多數
J2EE
應用推薦哪一個
SOA
實現呢?級別
2
上的
SOA
實現如帶有
MDB
的
JMS
隊列作為消費者,而
POJO
或無狀態的會話
Bean
作為消息生產者。當然,如果你確信你需要集成非
Java
應用
,
那么考慮一下
Web services
實現。還要考慮你現在采用的解決方案在以后要有足夠的擴展空間。雖然預測多久通常都有爭議的,但我還是建議最遠不超過
36
個月。如果你預見到那個時間段內有額外的
SOA
需求,那么現在就來構建吧。
<imagedata o: src="file:///C:%5CDOCUME~1%5CWast%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image003.jpg"></imagedata>
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
