SCA提供了實(shí)現(xiàn)面向服務(wù)的架構(gòu)(SOA)
的一個(gè)編程模型。
面向服務(wù)的架構(gòu)已經(jīng)在軟件開發(fā)領(lǐng)域存在很多年了。但是當(dāng)一些組織試圖去定義最佳的實(shí)現(xiàn)和管理
技能的時(shí)候,為一個(gè)特定組織開發(fā)一個(gè)SOA的細(xì)節(jié)卻是難以捉摸的。在這篇文章里,我將介紹SOA的一種實(shí)現(xiàn)方式——服務(wù)-組件架構(gòu)。
SOA在概念上來說是關(guān)于松耦合的行為。業(yè)務(wù)和系統(tǒng)功能作為大的獨(dú)立服務(wù)被展現(xiàn),使得它們以不同的方式在業(yè)務(wù)流的組合中被使用。這是一個(gè)簡(jiǎn)單的描述,但實(shí)現(xiàn)起來就相當(dāng)?shù)膹?fù)雜了。任何使用EAI和分布式
技術(shù)的人都能回憶起在一個(gè)企業(yè)里兜售業(yè)務(wù)功能的困難。
SOA原理是抽象的,獨(dú)立于實(shí)現(xiàn)技術(shù)。從開發(fā)角度來看,定義SOA構(gòu)成是有幫助的,它使得工程師可以無須求助于技術(shù)規(guī)范來用具體術(shù)語(yǔ)討論開發(fā)實(shí)現(xiàn)。為了這個(gè)目標(biāo),開放面向服務(wù)的架構(gòu)(OSOA)組織發(fā)布了服務(wù)組件架構(gòu)(SCA)規(guī)范1.1(www.osoa.com)。
SCA已經(jīng)被IBM,BEA,Sun,Software AG,IONA,SAP,和
Oracle以及其他一些公司開發(fā)很多年了。可以在IBM,Rogue Wave,Oracle,Tibco,
Apache Software Foundation(Tuscany)和
Eclipse Foundation(SOA Tools Platform)獲取實(shí)現(xiàn)。
SCA編程模型
SCA編程模型主要通過提供一個(gè)服務(wù)的開發(fā),集合,部署的方法,來關(guān)注SOA的工程細(xì)節(jié)。為了和SOA原理一致,SCA通過元數(shù)據(jù)驅(qū)動(dòng),語(yǔ)言獨(dú)立和容器
獨(dú)立來支持異構(gòu)的實(shí)現(xiàn)。只要一個(gè)從SCA規(guī)范到技術(shù)的映射可以被定義,SCA就能被實(shí)現(xiàn)。于是,SCA被和多種語(yǔ)言和容器綁定;最近的一個(gè)C語(yǔ)言規(guī)范以及
形成草案。
目前,SCA映射已經(jīng)存在于
Java,C++,
Ruby,
Spring,和BPEL及其他語(yǔ)言中。另外,SCA綁定也在web服務(wù),JMS,JCA和其他通信機(jī)制中存在。SCA的目標(biāo)是減少SOA的概念原理到可以在一個(gè)具體上下文中討論的具體元素集合。
SCA的好處有:
·使用組件和組合簡(jiǎn)化SOA實(shí)現(xiàn)
·使用松耦合的組件和參考來支持敏捷特性
·通過一個(gè)綜合的調(diào)用模型支持事件驅(qū)動(dòng)的行為
·將開發(fā)和集合分開,允許技術(shù)不可知的組合
建立服務(wù):程序集(Assembly)模型
程序集模型描述了服務(wù)是如何被定義和配置的。
組件是SCA模型的核心,可以用支持SCA的任何語(yǔ)言來實(shí)現(xiàn)。一經(jīng)定義,組件可以使用屬性來聲明配置,這將在接下來的實(shí)現(xiàn)中映射到accessor和mutator。
下面的是一個(gè)
XML聲明的組件。
//例1:組件聲明
(a)
<component name="AddServiceComponent">
<implementation.java class="calculator.AddServiceImpl"/>
</component>
(b)
<component name="CalculatorServiceComponent">
<implementation.java class="calculator.CalculatorServiceImpl"/>
<reference name="addService">AddServiceComponent</reference>
</component>
引用使得組件可以調(diào)用其他服務(wù)。引用在部署時(shí)或運(yùn)行時(shí)被解析。例1(b)顯示了一個(gè)例子引用。
組合是組件的群。根據(jù)聲明,一個(gè)組合可以被作為一個(gè)服務(wù)或者新的組件使用。因此,SCA模型支持遞歸程序集。
如果你通過將服務(wù)元素包含在組合聲明里,那服務(wù)本質(zhì)就是組合。和組件類似,組合和服務(wù)可以通過屬性來聲明配置。就像你可以從SCA程序集的元素聲明里看到的一樣,已有的程序可以通過將應(yīng)用建模為一個(gè)組件,組合或者提供一個(gè)可調(diào)用的程序接口而添加到架構(gòu)中來。
布線(Wiring)
組件連接是通過布線來完成的,也就暗示了需要定義組件之間的源/目標(biāo)信息。和其他SCA元素一樣,布線細(xì)節(jié)可以被聲明設(shè)置。SCA布線不需要元和目標(biāo)是
一個(gè)相同的類型(比如Java到WSDL的接口就是可接受的),只要考慮到了諸如遠(yuǎn)端性,回調(diào)支持,容錯(cuò),和異常處理等的兼容性。例3(a)是一個(gè)簡(jiǎn)單的
布線實(shí)例。
//例2:引用聲明
<composite xmlns="http://www.osoa.org/xmlns/sca/1.0"
name="CalculatorComposite">
<service name="CalculatorService">
<interface.java interface="calculator.CalculatorService"/>
<reference>CalculatorServiceComponent</reference>
</service>
<component name="CalculatorServiceComponent">
<implementation.java class="calculator.CalculatorServiceImpl"/>
<reference name="addService">AddServiceComponent</reference>
...
</component>
<component name="AddServiceComponent">
<implementation.java class="calculator.AddServiceImpl"/>
</component>
...
</composite>
//例3:(a)引用中的直接布線(b)和一個(gè)web服務(wù)綁定的引用
(a)
<reference name="stockQuoteService"
target="StockQuoteMediatorComponent"/>
(b)
<reference name="HelloWorldService">
<interface.java interface="helloworld.HelloWorldService"
callbackInterface="helloworld.HelloWorldCallback"/>
<interface.wsdl xmlns:wsdli="http://www.w3.org/2006/01/wsdl-instance" interface=
"http://helloworld#wsdl.interface(HelloWorld)"
callbackInterface="http://helloworld#wsdl.interface(HelloWorldCallback)"
wsdli:wsdlLocation="http://helloworld wsdl/helloworld.wsdl" />
<binding.ws endpoint=
"http://helloworld#wsdl.endpoint(HelloWorldService/HelloWorldSoapPort)"
location="wsdl/helloworld.wsdl" />
</reference>
為了簡(jiǎn)化開發(fā),SCA支持“自動(dòng)布線”。只要應(yīng)用是明確的,容器就應(yīng)該能在運(yùn)行時(shí)布線組件。
Binding
SCA模型通過綁定支持服務(wù)之間的通信,這在很多技術(shù)中存在了。為了和規(guī)范一致,所有的實(shí)現(xiàn)必須支持一個(gè)SCA服務(wù)綁定和Web服務(wù)綁定。綁定是被服務(wù)
和應(yīng)用使用的。服務(wù)使用綁定來定義它們?nèi)绾伪徽{(diào)用;引用使用它們來聲明它們?nèi)绾握{(diào)用一個(gè)服務(wù)。例3(b)是一個(gè)使用web服務(wù)綁定的例子。
服務(wù)質(zhì)量:策略框架
為了關(guān)注服務(wù)質(zhì)量(
QoS)和非功能化的需求,SCA模型提供了一個(gè)策略框架。策略可以用來定義
安全,可用性和交易,以及其他需求。策略可以和每個(gè)組件關(guān)聯(lián)在一起。服務(wù)和應(yīng)用可以擁有多個(gè)策略來允許不同方式的訪問。策略框架的主要元素是Intents, Profiles和Policy Sets。
Intents是在一個(gè)組件實(shí)現(xiàn)上的QoS限制的抽象描述。比如,消息需要是
加密的。一個(gè)用“confidentility”命名的Intent可以如例4(a)中被定義。
//例4:(a)Intent聲明;(b)Profile聲明
(a)
<intent name="confidentiality" constrains="sca:binding">
<description>
Communication through this binding must prevent
unauthorized users from reading the messages.
</description>
</intent>
(b)
<sca:profile intents="sec.confidentiality rel.reliability"/>
Profiles是Intent名字的聚合。一個(gè)Profile中應(yīng)用的Intents被映射到Policy Sets中的實(shí)現(xiàn)。例4(b)是一個(gè)Profile聲明。
Policy Sets和Intents實(shí)現(xiàn)相關(guān)。它們?cè)诔绦蚣P屠锫暶骷夹g(shù)相關(guān)的元素限制。例5是一個(gè)和Confidentility Intent相關(guān)的Policy Set。這個(gè)例子使用了intentMap元素,表明一個(gè)給定的Intent的另一種實(shí)現(xiàn)。
//例5:使用一個(gè)intentMap和WS-PolicyAttachment的Policy Set
<policySet name="SecureMessagingPolicies"
provides="confidentiality"
appliesTo="binding.ws"
xmlns="http://www.osoa.org/xmlns/sca/1.0"
xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy">
<intentMap provides="confidentiality"
default="transport">
<qualifier name="transport">
<wsp:PolicyAttachment>
<wsp:AppliesTo>
<wsa:EndpointReference xmlns:myStore="..." >
<wsa:Address>http://myStore.example.com/acct
</wsa:Address>
<wsa:PortType>
myStore:myPortType
</wsa:PortType>
<wsa:ServiceName>
myStore:InventoryService
</wsa:ServiceName>
</wsa:EndpointReference>
</wsp:AppliesTo>
<wsp:PolicyReference
URI="http://myStore.example.com/policies.xml" />
</wsp:PolicyAttachment>
<wsp:PolicyAttachment>
...
</wsp:PolicyAttachment>
</qualifier>
<qualifier name="message">
<wsp:PolicyAttachment>
<!-- policy expression and policy subject for
"message" alternative" -->
...
</wsp:PolicyAttachment>
</qualifier>
</intentMap>
</policySet>
Policy Set包含了一個(gè)技術(shù)的規(guī)范,包括綁定,源,目標(biāo)的細(xì)節(jié)。如果被要求使用一個(gè)公用密鑰體系,Policy
Set可以包含一些加密方法,信任關(guān)系和密鑰存儲(chǔ)的信息。WS-Policy和WS-PolicyAttachment是最好的Plicy
Set聲明的格式。然而,支持其他語(yǔ)言(比如XACML和所有權(quán)語(yǔ)言)是可能的,依賴于容器實(shí)現(xiàn)。
Intents通過組件元數(shù)據(jù)連接到組件上。例6給出了一個(gè)對(duì)服務(wù)聲明的對(duì)連接認(rèn)證和可靠性intents。
//例6:連接在服務(wù)上的Profile
<sca:service name="mySpecialService">
<sca:interface.wsdl portType="..." />
<sca:profile intents="sec.authentication rel.reliabilty"/>
</sca:service>
在寫此文時(shí),Policy Sets和Intents是包含在一個(gè)全局定義文件里的,它被通過Intent或Profile引用到一個(gè)程序集描述器文件。
數(shù)據(jù)訪問:服務(wù)數(shù)據(jù)對(duì)象
服務(wù)數(shù)據(jù)對(duì)象(SDO)并不是SCA模型合適的部分,但卻是最好的SCA數(shù)據(jù)架構(gòu)。SDO基于非連接數(shù)據(jù)圖的概念。SDO架構(gòu)保持了數(shù)據(jù)對(duì)象的樹或圖,可
以通過API訪問。這個(gè)架構(gòu)允許強(qiáng)類型和弱類型數(shù)據(jù)模型,因此支持靜態(tài)和動(dòng)態(tài)的數(shù)據(jù)訪問機(jī)制。SDO架構(gòu)并不對(duì)相關(guān)的查詢語(yǔ)言進(jìn)行假設(shè)。為了分開程序代碼
和數(shù)據(jù)訪問代碼,架構(gòu)鼓勵(lì)使用數(shù)據(jù)訪問服務(wù)(DAS)來操作圖
(incubator.apache.org/tuscany/das_index.html)。通過增加元數(shù)據(jù),SDO也支持運(yùn)行時(shí)數(shù)據(jù)圖的查看。既然
架構(gòu)在理念上已經(jīng)和XML同時(shí)設(shè)計(jì),它也提供了豐富的操作XML的機(jī)制。事實(shí)上,為了實(shí)際使用考慮,一個(gè)SDO的數(shù)據(jù)結(jié)構(gòu)最好是XML文檔。在寫此文時(shí),SDO規(guī)范是2.1版本。
總結(jié)
SCA嘗試基于SOA的概念去創(chuàng)建一個(gè)簡(jiǎn)單,強(qiáng)壯的編程模型。它的價(jià)值存在于概念的簡(jiǎn)單,程序集和QoS的聲明式方式。通過集合時(shí)間和運(yùn)行不行和松耦合
策略,SCA無須組件的先驗(yàn)知識(shí)來創(chuàng)建一個(gè)服務(wù)。這反過來也使得服務(wù)組件和結(jié)合開發(fā)者可以單獨(dú)工作。和SDO結(jié)合,一個(gè)廠商中立的SOA方案是可能的——
模型設(shè)計(jì)者從早先的模型中看到了其弱點(diǎn)——通過提供一個(gè)干凈的程序集和QoS的區(qū)分。如果Apache Tuscany
Project是一個(gè)SCA生存能力的驗(yàn)證,那么一個(gè)直接(盡管不是必須簡(jiǎn)單)的SOA實(shí)現(xiàn)是被保證了的。