3. 创建一个分布式应用
一个SCA装配可以运行在单个或多个节点(node)环境。这节我们将介绍Tuscany节点以及如何将计算器应用构建成跨多节点的分布式应用。
3.1. 节点
节点(node)是Tuscany特有的术语(specific term,OASIS SCA规范并没有定义)。节点封装了Tuscany运行时,运行时由在Tuscany SCA Java distribution的模块目录中在在的模块组成。就像你所能想到的功能,如读取XML文件,创建SCA装配的内存模型,创建构件并把它们联接在一起以便处理到达的消息。
节点运行由一个或多个composite文件描述的SCA装配。每个节点运行在单个JVM中。如果我们只是出于测试的目的,可以在单个JVM中启动一个或多个节点。我们前面介绍的计算器应用加,减,乘,除构件都是包含在单独的组合构件中。
图-11
组合构件使用下面的API运行
node=SCANodeFactory.newInstance().createSCANodeFromClassLoader("Calculatorposite", getClass().getClassLoader()); node.start(); |
它加载给定的组合构件以及相关的资源,开始节点以启动组合构件中的构件。
3.2. 配置节点
创建节点很简单,如
SCANode2 node = SCANodeFactory.newInstance(). createSCANodeFromClassLoader("calculatorposite", null); |
参数“null”表示节点工厂将使用当前类加载器定位composite文件。当只有一个SCA contribution时,composite文件路径默认在SCA contribution路径中。
如果更多的contribution需要被加载到节点,可以使用下面的接口
SCANode2 node = SCANodeFactory.newInstance() .createSCANode("file:/C:/CalculatorContribution1/Calculatorposite", new SCAContribution("CalculatorContribution1","file:/C:/CalculatorContribution1"), new SCAContribution("CalculatorContribution2","file:/C:/CalculatorContribution2")); |
参数“file:/C:/CalculatorContribution1/Calculatorposite”明确指定要运行的composite文件的路径,
new SCAContribution("CalculatorContribution1", "file:/C:/CalculatorContribution1") |
展示如何提供contribution的细节。第一个参数表示给此contribution命名,第二个参数指出此contribution的路径,此参数表明contribution可以从本地系统或从网络获取。
使用多contribution很有用,比如你想把公共工件从具体的组合构件中分离出来,这个公共工件不用修改就可以应用于各个SCA应用。
3.3. 启动节点
节点一旦创建就可以按下面方式启动
node.start(); |
3.4. 定位服务
如果节点是从一块使用节点工厂接口的Java代码创建,本地引用服务可以按下面的方式
calculatorService = ((SCAClient)node).getService(CalculatorService.class , "CalculatorServiceComponent"); |
一旦节点被启动,所有远程绑定将被激活,你可以使用此节点已经定义的任何远程绑定形式试问构件服务。
3.5. 停止节点
如果任务完成或者你想中止节点处理消息,可以按下面方式停止节点
node.stop(); |
3.6. SCA域
当单独运行一个节点时引用的构件服务范围可以按名称指定。SCA定义了术语SCA domain来描述这个范围。SCA装配规范第10章是这样定义SCA domain的,“the boundary of visibility for all SCA mechanisms”(所有SCA机制的可见边界)。
在单独的节点中引用只能连接运行在同一名称节点中的服务。然而运行在不同JVM中的节点可以通过配置以分布式的方式运行SCA装配,在这种方式下运行在一个节点中的构件可以引用其他节点中的构件。为了使这个配置生效,节点必须作为同一分布式SCA域中的一部分运行。在Tuscany中分布式SCA域由使用不同域管理器进程代表。
3.7. 创建跨节点运行的组合构件
前面介绍的计算器应用,你可以发现引用和服务间的连接,是通过设置构件target值为引用构件名称,这些都是在只有一个节点组成的域中完成的。
图-12
在这节中我们将把计算器应用构建成分布式SCA应用。一个组合构件必须运行在一个单独的节点中,所以为了把计算器应用构建成分布式SCA应用,我们需要把它分解成多个组合构件。我们把CalculatorServiceComponent构件所引用的服务之一的AddServiceComponent构件构建在另一组合构件中。此时原来的Calculatorposite文件内容改为
<composite xmlns="http://www.osoa/xmlns/sca/1.0" targetNamespace="http://sample" xmlns:sample="http://sample" name="Calculator"> <component name="CalculatorServiceComponent"> <implementation.java class="calculator.CalculatorServiceImpl"/> <reference name="addService" target="AddServiceComponent" /> <reference name="subtractService" target="SubtractServiceComponent" /> <reference name="multiplyService" target="MultiplyServiceComponent" /> <reference name="divideService" target="DivideServiceComponent" /> </component>
... </composite> |
新增Addposite文件
<composite xmlns="http://www.osoa/xmlns/sca/1.0" targetNamespace="http://sample" xmlns:sample="http://sample" name="Add">
<component name="AddServiceComponent"> <implementation.java class="calculator.AddServiceImpl"/> </component>
... </composite> |
这二个组合构件运行在同一域上下文的不同节点中,calculator的addService引用仍然能够找到运行在不同节点上的AddServiceComponent。所以分布式SCA域能够由多个节点/组合构件组成,可以把定义在不同组合构件中的构件连接起来。
图-13
3.8. 启动域
由一个加载器启动域,如
public static void main(String[] args) throws Exception { DomainManagerLauncher.main(args); } |
在分布式计算器应用中这样的代码包含在node.LaunchDomain.java类中,运行这个就可以运行域管理器。
接下来我们将介绍Tuscany提供的基于web的域管理UI,管理域及如何用它部署由SCA构件组成的SOA应用。
3.9. 通过域管理Web接口配置域
一旦域启动就可以通过在浏览器地址栏输入http://localhost:9990/ui使用默认域提供的Web接口。它有一系列不同的页面以提供下面这些功能
l 添加contributions到域中
l 添加节点配置到域中
l 配置运行在具体节点上的组合构件
l 启动本地节点实例以便测试配置
3.9.1. 从文件系统中配置域
在域管理web应用背后有三个存储配置的文件
workspace.xml-存储添加到域中的contribution的ID各路径
domainposite-虚拟域组合构件。它是一个代表包含了运行在此域中的所有组合构件虚拟域的SCA组合构件。uri用于指明组合构件来自于那个contribution。最后SCANode实例将启动包含在虚拟域中的每个组合构件。每个SCANode实例可以运行在单独或分布式处理器中,所以虚拟域是你的分布式应用的综合描述。
cloudposite-描述被用于运行SCA应用的云计算(分布式SCANode实例的集合)。每个节点都指定一个组合构件,并且拥有节点运行时所有绑定的详细配置,例如设置根URI。这些文件相同之处就是都用posite文件格式,但是这样方便因为首先我们并没有创建新的文件格式,其次以后我们重现作为管理目的的SCA服务网络的网络节点时可以更加方便,虽然我们还没这么做。
当你使用域管理web应用接口更新时,这些文件会被更新。它们都是XML格式,可以手工编辑或由程序自动编辑。分布式计算器应用中,你可以发现这些文件都位于根目录下。
3.9.2. 连接非SCA服务
为了连接SCA域以外的服务(不管此服务是SCA方式还是其他方式提供),你仍然可以配置明确的绑定,例如,假设计算器应用中的DivideServiceComponent是一个网络任何地方的非SCA web service,像这种SCA域外部的服务,我们可以用明确的远程绑定形式引用。
<component name="CalculatorServiceComponent"> <implementation.java class="calculator.CalculatorServiceImpl"/> <reference name="addService" ></reference> <reference name="subtractService" target="SubtractServiceComponent"></reference> <reference name="multiplyService" target="MultiplyServiceComponent"></reference> <reference name="divideService" target="DivideServiceComponent"> <binding.ws uri="http://localhost:8080/sample-calculator-ws-webapp/AddServiceComponent"/> </reference> </component> |
3.9.3. 从分布式域中启动节点
域管理器用于预处理每个部署到节点运行的组合构件的组合优先级。Contribution被加到域中,配置要告诉域管理器要运行组合构件的节点在哪里以及哪些组合构件需被运行。基于这些信息域管理器为每个部署到节点中的组合构件提供atom feed。组合构件附属的节点必须正确读取这些atom feed,下载运行组合构件必备工件。节点工厂提供了以域管理器暴露的atom feed URL为参数创建节点的API,如下
SCANode2 node = SCANodeFactory.newInstance(). createSCANodeFromURL("http://localhost:9990/node-config/NodeA"); |
参数http://localhost:9990/node-config/NodeA就是域管理器提供的atom feed URL。
域管理器处理组合构件间构件间的关系,提供每个节点中组合构件的完全配置,如绑定URIs就是在基本的预处理阶段正确填充的。
更多推荐
SCA导航3-创建一个分布式应用
发布评论