SOA标准之----SCA架构思想 SOA在Java领域有两套标准:一个是SUN推出的JBI(没有得到BEA和IBM的承认),另外一个是:IBM和BEA等公司推出的SCA和SDO标准。 JBI之关注Java组件只处理Java组件的集成
* 服务接口
*
* @author leizhimin 2009-6-2 15:31:49
*/
public interface HelloService {
String getHello(String username);
} HelloServiceImpl.java package hello;
/**
* 服务实现
*
* @author leizhimin 2009-6-2 15:32:36
*/
public class HelloServiceImpl implements HelloService {
public String getHello(String username) {
return "Hello " + username + "! This is a SCA program!";
}
} Hello.composite <!-- SCA的服务组件配置文件 -->
< composite xmlns ="http://www.osoa.org/xmlns/sca/1.0" name ="Hello" >
< component name ="HelloServiceComponent" >
< implementation.java class ="hello.HelloServiceImpl" />
< property name ="username" type ="xsd:string" default ="World" />
</ component >
</ composite > 2、SCA组件的客户端代码 package hello;
/**
* SCA的客户端调用
*
* @author leizhimin 2009-6-2 15:41:41
*/
public class HelloSCAClient {
public static void main(String[] args) {
SCADomain scaDomain = SCADomain.newInstance( "Hello.composite");
HelloService helloService =
scaDomain.getService(HelloService. class, "HelloServiceComponent");
String msg = helloService.getHello( "vcom");
System.out.println(msg);
scaDomain.close();
}
} 从客户端的调用代码来看,客户端需要知道服务端组件提供了什么服务,实现了什么纯Java接口。而不需要接口后面的实现细节。 从上面的开发过程可以看到,开发SCA组件,客户端和服务端都不需要知道技术细节。 客户端调用其他组件的时候,只通过一个简单的SCADomain实例,直接获取服务的实现实例就可以调用,而负责的调用和实现都交给了SCA运行环境。 通过上面的组建实例,也可以看出:服务组件是SCA架构的基本单元,SCA是以服务组件为基本单元来进行集成的。下面将介绍各种服务组件的概念。 四、服务组件 1、概念 服务组件准确讲没有确切的概念,它更贴近于一件实实在在的物品,只能从他的形状、组成、结构、功能、状态、属性等侧面来描述它。 服务组件是SCA里面最基本的功能单元,它主要包括接口、实现、引用、属性等部分。可以从一下侧面来描述服务组件。 a)、是在一个模块(Composit)内的通过配置生成的一个实现的实例。 b)、多个组件可以用同一个实现(思考:一个Java的对象可以同时实现多个接口)。 c)、提供服务和消费服务(组件可以调用别的组件的服务)。 d)、通过配置来实现对象的属性值(配置节点为property)。 e)、组件通过连线(Wire)来设置服务引用。连线可以连接到别的组件的服务,也可以连接到模块的引用(模块的概念后面会详细讲述)。 2、 服务组件的组成部分 服务组件的组成包含四个部分:服务、组件实现、引用、创建属性。 下面给出服务组件的结构图如下: 如上图,分别讲述服务组成的各个部分: a)、服务(Service),用来让其他组件调用。是一个接口。如果是基于Java的SCA,它就是Java的接口;也可以是WSDL的ProtType接口,目前只有这两种形式。 b)、组件实现(Implementation),实现所创建的服务,对Java来说,就是接口的实现类。 c)、引用(Reference),一个组件可能需要调用其他组件,需要创建于igeqita组件的引用。对Java来说,就是其他组件的Java接口。 d)、属性(Property),对组件实现的一种属性参数注入。 对一个服务组件来说,服务和实现时必须的,引用和属性是非必需的。例如,对上面Hello World的例子来说,组件的结构图如下: 五、服务模块 SCA是通过模块(Composite)将SCA组件集成在一起的。 SCA的模块是实际上是将SCA组件(做为零件)重新组合集成度更高的组建,从整体看来SCA模块和SCA组件的结构式一致的。从构成组件的“零件”角度看,SCA模块是用了组件作为零部件重新组装为新的组件(模块)。 其实道理也非常简单,下面是SCA模块的基本原理图: 如上图,可以看到,模块从整体上也是个组件。 模块是通过SCA的配置文件配置组装形成的,不需要程序的硬编码。 提升(Promote):就是将组件的接口、属性、或引用装配为模块的对应的接口、属性或引用。 连线(Wire):就是在模块内部,组件之间的调用关系。比如组件A的实现调用了组件B,那么组件AB间就存在一个连线。 当组件之间需要调用的时候,由于目前组件(如EJB、WS、JMS)传输协议的多样化,这样在相互的调用的时候,需要将绑定不同的协议去调用。这里尽可能避免让人迷惑而又没有价值的绑定(Binding)一词的概念。 六、服务子系统 在一个大的项目里面,可能会有很多服务模块,多个服务模块之间如果需要相互调用,那么就可以将多个服务模块通过WS或者JMS等技术绑定在一起,形成服务子系统。 理解了模块的概念,就不难理解服务子系统了。 七、SCA与JBI的异同 1、相同点 目的是一样的:都是为了集成。 大致方向一样:都是为了将服务和传输协议解耦。 2、 不同点 SCA以接口作为切入点,从组件接口层将传输协议和接口实现解耦,是从编程的角度出发,一种全新的编程模型。 JBI是以请求消息和相应消息作为切入点,在集成时将消息和传输协议解耦,形成一种与传输协议无关的标准消息,这样形成一种全新的区别于现有应用服务器的集成容器,是从容器的角度出发,一种全新的容器模型。 个人观点:
JBI是SUN公司自己的标准,没有得到IBM、Oracle等公司的承认。目前也没有得到商业容器开发商的支持,前景不看好,目前这方面的资料和文档也相当少。个人建议JBI应用方案应该慎用,如果使用SOA,尽可能使用比较成熟的SCA方案。
http://blog.51cto.com/lavasoft/163782