SCA规范学习装配规范.docx
- 文档编号:7179858
- 上传时间:2023-01-21
- 格式:DOCX
- 页数:31
- 大小:1.22MB
SCA规范学习装配规范.docx
《SCA规范学习装配规范.docx》由会员分享,可在线阅读,更多相关《SCA规范学习装配规范.docx(31页珍藏版)》请在冰豆网上搜索。
SCA规范学习装配规范
基于SCA的ESB分析:
SCA:
为构建基于SOA的应用和解决方案提供了编程模型
致力于为服务构件以及连接各服务构件的访问方式而包容各种广泛的技术的模型
实现了组件与传输协议的解耦(即组件自由绑定协议,并且支持自定义的扩展绑定)
Tuscany是SCA的JAVA实现,其基本架构如下:
重点关注tuscany的扩展机制:
Implementation:
SCA组件(Component)的实现方式,一个SCA组件可以由各种语言或技术平台实现,如:
POJO,EJB,SpringBean,bpel流程,各种脚本语言等等。
Binding:
是SCA的绑定(Binding)规范的实现,SCA服务(Service)和引用(Reference)的绑定方式,即一个SCA服务可以暴露为WebService,JavaRMI服务,http资源,jms消息等等,一个SCA引用也可以通过WebService,RMI调用,http调用,jms调用等方式调用远端服务。
Databinding:
数据绑定方式,用与在Binding中定义参数的传输格式,比如WebService的Binding一般用XML格式,SCA的Binding一般用SDO格式,Jsonrpc的Binding一般用Json格式等等。
Interface:
是SCA的接口(Interface)规范的实现,SCA服务(Service)和引用(Reference)的接口暴露方式,一般有Java,WSDL等类型。
这套扩展机制为整合各个平台的服务提供了基础。
ESB:
实现传输协议的转换
实现消息格式的转换
消息路由
数据集成
处理不同来源的业务
Tuscany中,对于传输协议的转换、消息格式的转换以及处理不同来源业务已经有所实现。
具体分析如下:
传输协议的转换:
通过绑定实现。
比如一个SCA组件可以向外部提供一个ws的服务,同时在该服务的实现中加入一个corba服务的引用。
这样,用户就可通过调用ws服务的方式,实现对corba服务的调用。
且tuscany的扩展机制允许针对新的协议加入自定义的绑定。
实现消息格式的转换:
通过数据绑定实现。
TuscanySCA支持的数据类型有XML、SDO、JAXB、DOM、JSON等等,其内部有一个消息转换器来实现不同格式消息之间的转换,这种转换机制并不都是一一对应的,而是传递的。
比如SDO要转换成AXIO,但Tuscany并没有实现这两种格式的直接转换,而是将SDO转换成StAX,然后StAX再转换成AXIO。
具体的转换路径使用Dijkstra最短路径算法获得。
而数据绑定是绑定中的子元素,相当于tuscany已经实现格式转换,并且同样允许自定义的数据绑定加入。
处理不同来源的业务:
相当于支持处理同步、异步的事件。
SCA在向外界提供服务时,可以选择同步和异步两种方式(异步细分为Asynconeway、Deferredresponse和Callback),用以处理不同来源的业务。
消息路由和数据集成,以及服务的加入(注册),删去(注销),修改(更新)是需要加入的功能。
以SCA架构为基础,或者说以Tuscany为基础实现ESB能节省很多工作。
SCA规范学习:
SCA装配规范
在SCA中,构件(或组件)是最小单元,多个构件可以构成组合构件,组合构件用以完成某个或某些相关的功能。
构件有其具体的实现(即代码),而组合构件的创建与配置则需要SCDL文档来实现。
SCA装配规范即是针对构件不同的装配需求而规定了SCDL文档该如何写。
本学习文档针对规范中提到的SCDL文档中一些重要元素,采用结合tuscany中的例子的方式来帮助理解这些概念。
Component
以下为带有component元素的XMLschema
NCName"requires="listofxs: QName"? autowire="xs: boolean"? requires="listofxs: QName"? policySets="listofxs: QName"? constrainingType="xs: QName"? >* NCName"requires="listofxs: QName"? policySets="listofxs: QName"? >* anyURI"? requires="listofxs: QName"? policySets="listofxs: QName"? />* NCName"multiplicity="0..1or1..1or0..nor1..n"? autowire="xs: boolean"? target="listofxs: anyURI"? policySets="listofxs: QName"? wiredByImpl="xs: boolean"? requires="listofxs: QName"? >* anyURI"? requires="listofxs: QName"? policySets="listofxs: QName"? />* NCName" (type="xs: QName"|element="xs: QName")? mustSupply="xs: boolean"? many="xs: boolean"? source="xs: string"? file="xs: anyURI"? >* property-value? Component元素有如下属性: •name(必须)–构件的名字。 在同一组合构件里的所有构件中名字必须唯一。 •autowire(可选)–指示包含的构件引用是否自动连线,默认是false。 •requires(可选)–策略意图的列表。 (策略框架规范) •policySet(可选)–策略集列表。 (策略框架规范) •constrainingType(可选)–强制类型的名字。 当指定时,构件的服务、引用和属性的集合,加之相关的意图将被限定为强制类型定义的集合。 component元素有0个或者1个implementation子元素,该子元素指定构件所使用的实现。 Service component元素有0个或多个service子元素,用于配置构件的服务。 可配置的服务是由实现定义的。 service元素有如下属性: •name(必须)–服务名字。 必须匹配由实现定义的服务名。 •requires(可选)--策略意图的列表。 •policySets(可选)--策略集列表。 service元素有0个或者1个interface子元素。 如果没有指定接口,那么实现为服务指定的接口有效。 如果指定了接口,就必须提供一个与实现提供的接口相兼容的子集。 service元素有0个或多个binding子元素。 如没有指定binding,那么实现为服务指定的binding有效。 如果指定了,那些绑定会覆盖实现所指定的绑定。 Reference component元素有0个或多个reference子元素,用于对其他服务的引用。 reference元素有如下属性: •name(必须)–引用名。 必须匹配实现中定义的引用名称。 •autowire(可选)–指示引用是否自动连线,默认是false。 •requires(可选)–策略意图的列表。 •policySet(可选)–策略集列表。 •multiplicity(可选)–定义了能连接到目标服务的引用的连线数目。 1..1,0..1,1..n,0..n •target(可选)–一个或多个目标服务URI的列表,依赖于multiplicty的设置。 •wiredByImpl(可选)–一个boolean值。 默认”false”,指示实现动态地连线该引用。 如果设置为“true”,表示这个引用的目标由实现代码在运行时设置。 reference元素有0个或者1个interface子元素。 (含义与service中相同) reference元素有0个或多个binding子元素。 (含义与service中相同) component元素有零个或多个property子元素。 该子元素用于配置实现的属性数据值。 其值可以通过多种方式获得。 (属性元素直接赋值;通过引用包含该component的composite中某个属性来赋值;通过文件赋值) component的SCDL文档例子 该例子是一个由两个component构成的composite,实现加法计算器功能,结构如下: AddServiceComponent实现加法功能,采用AddService接口,即其它本地类可以以AddService接口调用它 CalculatorServiceComponent实现CalculatorService接口(其它本地类可以以CalulatorService接口调用它),且其实现类调用了AddService接口(本地方式) 注: 该例子中的连线都是本地方式,通过SCA的装配方式,可以直接完成接口到具体实现的对应,不用从Java代码中新建接口类,指定接口的实现。 例1: (例1作为第一个SCDL文档学习,会比较详细) 定义了一个名为AddServiceComponent的构件,并指定了它的实现类。 AddServiceImpl代码如下: publicclassAddServiceImplimplementsAddService{ publicdoubleadd(doublen1,doublen2){ returnn1+n2; } } 现在需要定义一个新的构件,名称为CalculatorServiceComponent。 该构件需要引用AddServiceComponent构件。 首先,我们定义一个名为AddService的Interface和一个名为CalculatorService的Interface 代码如下: publicinterfaceAddService{ doubleadd(doublen1,doublen2); } publicinterfaceCalculatorService{ doubleadd(doublen1,doublen2); } 相应的,在实现CalculatorServiceComponent构件的java文件 CalculatorServiceImpl.java中,应有以下代码: publicclassCalculatorServiceImplimplementsCalculatorService{ privateAddServiceaddService; @Reference publicvoidsetAddService(AddServiceaddService){ this.addService=addService; } publicdoubleadd(doublen1,doublen2){ returnaddService.add(n1,n2); } } 代码中使用了@Reference注释,表明该方法中含有引用。 而在CalculatorServiceComponent构件的SCDL文档部分,应该有以下内容: 指定了实现类,指明了reference的服务名称是addService(对应代码中,即是方法setAddService中的参数addService。 此处的名称一定要一致,不然引用会失败),并且指明了addService的target是AddServiceComponent。 最后将这两个component装配成一个composite。 完整的SCDL文档如下: //www.osoa.org/xmlns/sca/1.0" targetNamespace="http: //sample" xmlns: sample="http: //sample" name="Calculator"> 测试调用: 编写一个测试类 publicclassCalculatorClient{ publicstaticvoidmain(String[]args)throwsException{ SCANodeFactoryfactory=SCANodeFactory.newInstance(); SCANodenode= factory.createSCANodeFromClassLoader("Cposite",CalculatorClient.class.getClassLoader()); node.start(); //初始化部分将在SCA规范JAVA实现部分中进一步学习 CalculatorServicecalculatorService= ((SCAClient)node).getService(CalculatorService.class,"CalculatorServiceComponent"); //Calculate System.out.println("3+2="+calculatorService.add(3,2)); node.stop(); } } 运行后得到结果: 2010-12-2019: 36: 30org.apache.tuscany.sca.node.impl.NodeImpl 信息: Creatingnode: Cposite 2010-12-2019: 36: 30org.apache.tuscany.sca.node.impl.NodeImplconfigureNode 信息: Loadingcontribution: file: /D: /tuscany-sca-1.6.1-src/samples/calculator/target/classes/ 2010-12-2019: 36: 31org.apache.tuscany.sca.node.impl.NodeImplstart 信息: Startingnode: Cposite 3+2=5.0 2010-12-2019: 36: 31org.apache.tuscany.sca.node.impl.NodeImplstop 信息: Stoppingnode: Cposite 该例子通过代码中的@Reference以及SCDL中对reference元素name属性和target属性的定义,将AddService接口的实例addService链接到了接口的实现部分(AddServiceImpl.java)。 例2: 同样是例1中的calculator加法功能,这次我们用ws的方式提供add服务,这需要在接口AddService中添加@Remotable注释: @Remotable publicinterfaceAddService{ doubleadd(doublen1,doublen2); } 同时,在其实现类中添加@Service注释 @Service(AddService.class) publicclassAddServiceImplimplementsAddService{ publicdoubleadd(doublen1,doublen2){ returnn1+n2; } } 调用该服务的CalculatorServiceImpl.java不用做任何改动。 而相应的,SCDL文档改为: //www.osoa.org/xmlns/sca/1.0" targetNamespace="http: //sample" xmlns: sample="http: //sample" name="Calculator"> //localhost: 8080/sample-calculator-ws-webapp/AddServiceComponent"/> AddServiceComponent构件中声明了服务,该服务的接口名称以及该服务的绑定协议。 CalculatorServiceComponent构件中指明了引用服务的接口名称,绑定协议以及该ws服务的具体接入点(uri) 该例子通过@Remotable注释和@Service注释的使用,结合reference元素和service元素中interface子元素和binding子元素的帮助,完成了对于一个ws服务的调用。 Composite Composite被用于在逻辑分组中装配SCA元素。 其在SCA域中是组合的基本单元。 SCA组合构件包含一系列的Componet,Service,Reference以及内连它们的wire和像外部暴露它们的promotion,外加上用于配置构件的一系列property。 composite元素有如下属性: •name(必须)–组合构件的名字。 组合构件名字的形式是一个XMLQName,在由targetNamespace属性标识的命名空间中。 •targetNamespace(可选)–composite声明所在的目标命名空间标识符 •local(可选)–composite中的所有component是否必须运行于同一个操作系统进程。 Local=”true”指示所有的构件运行于同一进程。 Local=”false”,是默认值,指示composite里的不同的构件运行于不同的操作系统进程,这些component可能运行在某个网络的不同节点上。 •autowire(可选)–被包含的构件引用是否自动连线,默认为false。 •constrainingType(可选)–constrainingType的名字。 当指定的时候,组合构件的服务,引用和属性的集合,再加上相关的意图,都会受限于costrainingType所定义的设置。 •requires(可选)–策略意图的列表。 •policySets(可选)–策略集列表。 composite包含0个或多个property,service,component,reference,wire以及includedcomposites。 Composite与Component关系: Component包含配置化的实现,该实现承载其Composite的业务逻辑。 Component提供服务并引用其他的服务。 Composite定义了Composite所提供的公开服务,这些服务能被Composite的外部访问(采用promotion)。 Composite引用描述该Composite依赖于其外部其他地方所提供的服务。 wire描述Composite中的Component服务与Component引用之间的连接。 关于promotion: Composite级别的服务是对该Composite中某一个Component的某一服务的提升。 即Composite服务实际上是由其内部的一个Component所提供的。 Composite级的引用是对一个或多个Component的一个或多个引用的提升。 注: 只要所有的Component引用相互兼容,多个Component引用能被提升为同一个Composite的引用。 在多个Component引用被提升为同一个Composite的引用的地方,它们都共享相同的配置,包括相同的目标服务。 Composite中的reference元素: 与component中的reference类似,当多了一个promotion的子元素,且在composite的reference中,promotion子元素是必须的。 •promote(必须)–标识一个或多个被提升的构件引用。 该值是用空格分隔的,形式为 如果构件只有一个引用,那么对引用名的指定是可选的。 另外,composite的引用可选地指定一个接口(interface),multiplicity
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SCA 规范 学习 装配