SCA/Tuscany的一些使用心得(一) - SCA规范以及Domain域

第一天来到博客园,说实话,并不知道该发些什么样内容会好一些,我最想的是弄点工作流方面的东西,可惜很多思想方面的东西没有整理出来,之前

空闲的时间也重新将jbpm数据库表切分一些,更方便于查阅,但是一直没有完成,主要工作忙的事情不停,最近整合需要给公司出一份Tuscany的开

发文档,故此也整理了这些天的东西;也希望能与大家交流,其中也有很多值得推敲的地方,很多地方也只是我的臆测,如有错误还请指出,多多交流;

那么我们开始吧:

What is SCA? 

SCA为构建基于SOA的应用和解决方案提供了编程模型。它基于这样的理念:将业务功能作为一系列的服务而提供,并由这一系列的

服务组装起来的解决方案来满足特定业务需求。这些组合的应用既包括为应用而新创建的特定服务,也包括源自已已存在系统和应用

的业务逻辑,这些业务逻辑作为组合构件的一部分被复用。

 

SCA既为服务的组合也为服务构件的创建提供了模型,包括对SCA组组合构件中对已存在应用功能的复用。SCA就是一个致力于为服

务构件以及连接各服务构件的访问方式而包容各种广泛的技术模型。对于构件,不仅仅只是不同的编程语言,还包括那些编程语言普

遍使用的框架和环境。对于访问方式,SCA组合允许使用广泛采用的各种通讯和服务访问技术。其中包括如Web service、Messaging

系统以及远程过程调用(RPC)技术等。

----摘自< SCA装配模型V100中文版>

 

SCA是IBM做针对SOA实现,提出的具体实现规范,与ESB集成的概念不同,IBM拥有整套对于SOA架构及治理的解决方案,SOA的解决方案中一部分,而非全部,故此它是以组件的层次来看待交互,而非SOA全局立场进行构建;

 

IBM给出的SOA架构:

 

表现层/服务消费者层/数据交换层 -> 业务流程层-> 服务层 -> 服务组件层 ->资源库层

 

 

记得很久以前,IBM曾经提出过 SOA = BPEL+SCA+SDO 模型;

从架构图中我们可以看出,此SOA架构图完全是此模型扩展而至,SCA贯穿的是下三层;

 SCA组件模型:

 

 

 

我们看得出,重点为4种 : 实现(implements),服务(service),属性(properties),引用(reference);

属性相当于工作流中数据源(context),传递的变量,使用度说实话实在不高,故此其实真正的有用概念=组件,服务,引用;

 

叙述他们之间的关系:

之前看过一本<分布式Java应用:基础与实践 >,里面SCA的组件,服务,引用的关系图,画得很到位;

至于官网的关系图,只能用烂来表示了,我本想找来那本书里图,结果在网上没找到,不给力啊!

所以只能用官网的图来凑合下,如果有条件,看一看下分布式应用里面的图,再有那本书挺不错的,特别对内存的分析方面;

 

大约意思是这样使用component type配置文件来约束component,每个component都拥有一个实现,而每个实现都有一个接口;

component type几乎没什么用,现在都用注解了,一般不用他,甚至后期可以使用spring来管理,因此此配置文件用途不大;

(Domain)

,对于分布式部署,是最重要的概念之一;

逻辑上,它是一个很模糊的概念,

理论:SCA Domain描述一个完整的运行时配置,潜在地可以被部署到一系列内连的运行时节点上;

应用:它是一个容器,更是一个系统边界,决定域与域的交互;

 

官方的说法:

SCA域非常灵活,可以很小也可以很大:

一个很小的域,可能是一个在测试环境内;

中型域可能是一个单一的服务器还是小型集群,支持单一应用;

大型的域可以描述一个部门或公司的全部服务;

引自:Tuscany官网的SCA快速入门

 

- 这个概念在各个方面内都有出现,ESB中有企业域,部门域等概念,SSO有跨域访问的概念,SOA有域库存的概念;

域来讲是对外是一个整体,对内由不同的应用组件而成;

SCADomain,域的大小是由我们自由定义,一般来讲会定义层较大的域,因为同一域内可以使用引用的方式,域外绑定;

不过具体还要看业务上决定,从效率上,个人更倾向于企业域;

 

代码:

创建域:

 

SCADomain domain = SCADomain.newInstance("com/config/simple/echo.composite");


SCADomain初始化:

 1.创建需要使用的创建classLoader; 如 -  

final ClassLoader runtimeClassLoader = SCADomain.class.getClassLoader();

2.  查找扩展配置文件,并获取扩展SCADomain实现类 -

 

Class<?> implClass = ServiceDiscovery.getInstance().loadFirstServiceClass(SCADomain.class);

3. 创建SCADomain实例;

3.1 没有扩展SCADomain实现时,创建默认SCA域实现;

 

new DefaultSCADomain(runtimeClassLoader, applicationClassLoader, domainURI, contributionLocation,composites);

3.2  拥有扩展SCADomain实现时,创建扩展SCA域实现;

constructor = implClass.getConstructor(ClassLoader.class, String.class);

domain
= (SCADomain)constructor.newInstance(runtimeClassLoader, domainURI);

4.返回SCADomain实例;


源码:

1 static SCADomain createNewInstance(String domainURI, String contributionLocation, String... composites) {
2 // TODO 创建SCA域
3  
4 SCADomain domain = null;
5
6 try {
7 // 获取域的classLoader
8   final ClassLoader runtimeClassLoader = SCADomain.class.getClassLoader();
9 // 获取应用的classLoader
10   final ClassLoader applicationClassLoader = Thread.currentThread().getContextClassLoader();
11 // 查找扩展配置文件,并获取扩展SCADomain实现类
12   Class<?> implClass = ServiceDiscovery.getInstance().loadFirstServiceClass(SCADomain.class);
13 // 如果没有自定义扩展的域,则采用默认实现
14   if (implClass == null) {
15
16 // 创建默认的实现
17   domain =
18 new DefaultSCADomain(runtimeClassLoader, applicationClassLoader, domainURI, contributionLocation,
19 composites);
20 } else {
21 // TODO 创建扩展域实例
22
23 // 拥有构造方法集合
24   Constructor<?> constructor = null;
25 try {
26 constructor =
27 implClass.getConstructor(ClassLoader.class,
28 ClassLoader.class,
29 String.class,
30 String.class,
31 String[].class);
32 } catch (NoSuchMethodException e) {
33 }
34 if (constructor != null) {
35 domain =
36 (SCADomain)constructor.newInstance(runtimeClassLoader,
37 applicationClassLoader,
38 domainURI,
39 contributionLocation,
40 composites);
41 } else {// 使用继承的扩展SCA域的构造方法
42   constructor = implClass.getConstructor(ClassLoader.class, String.class);
43 domain = (SCADomain)constructor.newInstance(runtimeClassLoader, domainURI);
44 }
45 }
46
47 // FIXME: 定义为全局对象 - 静态
48   theDomain = domain;
49
50 return domain;
51
52 } catch (ServiceRuntimeException e) {
53 throw e;
54 } catch (Exception e) {
55 throw new ServiceRuntimeException(e);
56 }
57 }

呵呵,刚刚开始,比较简单,后面会有一些关于遇到的问题,以及没有解决的问题等等,争取一天写一篇博文,哈;

posted on 2011-05-26 23:01  刄月  阅读(1943)  评论(0编辑  收藏  举报

导航