上次開(kāi)會(huì)討論了對(duì)SCA和SDO的理解后,又重讀了IBM上關(guān)于SCA的文章,摘要如下:
SCA(Service Component Architecture)編程模型入門(mén)上指出:
?
服務(wù)組件(SCA Service Component)是SCA中的基本組成元素和基本構(gòu)建單位,也是我們具體實(shí)現(xiàn)業(yè)務(wù)邏輯的地方。
其組件結(jié)構(gòu)圖如下:

?????? 服務(wù)模塊(Service Module)由一個(gè)或多個(gè)具有內(nèi)在業(yè)務(wù)聯(lián)系的服務(wù)組件構(gòu)成,模塊是SCA中的運(yùn)行單位,因?yàn)橐粋€(gè)SCA模塊背后對(duì)應(yīng)的是一個(gè)J2EE的企業(yè)應(yīng)用項(xiàng)目。
服務(wù)模塊之間的關(guān)系如下:

?????? 可見(jiàn),同一服務(wù)模塊內(nèi)部的服務(wù)組件之間是通過(guò)Reference和Interface直接關(guān)聯(lián)起來(lái)的,相對(duì)來(lái)說(shuō)有比較緊密地耦合。
結(jié)合HelloWorld的示例應(yīng)用

?????? 可以看到,同一個(gè)ServiceModule實(shí)際上實(shí)現(xiàn)了一個(gè)獨(dú)立的應(yīng)用,這個(gè)應(yīng)用一般有自己的展示層,通過(guò)Standalone Reference的方式,和Service Component建立聯(lián)系,實(shí)際的業(yè)務(wù)邏輯都封裝在Service Component中。同時(shí),對(duì)于不同的ServiceModule,要相互引用,就要多費(fèi)一些功夫了,需要使用服務(wù)模塊中的導(dǎo)入和導(dǎo)出定位到實(shí)際的服務(wù)模塊。
?????? 對(duì)于不同ServiceModule的交互,文章
WebSphere Process Server V6 體系結(jié)構(gòu)概述中給出下圖一個(gè)簡(jiǎn)單的端到端業(yè)務(wù)數(shù)據(jù)同步的例子:

并解釋?zhuān)?br />?????? 源EIS通過(guò)其適配器發(fā)出請(qǐng)求,傳入一個(gè)應(yīng)用特定業(yè)務(wù)對(duì)象(Application-Specific Business Object,ASBO),通過(guò)轉(zhuǎn)接器轉(zhuǎn)換成一般業(yè)務(wù)對(duì)象(Generic Business Object,GBO),進(jìn)入業(yè)務(wù)流程引擎進(jìn)行處理,處理的結(jié)果以另一個(gè)GBO的形式,通過(guò)Selector傳輸?shù)街付ǖ哪繕?biāo),再經(jīng)轉(zhuǎn)接器轉(zhuǎn)換為目標(biāo)EIS的應(yīng)用特定業(yè)務(wù)對(duì)象,進(jìn)入目標(biāo)EIS進(jìn)行處理。
?????? 其中中間的矩形包括的ASBO、轉(zhuǎn)換器、GBO等等,按照我的理解,我覺(jué)得應(yīng)該是企業(yè)服務(wù)總線ESB的功能,也就是不同的ServiceModule都插接到ESB上,通過(guò)業(yè)務(wù)對(duì)象映射服務(wù)(Map Service)以及關(guān)系服務(wù)(Relationship Service)一起,完成接口轉(zhuǎn)接的功能。同時(shí),在一個(gè)SCA Service Component中,一般都是使用同樣的BO,如果不同,可以使用SCA接口轉(zhuǎn)接器(Interface Mediator)提供了SCA接口轉(zhuǎn)接的功能轉(zhuǎn)換,但是考慮到BPEL等等的自動(dòng)編排,一般ServiceModule內(nèi)部還是應(yīng)該使用同樣的BO,不同的ServiceModule之間一般BO不同。這里的BO就是SDO
同時(shí),可以看到,不同模塊的耦合主要是通過(guò)引用來(lái)實(shí)現(xiàn),一般來(lái)說(shuō),SCA引用分為模塊內(nèi)的引用和模塊間的引用。模塊間的引用定義的是一個(gè)模塊(中的組件)對(duì)于外部服務(wù),例如另一個(gè)模塊中的組件或者Web服務(wù)等的依賴(lài)。
??????同時(shí),我們注意到一點(diǎn),在很多IBM SOA的文章中,都是使用了Service Locator的方法來(lái)定位服務(wù),比如
SCA(Service Component Architecture)編程模型入門(mén)中就使用了如下代碼:
1
ServiceManager?serviceManager?=?new?ServiceManager();
2
Service?service?=?(Service)?serviceManager.locateService("HelloWorldInterfacePartner"); ????注意到這里的
HelloWorldInterfacePartner實(shí)際上是一個(gè)服務(wù)的邏輯名,所以這里就實(shí)際上解除了和實(shí)際的服務(wù)的耦合,是很松散的耦合。比較一下在spring等等IOC框架中的通過(guò)配置文件來(lái)組裝POJO的方法,這樣也不失為一種可行的策略。不過(guò),相比而言,我還是更喜歡在spring中那種通過(guò)xml配置文件組裝bean的方法,更加靈活一些的