SCA的架構思想

一、認識SCA

SCA(Service Component Architecture)中文翻譯爲“服務組件架構”,是一種全新的軟件架構思想。

SCA中,最重要的一個概念是Service----服務,它的內涵式獨立於具體的技術。因此,SCA不會稱之爲 Java組件架構,或Web Service 組件架構。所謂的具體技術,主要有兩層含義:一是程序語言,而是傳輸協議。

現有的組件是和傳輸協議緊密耦合的。比如EJB組件採用的是RMI傳輸協議,Web Service組件採用的是SOAP傳輸協議。SCA組件則能自由地綁定各種傳輸協議。

SCA是對目前組件編程的進一步昇華,其目標是讓服務組件能自由綁定各種傳輸協議,集成其他的組建與服務。

SCA與傳統的業務組件最大區別在於SCA實現了兩個功能:一是組件和傳輸協議的分離,二是接口和實現語言的分離。

SCA的本質是一種軟件架構思想,SCA架構是獨立於程序語言的SOA架構。

SCA的目標是創建一個可集成服務組件的運行環境。

我什麼需要SCA?答案:集成的需要。

先看沒有使用SOA技術的系統的集成的情況,需要相互約定和暴露接口。需要編寫集成的客戶端調用代碼。調用方和被調用方要“知彼知己”才能很好的集成,而這又都帶來高昂的代價和複雜度。

使用SCA的好處:組件之間處於一種松耦合的狀態,不需要在自己的代碼中加入對方組件的接口代碼。

二、認識SCA容器

SCA是一種思想,SCA思想的具體實現是SCA標準和SCA的容器環境。

SOA容器也分JBI容器、SCA容器等。SCA容器也是SOA容器總稱的一種,通常都單獨稱SCA容器,而直接泛稱SOA容器。這裏爲了區別與別的SOA容器開來,而稱之爲SCA容器。

SCA容器實現了將複雜的服務組件集成過程隱藏在容器內部,開發者之需要按照SCA的標準去開發和集成服務,最終部署到SCA的容器裏面即可。

SCA容器的實現很複雜,有關其容器的組成與架構也是一種商業祕密。開發人員只需要關係如何遵循SCA標準去開發和集成服務組件即可。

爲了更好去實現SCA架構,理解SCA服務組件概念的內涵和外延對開發者來說是非常重要的。

爲了更清晰的認識SCA的概念和原理,下面先給出一個簡單的SCA例子,以獲得對SCA有個感性的認識。

三、SCA實現的Hello World組件實例

完整SCA組件Hello World實例包含兩部分內容:

1、 SCA組件的服務端代碼

服務端代碼包括三個部分:

服務接口,一個Java的Interface----HelloService.java。

服務實現,HelloService接口的實現類----HelloServiceImpl.java。

SCA的服務組件配置文件:Hello.composite。

HelloService.java
/**
* 服務接口
*
* @author leizhimin 2009-6-2 15:31:49
*/
public interface HelloService {
String getHello(String username);
}

HelloServiceImpl.java
package hello;

/**
* 服務實現
*
* @author leizhimin 2009-6-2 15:32:36
*/
public class HelloServiceImpl implements HelloService {
public String getHello(String username) {
return "Hello " + username + "! This is a SCA program!";
}
}

Hello.composite
<!-- SCA的服務組件配置文件 -->
<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" name="Hello">
<component name="HelloServiceComponent">
<implementation.java class="hello.HelloServiceImpl"/>
<property name="username" type="xsd:string" default="World"/>
</component>
</composite>

2、SCA組件的客戶端代碼
package hello;

/**
* SCA的客戶端調用
*
* @author leizhimin 2009-6-2 15:41:41
*/
public class HelloSCAClient {
public static void main(String[] args) {
SCADomain scaDomain = SCADomain.newInstance("Hello.composite");
HelloService helloService =
scaDomain.getService(HelloService.class, "HelloServiceComponent");
String msg = helloService.getHello("vcom");
System.out.println(msg);
scaDomain.close();
}
}

從客戶端的調用代碼來看,客戶端需要知道服務端組件提供了什麼服務,實現了什麼純Java接口。而不需要接口後面的實現細節。

從上面的開發過程可以看到,開發SCA組件,客戶端和服務端都不需要知道技術細節。

客戶端調用其他組件的時候,只通過一個簡單的SCADomain實例,直接獲取服務的實現實例就可以調用,而負責的調用和實現都交給了SCA運行環境。

通過上面的組建實例,也可以看出:服務組件是SCA架構的基本單元,SCA是以服務組件爲基本單元來進行集成的。下面將介紹各種服務組件的概念。

四、服務組件

1、概念

服務組件準確講沒有確切的概念,它更貼近於一件實實在在的物品,只能從他的形狀、組成、結構、功能、狀態、屬性等側面來描述它。

服務組件是SCA裏面最基本的功能單元,它主要包括接口、實現、引用、屬性等部分。可以從一下側面來描述服務組件。

a)、是在一個模塊(Composit)內的通過配置生成的一個實現的實例。

b)、多個組件可以用同一個實現(思考:一個Java的對象可以同時實現多個接口)。

c)、提供服務和消費服務(組件可以調用別的組件的服務)。

d)、通過配置來實現對象的屬性值(配置節點爲property)。

e)、組件通過連線(Wire)來設置服務引用。連線可以連接到別的組件的服務,也可以連接到模塊的引用(模塊的概念後面會詳細講述)。

2、 服務組件的組成部分

服務組件的組成包含四個部分:服務、組件實現、引用、創建屬性。

下面給出服務組件的結構圖如下:

如上圖,分別講述服務組成的各個部分:

a)、服務(Service),用來讓其他組件調用。是一個接口。如果是基於Java的SCA,它就是Java的接口;也可以是WSDL的ProtType接口,目前只有這兩種形式。

b)、組件實現(Implementation),實現所創建的服務,對Java來說,就是接口的實現類。

c)、引用(Reference),一個組件可能需要調用其他組件,需要創建於igeqita組件的引用。對Java來說,就是其他組件的Java接口。

d)、屬性(Property),對組件實現的一種屬性參數注入。

對一個服務組件來說,服務和實現時必須的,引用和屬性是非必需的。例如,對上面Hello World的例子來說,組件的結構圖如下:

五、服務模塊

SCA是通過模塊(Composite)將SCA組件集成在一起的。

SCA的模塊是實際上是將SCA組件(做爲零件)重新組合集成度更高的組建,從整體看來SCA模塊和SCA組件的結構式一致的。從構成組件的“零件”角度看,SCA模塊是用了組件作爲零部件重新組裝爲新的組件(模塊)。

其實道理也非常簡單,下面是SCA模塊的基本原理圖:

如上圖,可以看到,模塊從整體上也是個組件。

模塊是通過SCA的配置文件配置組裝形成的,不需要程序的硬編碼。

提升(Promote):就是將組件的接口、屬性、或引用裝配爲模塊的對應的接口、屬性或引用。

連線(Wire):就是在模塊內部,組件之間的調用關係。比如組件A的實現調用了組件B,那麼組件AB間就存在一個連線。

當組件之間需要調用的時候,由於目前組件(如EJB、WS、JMS)傳輸協議的多樣化,這樣在相互的調用的時候,需要將綁定不同的協議去調用。這裏儘可能避免讓人迷惑而又沒有價值的綁定(Binding)一詞的概念。

六、服務子系統

在一個大的項目裏面,可能會有很多服務模塊,多個服務模塊之間如果需要相互調用,那麼就可以將多個服務模塊通過WS或者JMS等技術綁定在一起,形成服務子系統。

理解了模塊的概念,就不難理解服務子系統了。

七、SCA與JBI的異同

1、相同點

目的是一樣的:都是爲了集成。

大致方向一樣:都是爲了將服務和傳輸協議解耦。

2、 不同點

SCA以接口作爲切入點,從組件接口層將傳輸協議和接口實現解耦,是從編程的角度出發,一種全新的編程模型。

JBI是以請求消息和相應消息作爲切入點,在集成時將消息和傳輸協議解耦,形成一種與傳輸協議無關的標準消息,這樣形成一種全新的區別於現有應用服務器的集成容器,是從容器的角度出發,一種全新的容器模型。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章