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