徐遇霄
(武漢市長虹橋37-1號 武漢 430064)
霍金曾說:復(fù)雜性是21世紀(jì)的科學(xué)。當(dāng)代對復(fù)雜系統(tǒng)的研究也表明,復(fù)雜性是由簡單性進(jìn)化而來的。那么,我們?nèi)绾螌?fù)雜的難事變?yōu)楹唵蔚囊资?對一般的復(fù)雜問題,將其分割為簡單的橫向子問題,就可以達(dá)到效果。對于更加復(fù)雜的問題,則需要在橫向子問題分割的基礎(chǔ)上,實行縱向分層??v向分層也是一種抽象的分解復(fù)雜問題的方法?,F(xiàn)在,一個軟件系統(tǒng),往往是一巨型復(fù)雜系統(tǒng)。對于這種復(fù)雜系統(tǒng)的分析與實現(xiàn),分層理論認(rèn)為,降低其復(fù)雜性與提高效率的最好辦法是將系統(tǒng)分層實現(xiàn)。從軟件研究和開發(fā)的發(fā)展歷史、現(xiàn)行軟件的體系結(jié)構(gòu)來看,分層方法一直都是軟件研發(fā)普遍適用的基本的思想方法。因此,在軟件體系結(jié)構(gòu)中,把層次性系統(tǒng)作為架構(gòu)風(fēng)格,應(yīng)用的相當(dāng)廣泛。
SOA的主要特點之一是平臺中立,平臺中立的Java Web服務(wù)技術(shù)是構(gòu)建SOA系統(tǒng)一種很自然的選擇。在Java世界中,J2EE多層架構(gòu)是一個典型的分層體系,同樣,基于Java的SOA系統(tǒng)也可采用分層模型。SOA有3個角色,其中服務(wù)請求者是服務(wù)的最終消費(fèi)者,它對服務(wù)進(jìn)行應(yīng)用,則位于SOA的頂層-應(yīng)用層。服務(wù)注冊中心負(fù)責(zé)服務(wù)的注冊,以便請求者能發(fā)現(xiàn)服務(wù),在一定程度上履行了服務(wù)接口的功能。服務(wù)提供者構(gòu)建實現(xiàn)服務(wù)的業(yè)務(wù)邏輯,部署服務(wù)并提供調(diào)用服務(wù)的環(huán)境。業(yè)務(wù)邏輯都由業(yè)務(wù)組件構(gòu)成,業(yè)務(wù)邏輯層應(yīng)該是獨(dú)立的一層。業(yè)務(wù)組件需要部署為服務(wù),并要提供服務(wù)的描述以及調(diào)用服務(wù)的環(huán)境,請求者才能消費(fèi)服務(wù),因此,在應(yīng)用層與業(yè)務(wù)層之間,可定義服務(wù)接口層,以實現(xiàn)業(yè)務(wù)層到應(yīng)用層的平滑過渡。業(yè)務(wù)層一般要訪問數(shù)據(jù)庫,但不是直接訪問,可通過一個中間層來進(jìn)行。中間層的作用是屏蔽訪問不同數(shù)據(jù)庫的差異,使數(shù)據(jù)庫對業(yè)務(wù)層是透明的。因此,數(shù)據(jù)庫位于系統(tǒng)的最底層,而業(yè)務(wù)層與數(shù)據(jù)庫之間的中間層可定義為數(shù)據(jù)接口層。至此,基于SOA的應(yīng)用系統(tǒng)從上到下可劃分為如下5層:應(yīng)用層、服務(wù)接口層、業(yè)務(wù)層、數(shù)據(jù)接口層和數(shù)據(jù)庫層,如圖1所示。
圖1 基于Java的SOA分層架構(gòu)
服務(wù)接口層為應(yīng)用層調(diào)用服務(wù)提供標(biāo)準(zhǔn)化的接口,從而使得該服務(wù)可提供給任何異構(gòu)平臺和任何本地或者遠(yuǎn)程用戶使用。
業(yè)務(wù)層主要提供系統(tǒng)的業(yè)務(wù)邏輯和控制,由一些基本的組件構(gòu)成。
數(shù)據(jù)接口層為業(yè)務(wù)層提供統(tǒng)一的訪問數(shù)據(jù)庫的方式,以屏蔽業(yè)務(wù)層訪問不同數(shù)據(jù)庫的差異。
數(shù)據(jù)庫層完成數(shù)據(jù)的持久化功能。它提供了數(shù)據(jù)信息和數(shù)據(jù)邏輯,所有與數(shù)據(jù)有關(guān)的安全性、完整性、數(shù)據(jù)的一致性、并發(fā)操作等都在數(shù)據(jù)庫層。
數(shù)據(jù)接口層和數(shù)據(jù)庫層統(tǒng)稱為數(shù)據(jù)層。
1)數(shù)據(jù)實體類的設(shè)計
在數(shù)據(jù)接口層的上一層業(yè)務(wù)層中,對數(shù)據(jù)的操作體現(xiàn)在業(yè)務(wù)管理類和業(yè)務(wù)處理類與業(yè)務(wù)數(shù)據(jù)類的交互。業(yè)務(wù)數(shù)據(jù)類是數(shù)據(jù)實體類的一部分。為了使業(yè)務(wù)層以一致的方式處理數(shù)據(jù),首先,數(shù)據(jù)實體類應(yīng)該采用一致的數(shù)據(jù)表示方式。在業(yè)務(wù)層中,所有的數(shù)據(jù)都由數(shù)據(jù)實體類來統(tǒng)一表示,這些類是基本的JavaBean,被稱為POJO或ValueObject,只有屬性和Get/Set方法,其作用就是供業(yè)務(wù)類使用,是業(yè)務(wù)類操作的對象。為了增強(qiáng)程序的可讀性并方便記憶,可將類的名稱定義為與表名相同,將類中的屬性名與表的字段名定義相同。這些數(shù)據(jù)類與數(shù)據(jù)庫進(jìn)行映射,一般將數(shù)據(jù)實體類的屬性映射為數(shù)據(jù)庫中對應(yīng)表的字段,非原子屬性則映射為表,這種映射關(guān)系通常由一個XML映射配置文件來完成。由于基于XML文本的配置文件可以靈活的改變,因此提高了系統(tǒng)的可移植性及易維護(hù)性,同時也在數(shù)據(jù)層體現(xiàn)了系統(tǒng)的松耦合性。
2)持久化技術(shù)的選擇
目前,在基于Java的程序設(shè)計中,常用的主要有以下幾種持久化技術(shù):
(1)BMP(Bean-Managed Persistence),即Bean本身管理持久化。這種方式由在Java組件中嵌入JDBC代碼來實現(xiàn),顯然,這是一種緊耦合的方式。
(2)CMP(Container-Managed Persistence),即容器管理持久化,表示由EJB容器來管理實體EJB的持久化。EJB容器封裝了對象/關(guān)系的映射及數(shù)據(jù)訪問細(xì)節(jié)。這是一種框架化的持久性機(jī)制,在這類機(jī)制中,由框架調(diào)用業(yè)務(wù)處理的類。這種機(jī)制的一個特點就是它提供一個管理環(huán)境,在這個環(huán)境中進(jìn)行對象持久化。一旦離開這個環(huán)境,代碼就不能運(yùn)行了。并且,理解并使用EJB的規(guī)范也不是很輕松的事情。
(3)JDO(Java Data Objects),Sun公司制定的描述對象持久化語義的標(biāo)準(zhǔn)API。嚴(yán)格的說,JDO并不是對象/關(guān)系映射接口,因為它支持把對象持久化到任意一種存儲系統(tǒng)中,包括關(guān)系數(shù)據(jù)庫、面向?qū)ο蟮臄?shù)據(jù)庫、基于XML的數(shù)據(jù)庫,以及其他專有存儲系統(tǒng)。由于關(guān)系數(shù)據(jù)庫是目前最流行的存儲系統(tǒng),許多JDO的實現(xiàn)都包含了對象/關(guān)系映射服務(wù)。JDO的出現(xiàn)似乎有了一些改觀,但是,JDO沒有一個好的開源免費(fèi)實現(xiàn)。好的產(chǎn)品一般都是商業(yè)產(chǎn)品,并且在國內(nèi)沒有銷售和技術(shù)支持。JDO也不是一個輕量級封裝,它建立的持久層框架很不完善,造成了JDO感覺比較笨重,使得很多操作方式很是煩瑣,JDO的應(yīng)用在人們心理上一直布滿陰影。
(4)Hibernate,輕量級的開源ORM模型。它的一大優(yōu)勢就在于可以把被持久化的對象實現(xiàn)成脫離這個持久化環(huán)境依然可以運(yùn)行的類。Hibenate利用XML文件將應(yīng)用程序的數(shù)據(jù)實體類與數(shù)據(jù)庫中的表進(jìn)行映射,并通過框架的內(nèi)部機(jī)制對復(fù)雜的數(shù)據(jù)操作提供支持,包括記錄的添加、修改和刪除等操作。因此,在基于Java的程序設(shè)計中,Hibernate成為持久層流行的框架技術(shù),而它對于構(gòu)建基于SOA的應(yīng)用系統(tǒng),也無疑是一個很優(yōu)的選擇。下面簡要介紹Hibernate的原理。
Hibernate是一種比較徹底的Java對象關(guān)系映射工具,支持使用各種Java思想,如Inheritance(繼承),Association(關(guān)聯(lián)),Composition(組合),Collections(集合)等來實現(xiàn)對象關(guān)系映射。它可以直接映射大部分的POJO型的JavaBean,而不需要對它們作任何修改,即使需要修改,最多只在Bean里面加上一些私有訪問方法。它還可以將一個用戶定義的多個類的實例映射到一張表的同一行,甚至可以利用代理模式來簡化載入類的過程。這些功能都大大減少了利用HQL從數(shù)據(jù)庫提取數(shù)據(jù)的代碼編寫量,從而節(jié)約開發(fā)時間和開發(fā)成本。Hibernate利用Reflection機(jī)制,在系統(tǒng)啟動時生成SQL語句,進(jìn)行對象的持久管理。Hibernate對每一種數(shù)據(jù)庫都有對應(yīng)的Dialect進(jìn)行操作優(yōu)化,從而提高它在各種情況下的效率。
圖2所示 Hibernate的持久化服務(wù)在一個數(shù)據(jù)庫應(yīng)用中的作用:應(yīng)用程序通過
圖2 Hibernate持久化原理
Hibernate 連接到數(shù)據(jù)庫,對數(shù)據(jù)進(jìn)行操作。Hibernate自身通過Properties或類的映射文件(Mapping XML)將數(shù)據(jù)實體類映射到數(shù)據(jù)庫的行。因此Application可以通過持久化的數(shù)據(jù)類直接訪問數(shù)據(jù)庫,而不必使用JDBC和SQL進(jìn)行數(shù)據(jù)的操作。
Hibernate具有很大的靈活性,界于它的最大模式和最小模式之間的某些功能構(gòu)件是可選的。在最小模式下,可選擇使用JDBC,可以利用JTA管理自己的事務(wù),也可以使用JNDI。這時Hibernate通過 SessionFactory提供 Session,在 Session中對持久化對象進(jìn)行操作。在最大模式下,Hibernate在自己的底層管理 JNDI、JDBC和 JTA,在上層向外提供 SessionFactory、Session和 Transaction的接口,供 Client控制Persistent Object之用。
3)數(shù)據(jù)庫訪問的設(shè)計
(1)數(shù)據(jù)實體類與表的映射
Hibernate定義了類到數(shù)據(jù)庫的基于XML的映射文件。映射文件中的“class”元素定義了需持久化的類與數(shù)據(jù)庫中表的映射關(guān)系,“name”屬性指定了類名,而“table”屬性指定了數(shù)據(jù)庫中的表。“id”元素定義了鍵屬性?!皃roperty”元素定義了類的屬性與表中字段的映射。具體的映射文件可見后文的實現(xiàn)部分。
(2)配置 Hibernate
配置Hibernate通過設(shè)置其配置文件來完成。該文件描述了數(shù)據(jù)庫的驅(qū)動程序以及數(shù)據(jù)庫的URL等連接數(shù)據(jù)庫的信息。Hibernate在應(yīng)用程序啟動時自動進(jìn)行初始化工作。配置描述文件可以是hibernate.cfg.xml或 Hibernate.properties文件。
Hibernate對JDBC進(jìn)行了封裝,自動進(jìn)行JDBC連接,并使用SessionFactory來打開數(shù)據(jù)庫的連接。使用Hibernate時,我們可以提供外部連接池,亦可配置Hibernate使用它自己直接支持的池(C3PO,Proxcool)。Hibernate可以根據(jù)用戶的數(shù)據(jù)庫設(shè)置一個正確的hibernate.dialect語言。它支持 Oracle、Ms SQL、My SQL 、DB2等多種語言 。Hibernate提供的HQL也支持外部連接查詢,這些連接類型是從SQL中借鑒來的:inner join(內(nèi)連接)、left outer join(左外連接)、right outer join(右外連接)、full join(全連接,并不常用)。但外連接也可通過設(shè)置Outer-join屬性為False來禁止,因為使用它會占用過多的資源。
Hibernate可靈活地設(shè)置數(shù)據(jù)庫的驅(qū)動程序及數(shù)據(jù)庫的URL。這樣,在進(jìn)行系統(tǒng)設(shè)計時,我們可以不去關(guān)心底層采用的是何種數(shù)據(jù)庫。加之我們引入ORM技術(shù),使得業(yè)務(wù)邏輯和數(shù)據(jù)邏輯分離。在此二者基礎(chǔ)上,我們就構(gòu)建了出一個抽象層—數(shù)據(jù)接口層。數(shù)據(jù)接口層的引入一方面增強(qiáng)了系統(tǒng)的靈活性和可移植性,另一方面也體現(xiàn)了SOA的松散耦合性。
(3)使用Hibernate進(jìn)行數(shù)據(jù)庫訪問
Hibernate運(yùn)用框架模型如圖3所示。
圖3 Hibernate應(yīng)用框架模型
其中:*.hbm.xml是數(shù)據(jù)實體類與表的映射文件,*_Access.class是數(shù)據(jù)訪問類文件,*.class是POJO型的數(shù)據(jù)實體類文件。
1)業(yè)務(wù)邏輯的實現(xiàn)策略
我們可以將業(yè)務(wù)層類分為三大類:業(yè)務(wù)管理類、業(yè)務(wù)處理類和業(yè)務(wù)輔助類,如圖4所示。在數(shù)據(jù)接口層提供的數(shù)據(jù)實體對象和對象的持久性存儲機(jī)制的基礎(chǔ)之上,就可以將這些對象根據(jù)業(yè)務(wù)需求由業(yè)務(wù)層的類組合起來,構(gòu)建系統(tǒng)的業(yè)務(wù)邏輯處理程序。
圖4 業(yè)務(wù)層類框架圖
2)服務(wù)粒度的選擇
我們可以用服務(wù)樹來刻畫服務(wù)的粒度。所謂服務(wù)樹,是把要部署為服務(wù)的功能模塊用樹型結(jié)構(gòu)來進(jìn)行表示,如圖5網(wǎng)上定購服務(wù)樹所示。
圖5 服務(wù)樹圖
服務(wù)樹清晰地反映出了服務(wù)的粒度,是構(gòu)建SOA系統(tǒng)時決定服務(wù)粒度的有力工具。我們可以利用服務(wù)樹找到SOA系統(tǒng)最佳的服務(wù)粒度方式。
服務(wù)接口層通過部署,將業(yè)務(wù)層的業(yè)務(wù)管理類暴露為服務(wù),因此,業(yè)務(wù)管理類所實現(xiàn)的業(yè)務(wù)邏輯的粒度就決定了系統(tǒng)服務(wù)的粒度。SOA傾向于粗粒度的服務(wù),在進(jìn)行系統(tǒng)之間的通信時,這有很大的優(yōu)勢,因為粗粒度的服務(wù)減少了系統(tǒng)之間的交互,提高了系統(tǒng)的運(yùn)行效率,特別是異構(gòu)異地的系統(tǒng)之間的通信。但在進(jìn)行企業(yè)內(nèi)部應(yīng)用系統(tǒng)之間集成,或系統(tǒng)內(nèi)部的構(gòu)建時,粗粒度的服務(wù)降低了系統(tǒng)的靈活性,增大了系統(tǒng)的耦合性。所以,我們在構(gòu)建SOA系統(tǒng)時,要選擇一個合適的服務(wù)粒度。
1)Web服務(wù)引擎AXIS
Apache可擴(kuò)展交互系統(tǒng)(Apache eXtensible Interaction System,AXIS)是在基于可配置的消息鏈和Handler對象重新設(shè)計SOAP的過程中發(fā)展而來的。它是基于 Java的、最新的SOAP規(guī)范(SOAP 1.2)和SOAP with Attachments規(guī)范的開源實現(xiàn)。圖6表示了AXIS引擎的基礎(chǔ)結(jié)構(gòu)。
圖6 AXIS基礎(chǔ)結(jié)構(gòu)
AXIS可作為Web服務(wù)引擎工作于服務(wù)接口層,也可作為服務(wù)請求方環(huán)境運(yùn)行于應(yīng)用層,因此,它是構(gòu)建基于Java的Web服務(wù)的良好選擇。
2)使用AXIS部署服務(wù)
使用AXIS將業(yè)務(wù)層的組件部署為Web服務(wù)有以下3種方式:
(1)最簡單的方式:jws方式
AXIS提供了一種將帶有.jws擴(kuò)展的Java類部署為Web服務(wù)的簡單方式。它的實質(zhì)是AXIS將Servlet引擎中的Java Servlet自動部署為Web服務(wù)。常用的Servlet引擎是Apache的 Tomcat容器。這種方式以Java類的源文件為基礎(chǔ),部署方法很簡單,只須將以.java為擴(kuò)展名的源文件,重命名為以.jws為擴(kuò)展名的文件,復(fù)制到Axis Web應(yīng)用程序的主目錄中。當(dāng)該Web服務(wù)被訪問時,Axis會根據(jù).jws文件自動生成相應(yīng)的 WSDL及SOAP端點,即自動將.jw s文件部署為Web服務(wù),而無需WSDD部署描述符。這種方式也無需編譯該文件,Axis運(yùn)行庫會自動進(jìn)行類及其所有方法的編譯。
獲取該服務(wù)的WSDL與其它方式相同,只需在訪問該服務(wù)的URL后加“?WSDL”參數(shù)即可,如“http://localhost:8080/axis/HelloWorld.jws?WSDL”。
以.jws文件形式創(chuàng)建Web服務(wù)的方法,從簡易性及可操作性的角度來看,非常類似于JSP。這種方式一般用于建立單一的或簡易的Web服務(wù)。
(2)使用WSDD將JSE組件部署為Web服務(wù)
以.jws文件部署基于Java的Web服務(wù)雖然既簡單有快捷,但缺乏服務(wù)部署的靈活性,例如,我們需要將JSE組件中的某些方法而非全部發(fā)布為Web服務(wù)。Axis提供了 Web服務(wù)部署描述符(Web Service Deployment Description,WSDD)的方法,可以對Java Web服務(wù)進(jìn)行一些高級的定制部署。該方法需要創(chuàng)建一個部署服務(wù)(deployment)的XM L描述文件(*.wsdd)和一個卸載服務(wù)(undeployment)的XML描述文件。這些文件將告訴AXIS如何處理對Java Web服務(wù)的特定調(diào)用。
(3)使用WSDD將EJB部署為Web服務(wù)
在開源的EJB服務(wù)器(或容器)中,我們選擇JBoss公司的JBoss服務(wù)器。JBoss集成Axis時,需將Axis文件夾復(fù)制到JBoss的部署目錄中。另外,我們還要確保Axis能夠為EJB載入類文件,方法是將該EJB的.jar包文件復(fù)制一份到Axixlib文件夾中。一般情況下,我們使用Axis將JBoss中的無狀態(tài)會話(Stateless SessionBean)類型的EJB發(fā)布為Web服務(wù),目前可采用如下兩種常用的方法:
①使用基于EJB的WSDD,這種方式同上述第2種情形大致相似,只是WSDD中有更多的元素來描述EJB,因為EJB相對于JSE,有更多的要遵循的規(guī)范。
②使用JBoss的 JBoss.NET模塊,用 XML Web服務(wù)描述符來部署。JBoss.NET[29]是JBoss集成了Axis后的部署Web服務(wù)的一個工具。利用它進(jìn)行部署工作要依賴于.wsr文件,該文件可視為打包版的Axis的WSDD。.wsr文件是一個標(biāo)準(zhǔn)的.jar文件,僅包含一個名為META-INTweb_service.xml的XML Web服務(wù)描述符。
JBoss公司目前正在進(jìn)行一個被稱為“JBoss-WS”的項目,其目標(biāo)是重構(gòu)JBoss應(yīng)用服務(wù)器,以使用他自己的SOAP協(xié)議棧而不是集成Axis。
應(yīng)用層客戶端在構(gòu)建用戶的業(yè)務(wù)流程時,一般要先完成調(diào)用服務(wù)以及基于XML的數(shù)據(jù)處理兩項任務(wù)??蛻舳苏{(diào)用服務(wù)大多數(shù)情況下是為了進(jìn)行數(shù)據(jù)通信。對于服務(wù)的請求方和提供方,二者都基于XML的數(shù)據(jù)格式進(jìn)行通信,因而在調(diào)用服務(wù)進(jìn)行數(shù)據(jù)通信時,需要將用戶關(guān)心的數(shù)據(jù)進(jìn)行串行化或反串行化(AXIS引擎只自動實現(xiàn)SOAP消息的串行化或反串行化)。所謂串行化數(shù)據(jù)是指將應(yīng)用程序的數(shù)據(jù)格式轉(zhuǎn)換為XML格式,反串行化則反之。根據(jù)數(shù)據(jù)的流向,可分為兩種情形,一是通過調(diào)用服務(wù)向服務(wù)提供方發(fā)送數(shù)據(jù)(如圖7所示),如向網(wǎng)上商店提交的訂單,需要進(jìn)行數(shù)據(jù)串行化。
圖7 串行化流程
二是調(diào)用服務(wù)從服務(wù)提供方獲取數(shù)據(jù)(如圖8所示),如獲取商家的產(chǎn)品信息,這與第一種情形正好相反,需要進(jìn)行數(shù)據(jù)的反串行化。
圖8 反串行化流程
對于第一種情形,客戶端應(yīng)用程序先將數(shù)據(jù)串行化為XML格式,然后用SOAP協(xié)議進(jìn)行封裝,調(diào)用服務(wù)發(fā)送即可。對于另一種情形,客戶端一般先接收調(diào)用服務(wù)所獲取的基于XML格式的字符串,然后將其反串行化為用戶所需類型的數(shù)據(jù)。
圖9 應(yīng)用層數(shù)據(jù)處理架構(gòu)
客戶端在調(diào)用服務(wù)發(fā)送數(shù)據(jù),進(jìn)行數(shù)據(jù)的串行化之前,需要采集原始數(shù)據(jù)。而在調(diào)用服務(wù)獲取數(shù)據(jù)并進(jìn)行反串行化之后,需要顯示數(shù)據(jù)或進(jìn)行持久化。因此,應(yīng)用層除了要進(jìn)行數(shù)據(jù)串行化或反串行化外,還需要實現(xiàn)數(shù)據(jù)的顯示或提交邏輯。對于客戶端,這一處理邏輯可以基于C/S方式,為用戶提供靈活友好的使用界面,進(jìn)行顯式處理,或直接用程序組件隱式處理??蛻舳艘嗫苫贐/S方式,建立精美的Web頁面顯示或提交數(shù)據(jù)。應(yīng)用層數(shù)據(jù)處理的架構(gòu)如圖9所示。
本文所論述的應(yīng)用層側(cè)重于服務(wù)調(diào)用的設(shè)計,而沒有過多涉及應(yīng)用系統(tǒng)客戶端的具體實現(xiàn)。因為實際上,客戶端程序都將調(diào)用服務(wù)作為函數(shù)(或過程)來實現(xiàn)。系統(tǒng)開發(fā)人員在構(gòu)建客戶端應(yīng)用程序時,可以采用B/S或C/S方式,并在其中調(diào)用訪問Web服務(wù)的函數(shù),來構(gòu)建最終的應(yīng)用系統(tǒng)。而不論是B/S還是C/S,都已經(jīng)是很成熟的模型,這兩種模型也都有非常成熟的技術(shù)可以實現(xiàn)。
作為一個剛剛步入實踐的新事物,SOA還面臨著很多的挑戰(zhàn)。SOA還正處在不斷的發(fā)展之中,它的成熟度和完善性還有待于研究人員和企業(yè)在理論和實踐中不斷的加以提高和改善。雖然被稱為是繼面向過程和面向組件的下一代軟件體系結(jié)構(gòu),但目前還沒有以上兩種架構(gòu)成熟,且目前的應(yīng)用才剛剛起步。然而,由于SOA自身具有的優(yōu)勢順應(yīng)了未來軟件發(fā)展的趨勢,并隨著各大軟件供應(yīng)商在此展開的深入研究和激烈競爭,它必然會成為成熟的下一代軟件體系架構(gòu)和主流開發(fā)技術(shù)而得到廣泛支持和應(yīng)用??梢灶A(yù)見在未來的幾年里,SOA將會取得長足的發(fā)展。
[1]胡光.基于Jini的查找服務(wù)實現(xiàn)[J].計算機(jī)應(yīng)用研究,2005(2)http://www.bea.com/framework.jsp?CNT=index.htm&FP=/content/solutions/technical/web_services
[2][美]科耶爾.XM L、Web服務(wù)和數(shù)據(jù)革命[M].袁勤勇,等譯.清華大學(xué)出版社,2003
[3]蔡月茹,柳西玲.Web Service基礎(chǔ)教程[M].北京:清華大學(xué)出版社,2005,6
[4]張凱.軟件復(fù)雜性與質(zhì)量控制[M].北京:中國財政經(jīng)濟(jì)出版社,2005,11
[5]姜璐.復(fù)雜系統(tǒng)的層次結(jié)構(gòu),復(fù)雜性研究[M].北京:科學(xué)出版社,1993,7
[6]伽瑪,等.設(shè)計模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)[M].李英軍,等譯.北京:機(jī)械工業(yè)出版社,2000,9
[7][美]尼戈潘,等.Java Web服務(wù)開發(fā)[M].龐太剛,陶程,譯.2004,5