Tuscany服务化
From Tuscany中文社区
Tuscany关于Java component WS binding的分析报告
目录 |
[编辑] 引言
[编辑] 介绍
本文分析了 Tuscany是如何实现 osoa SCA WebService Binding V100的。从中我们可以看出 Tuscany如何实现 java构建服务化的,以及进一步认识 Tuscany本身的设计架构。 WSDL是描述一个服务的标准语言。
[编辑] 目标
本文将从 SCA Web Service Binding角度,进一步认识 Tuscany的设计思路。同时进一步理解 osoa SCA 1.0。
[编辑] 术语和缩略语
构件:本文将 SCA中的 Component译为构件。 组件:本文将 SCA中的 Composite译为组件。
[编辑] 背景介绍
SCA首先是想解决 SOA平台之间的兼容性问题,但是道路漫长。Tuscany目前已经做到了这样一个服务环境:他首先提供了一个本地构件运行环境,这与 Spring所做的工作是相同的。本地系统可以运行于 Tuscany提供的 IoC环境/容器之上。但是该环境比 Spring更加易于将异构系统所提供的服务通过 WS集成到本地系统中。本文将要探讨的是 Tuscany所提供的另一的非常重要的 SCA实现,即将本地的任何 java构件开发为服务,向其他系统提供。
[编辑] 分析内容
[编辑] 实现本地构件
当 tuscany扮演本地 IoC的时候,java对象提供本地构件的实例及其方法。开发者面临的工作是加载构件描述文件(见 SCA1.0)
<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" targetNamespace="http://mycomp" name="mycomposite"> <component name="Component"> <implementation.java class="mycomp.ComponentImpl"/> </component> </composite>
Tuscany将分析这个文件并加载构件中指明的实现类。目前, Tuscany所加载的类是多例的。这在 SCA1.0的标准中没有相关的规定。
Tuscany启动时将药装载 DefaultExtensionPointRegistry,其中包括初始化和处理 SCA Runtime的最核心的对象。上图扼要描述了 Tuscany所加载的 Registry的基本内容,该 Registry的主要作用是建立一个单例的对象池,从而保证系统处理资源的效率。
其中处理 Component Java Implementation的对象由 JavaRuntimeModuleActivator负责加载:
上图描绘了负责加载整个 java implementation的对象的结构。而javaInterfaceRuntimeModuleActivator的职责是初始化一个 JavaInterfaceFactory(其具体任务尚需确认)
[编辑] 服务化
Tuscany为开发者提供了一种十分方便的将一个构件服务化的途径。使用 SCA1.0的<service>。
但是开发者必须自己描述服务接口,即创建 wsd。当然,开发这也可以借助很多流行的工具从 java class或 interface生成 wsdl。Tuscany实现服务化需要借助一系列由其它开源项目提供的服务。包括:
[编辑] 加载 wsdl
Tuscany实现构件服务化,需要首先加载 wsdl
wsdl被加载到 Tuscany的 context中(具体位置尚未确定),而后才会初始化构件的服务,构件服务化标记如下:
<service name="Component"> <interface.wsdl interface="http://mycomp#wsdl.interface(saySomethingPort)"/> <binding.ws/> </service>
其中的属性 interface的值就是 Tuscany已经加载的 WSDLDefinition对象(的某些数据)。下图中与此相关的两个对象 WSDLDefinition(由WSDLDocumentProcessor创建)和 WSDLInterface(由 WSDLInterfaceProcessor创建)具有依赖关系
加载 Http协议容器
下图是 Tuscany所实现的三种不同的 Http协议容器。在 standalong类型的应用系统中,部署人员可以选用 Jetty或 Tomcat的 runtime作为 Http协议接入,而服务消费者可以通过 http协议与服务交换 SOAP。而在一个 web应用中,部属人员可以选择使用 WebAppServletHost,该对象将会利用应用所处的 Http环境作为 SOAP的载体。
初始化Axis2引擎
[编辑] Tuscany激活构件
Tuscany在激活(Activate)构件的时候,根据每个构件的 Binding描述(例如:标有 <binding.ws/>的构件),触发一系列与服务化有关的行为。目前,Tuscany只能够依赖 Axis2的 API实现服务化。
在上图中, CompositeImpl(构件实现)是 “自包含”的,每个 CompositeImpl均经历一次 CompositeActivatorImpl的激活,在该过程中,如果 CompositeImpl存在服务化描述,则会通过 DefaultProviderFactoryExtensionPoint->Axis2BindingProviderFactory-> Axis2ServiceBindingProvider>Axis2ServiceProvider->Axis2API实例化一个 WebService。
[编辑] Tuscany数据绑定
上图描绘了 Tuscany的数据绑定部分所实现的主要的对象体系,该体系由一系列 Transformer(转换器)组成,并分别处理其对应类型的对象 >xml的转换。
AXIOM数据绑定:由于 Axis2依赖 axiom,所以,Tuscany又创建了几个相关的 Transformer,如下:
这些 Transformer均在 Tuscany启动时一次性创建,并保持在一个 Singleton缓存内,从而可以提高运行效率。
[编辑] Tuscany的可扩展设计
[编辑] ModuleActivator
ModuleActivator是 Tuscany装载各个扩展模块的首要模式,开发者在应用 Tuscany的时候,可以通过在 classpath中增加新的: META-INF/services/org.apache.tuscany.sca.core.ModuleActivator文件,并在其中注明自己所编写的 ModuleActivator,或者在已有的文件中增加一个 ModuleActivator对象,便可在 Tuscany启动时加载自己开发的扩展模块。
[编辑] LazyStAXArtifactProcessor
LazyStAXArtifactProcessor对象负责按照开发者在 classpath中增加: META-INF/services/org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor文件,并在其中注明自己所实现的 StAXArtifactProcessor,便可以用自己的处理器取代现有的。(其具体应用尚待分析)
[编辑] LazyURLArtifactProcessor
与上一节相同,开发者可以自己开发 URLArtifactProcessor,来处理相关的资源。
[编辑] LazyBindingProviderFactory
目前,构件服务化在 classpath中的/META-INF/services/org.apache.tuscany.sca.provider.BindingProviderFactory文件中描述了: org.apache.tuscany.sca.binding.axis2.Axis2BindingProviderFactory,该工厂将加载 Axis2的 WS环境,如果开发者试图使用别的 WS环境,则可以开发自己的工厂,并在这里标注出来,从而实现“非侵入”式的实现扩展。
[编辑] 参考资料
- Tuscany(0808) svn代码
- osoa.org SCA java component implemetation1.0
- osoa.org.SCA common annotation and APIs 1.0
- osoa.org SCA Assembly Model V1.0










