Apache Tuscany SCA Java 架構(gòu)指南
- 概況
- 內(nèi)核
- 擴展
- 運行時
- 內(nèi)部高層視圖
- Bootstrap
- 裝配模型
- 分發(fā)包
- 綁定擴展
- 構(gòu)件實現(xiàn)擴展
- 數(shù)據(jù)綁定擴展
- 復(fù)合激活
- 加載SCA組件
- 與Spring集成
- Spring作為構(gòu)件實現(xiàn)
- Spring作為IOC容器
概況
SCA JAVA 運行時是由內(nèi)核和擴展兩部分組成。內(nèi)核本質(zhì)上是一個連接多個VM的引擎,使用依賴注入(Dependency Injection)和控制反轉(zhuǎn)( Inversion of Control
)將構(gòu)件連接在一起。
內(nèi)核
其核心是設(shè)計簡單和功能有限的。它將不同的功能單元連接到一起,并且提供SPIs以讓擴展之間可以互動,例如服務(wù)發(fā)現(xiàn),可靠性,支持透明協(xié)議,等等。這些功能都以擴展的方式提供。
擴展
擴展提高了SCA運行時的功能型。擴展類型并不固定,Tuscany的核心通過提供一個可調(diào)整的模型的設(shè)計使其盡可能的靈活。現(xiàn)在,已知的擴展類型有:
- 組件實現(xiàn)類型:例如,spring、Groovy、Javascript
- 綁定類型:例如:Axis、CXF、AMQP、ActiveMQ、JXTA
- 數(shù)據(jù)綁定類型:例如,JAXB、SDO、XmlBeans
- 接口綁定類型:例如,WSDL、Java
具體細(xì)節(jié)可參考擴展開發(fā)向?qū)?/a>
JAVA SCA 運行時高層次概覽
下圖是Java SCA運行時的一個高層次概覽,其中包括以下關(guān)鍵模塊:
- SCA規(guī)格API:SCA JAVA客戶端的API和執(zhí)行規(guī)格
- API:實現(xiàn)SCA規(guī)格API的Tuscany API
- 接口綁定:支持服務(wù)定義的類型,例如WSDL、Java……
- 數(shù)據(jù)綁定:實現(xiàn)數(shù)據(jù)支持,例如SDO、JAXB……
- 主機平臺:提供Tuscany運行時的環(huán)境
bootsrap
Bootstrap 進(jìn)程受主機環(huán)境控制。默認(rèn)進(jìn)程是由DefaultBootstrapper實現(xiàn)的。運行時進(jìn)程服務(wù)使用SCA XML形式進(jìn)行集成,也可以采用其他形式:
- 加載階段處理SCDL,并在內(nèi)存中創(chuàng)建一個對應(yīng)的運行時對象(例如:組件、服務(wù)、引用)
- 連接線將引用連接到服務(wù)
集成模型
SCA的裝配模型在Tuscany中是通過一系列接口實現(xiàn)的。以下是一些關(guān)鍵件:
- SCA組件是由SCA實現(xiàn)的實例配置而成,它提供和銷毀服務(wù)
- SCA服務(wù)用以聲明外部可訪問的服務(wù)實現(xiàn)
- SCA引用表示一個對其他服務(wù)實現(xiàn)的引用,這里被使用的服務(wù)通過配置指定
- 一種實現(xiàn)表示一種軟件技術(shù),例如Java類、BPEL流程、XSLT轉(zhuǎn)換、或者C++類,用以在SOA應(yīng)用中實現(xiàn)一個或多個服務(wù)。一個SCA集成也是一個實現(xiàn)。
- 組件類型指的是可配置的實現(xiàn)方式
- 接口定義了一個或多個業(yè)務(wù)功能,這些業(yè)務(wù)功能的實現(xiàn)由服務(wù)提供,通過引用為組件所使用,服務(wù)是由實現(xiàn)的接口所定義的,SCA目前支持兩種類型的接口:
- Java接口
- WSDL portTypes
- 一個SCA Composite十一個SCA域中的基本單元,它由組件、服務(wù)、引用、它們之間的連線組成。
- SCA聯(lián)結(jié)了服務(wù)引用和服務(wù)
- 服務(wù)和引用之間使用綁定聯(lián)結(jié)。引用使用綁定描述服務(wù)之間相互訪問的機制,服務(wù)使用綁定描述客戶端訪問服務(wù)的機制
- 屬性允許在外部實現(xiàn)的配置進(jìn)行設(shè)值,數(shù)據(jù)通過組件也可能源自于一個組合件的屬性提供。
發(fā)布
Tuscany運行時提供了一個框架,以支持SCA發(fā)布。該框架可針對以下擴展點進(jìn)行擴展:
PackageProcessorExtensionPoint:負(fù)責(zé)處理不同的包或者檔案格式,例如:文件夾、JAR包、osgi包、EAR、WAR以及ZIP。
ArtifactProcessorExtensionPoint:負(fù)責(zé)處理具體類型的服務(wù),例如:WSDL、XSD、構(gòu)件、JAVA類、BPEL。
- 包處理器在安裝時掃描發(fā)布包,并且創(chuàng)建一個待處理列表,目前支持文件夾/文件系統(tǒng)和jar發(fā)布包,為了對發(fā)布包可用,包處理器程序需要通過包處理器擴展點進(jìn)行自我注冊。
- 組件處理器被用來處理發(fā)布包中的組件,為了保持對發(fā)布服務(wù)可用,組件處理器需要使用組件處理擴展進(jìn)行自我注冊,組件處理器會在以下兩個步驟進(jìn)行調(diào)用:
- 讀 取: 在這里你可以讀取一個組件(一個文檔、XML、類等等),實例化一個代表組件的模型并銷毀它。SCA發(fā)布服務(wù)對注冊了ArtifactProcessor 的組件調(diào)用ArtifactProcessor.read() 方法,如果你的模型對另外一個模型有引用,不要試圖也立即實例化另一個模型,你應(yīng)該只保留 引用信息,在處理階段這將變成一個指針,注意現(xiàn)在你沒必要完全讀取并實例化你的模型,可以延遲實例化。
- 處理:本階段給你機會使你可以處理對其他模型的引用(WSDL,類,其他復(fù)合組件,或者一個組件類型(componentType))。這時,所有代表發(fā)布包里組件的模型被全部讀取出來,并且在發(fā)布的 ArtifactResolver進(jìn)行注冊,準(zhǔn)備處理。
- 所有可以部署的復(fù)合組件都應(yīng)該部署在SCA域
實現(xiàn)擴展
實現(xiàn)擴展負(fù)責(zé)支持實現(xiàn)方式的類型:比如Java、Script、BPEL等。
綁定擴展
綁定擴展負(fù)責(zé)支持綁定方式的類型:Web服務(wù)、JMS、JSON-RPC以及RMI。
接口擴展
接口擴展負(fù)責(zé)支持接口的類型,例如Java接口和WSDL1.1 portType。
數(shù)據(jù)綁定擴展
復(fù)合組件激活
在一個復(fù)合組件在配置好以后,它可以在SCA域進(jìn)行激活,Tuscany運行時通過以下步驟去激活它:
1、構(gòu)建:在此階段,復(fù)合組件被進(jìn)一步常態(tài)化,以更容易和運行時互動,元數(shù)據(jù)在服務(wù)/引用升級以后進(jìn)行合并。基于扁平的模型,我們可以在構(gòu)建級獲取全部的信息。
2、配置:在此階段,復(fù)合組件的層次被引導(dǎo)到配置一個組件的實現(xiàn),在組件間以及組件和外部服務(wù)之間,引用綁定和服務(wù)綁定會在以后的步驟中用來創(chuàng)建運行時連接。
3、創(chuàng)建運行時連接: 在此階段,通過選定的綁定方式,創(chuàng)建了組件引用和組件服務(wù)的運行時連接。運行時連接是調(diào)用鏈的集合。每個執(zhí)行鏈包含一組執(zhí)行器和攔截器。執(zhí)行器為綁定協(xié)議 和實現(xiàn)技術(shù)提供調(diào)用的邏輯,攔截器是一種特殊的執(zhí)行器,它為方法執(zhí)行提供了附加的邏輯,例如數(shù)據(jù)轉(zhuǎn)換以及交易控制。對于一個組件引用來說,我們創(chuàng)建運行時 連接來表示通過綁定的對外執(zhí)行;對于組件服務(wù)呢,我們創(chuàng)建運行時連接表示對實現(xiàn)類型的向內(nèi)連接。回調(diào)連接可以被附加到組件服務(wù)之上,表示來自服務(wù)的回調(diào)執(zhí) 行。
4、啟動服務(wù)組件:在這個階段,ImplementationProvider, ReferenceBindingProvider和ServiceBindingProvider 定義的start() 回調(diào)方法將被調(diào)用,最后,組件、組件引用以及組件服務(wù)被初始化去服務(wù)組件間的互動。服務(wù)監(jiān)聽器被啟動已接受從綁定層來的連接請求。
調(diào)用概況
1、調(diào)用被分派到WireInvocationHandler
2、WireInvocationHandler 尋找正確的InvocationChain
3、創(chuàng)建一條消息,設(shè)值payload,設(shè)值TargetInvoker,然后將消息通過鏈向下傳遞
4、當(dāng)消息到達(dá)鏈的底部后,TargetInvoker 會被調(diào)用,它按順序?qū)δ繕?biāo)進(jìn)行調(diào)度
5、當(dāng)將TargetInvoker 存儲后,當(dāng)連接源的可視范圍等于或小于目標(biāo)時(例如:request-》composite),外向端允許將目標(biāo)實例進(jìn)行緩存。
運行時提供具有InboundWires 和OutboundWires的構(gòu)件。InvocationChains 被構(gòu)件連接所持有,因此它是無狀態(tài)的,允許引入新的攔截器以及重新連接等動態(tài)事件的發(fā)生。
加載SCA部件
組件處理器
組件處理器被用來處理發(fā)布包中的組件,為了保持對發(fā)布服務(wù)可用,組件處理器需要使用組件處理擴展進(jìn)行自我注冊,組件處理器會在以下兩個步驟進(jìn)行調(diào)用:
- 讀取: 在這里你可以讀取一個組件(一個文檔、XML、類等等),實例化一個代表組件的模型并銷毀它。SCA發(fā)布服務(wù)對注冊了ArtifactProcessor 的組件調(diào)用ArtifactProcessor.read() 方法,如果你的模型對另外一個模型有引用,不要試圖也立即實例化另一個模型,你應(yīng)該只保留 引用信息,在處理階段這將變成一個指針,注意現(xiàn)在你沒必要完全讀取并實例化你的模型,可以延遲實例化。
- 處理:本階段給你機會使你可以處理對其他模型的引用(WSDL,類,其他復(fù)合組件,或者一個組件類型(componentType))。這時,所有代表發(fā)布包里組件的模型被全部讀取出來,并且在發(fā)布的 ArtifactResolver進(jìn)行注冊,準(zhǔn)備處理。
加載JAVA SCA
SCA服務(wù)部件在SCA里以SCDL文件的形式進(jìn)行部署,Tuscany運行時組件處理器加載這些SCDL到模型對象,這些對象包含了元數(shù)據(jù)。
有兩種主要的加載器:
1、StAXElementLoader:從StAX 事件加載XML
2、ComponentTypeLoader:為一個實現(xiàn)加載組件類別或者處理一個文件
加載組件類別
為實現(xiàn)規(guī)范加載組件類型定義
1、如何實現(xiàn)是實現(xiàn)規(guī)范
運行時組件的類圖
posted on 2008-04-27 22:58 gembin 閱讀(1128) 評論(0) 編輯 收藏 所屬分類: SCA 、SOA