和前面几篇实践的例子不同,本片偏重于理解,如果前面是怎么做,那么这篇是属于为什么这么做的吧。
What is SCA?
SCA为构建基于SOA的应用和解决方案提供了编程模型。它基于这样的理念:将业务功能作为一系列的服务而提供,并由这一系列的
服务组装起来的解决方案来满足特定业务需求。这些组合的应用既包括为应用而新创建的特定服务,也包括源自已已存在系统和应用
的业务逻辑,这些业务逻辑作为组合构件的一部分被复用。
SCA既为服务的组合也为服务构件的创建提供了模型,包括对SCA组组合构件中对已存在应用功能的复用。SCA就是一个致力于为服
务构件以及连接各服务构件的访问方式而包容各种广泛的技术模型。对于构件,不仅仅只是不同的编程语言,还包括那些编程语言普
遍使用的框架和环境。对于访问方式,SCA组合允许使用广泛采用的各种通讯和服务访问技术。其中包括如Web service、Messaging
系统以及远程过程调用(RPC)技术等。
----摘自< SCA装配模型V100中文版>
SOA的最开的出发点是解决企业越来越多和复杂的需求给技术带来的问题。这和Spring相比是采用了两个途径,Spring是一种革命,一种先破坏,再重建的办法,Spring重新定义了三层架构,重新开发了框架,而IBM,BEA,MS等大型的厂商则是采取了在现有的基础上进行改良的道路。二者到现在逐渐又走到一起了,再SOA中生成的ESB组件,在Spring中又提出了类似的改进,而SOA中也使用了新的EJB模型,采用了SDO等数据库高级映射,导致最开始的九层EJB也已经蜕变成了三层。soa解决了什么问题?
1.分离业务与技术
2.全局定义策略意向
3.宽松的重用
这些都是伴随用户对系统的复杂度增加过程中应运而生的,可以说,SOA是一种架构的成长必然结果。
IBM给出的SOA架构:
表现层/服务消费者层/数据交换层 -> 业务流程层-> 服务层-> 服务组件层 ->资源库层
记得很久以前,IBM曾经提出过 SOA =BPEL+SCA+SDO 模型;
从架构图中我们可以看出,此SOA架构图完全是此模型扩展而至,SCA贯穿的是下三层;
SCA组件模型:
我们看得出,重点为4种 : 实现(implements),服务(service),属性(properties),引用(reference);
属性相当于工作流中数据源(context),传递的变量,使用度说实话实在不高,故此其实真正的有用概念=组件,服务,引用;
叙述他们之间的关系:
大约意思是这样使用componenttype配置文件来约束component,每个component都拥有一个实现,而每个实现都有一个接口;
component type几乎没什么用,现在都用注解了,一般不用他,甚至后期可以使用spring来管理,因此此配置文件用途不大;
域(Domain)
域,对于分布式部署,是最重要的概念之一;
逻辑上,它是一个很模糊的概念,
理论:SCA Domain描述一个完整的运行时配置,潜在地可以被部署到一系列内连的运行时节点上;
应用:它是一个容器,更是一个系统边界,决定域与域的交互;
官方的说法:
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 }
本文参考内容:http://www.cnblogs.com/wangzhehan/archive/2011/05/26/2059323.html