站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2EE 专题ServiceMix企业服务总线(ESB)

ServiceMix企业服务总线(ESB)

摘要: ESB是集中化的、逻辑上的,具有架构层次的组件,提供在分布式异构环境中高度可扩展性、容错、消息服务等服务框架的一种实现。本文将讨论开源项目ESB ServiceMix,及其与JBI Java业务集成规范的关系。
ServiceMix 2.0——面向服务的消息路由框架


摘要

应用面向服务架构来集成各种新旧组件(或服务)需要底层架构的支持。此底层架构应该支持组件(或服务)的互联,且独立于组件(或服务)位置、消息通信协议、以及消息内容格式等。为整合现有服务和组件,并且适应当前的动态商业需求, 此底层架构必须具有高度的可定制性。 ESB (Enterprise Service Bus, 企业服务总线)满足前述要求。 Jeff Hanson在本文中将介绍ESB的概念,并探讨ESB中用以实现面向服务架构的跨平台消息通信、消息转换、消息安全性、消息调用等特性的各种机制。

ESB是集中化的、逻辑上的,具有架构层次的组件,提供在分布式异构环境中高度可扩展性、容错、消息服务等服务框架的一种实现。 ESB作为开放的、独立于实现的消息服务和接口模型,将应用代码与路由服务、传输协议隔离,同时允许替换服务的实现。
ESB在企业信息处理基础设施中作为共享的消息服务层,连接不同应用和服务。它提供了核心的异步消息链路、消息智能转换、消息路由等功能来保证消息的可靠传输。ESB中的服务者可以使用Web服务消息标准或者JMS Java消息服务。Gartner的分析师认为, ESB将愈加被视为是面向服务架构的一个核心部分。

本文将讨论开源项目ESB ServiceMix ,及其与JBI Java业务集成规范的关系。

版权声明:任何获得Matrix授权的网站,转载时请务必保留以下作者信息和链接
作者:J. Jeffrey Hanson;v_gyc(作者的blog:http://blog.matrix.org.cn/page/v_gyc)
原文:http://www.javaworld.com/javaworld/jw-12-2005/jw-1212-esb.html
Matrix:http://www.matrix.org.cn/resource/article/44/44522_ServiceMix+ESB.html
关键字:ServiceMix;ESB

ESB消息传输的最低要求

作为消息传输系统,一个ESB的最少需求经常被简写为TRANS,定义了作为软件实体的ESB提供的功能:
---Transforms 转换消息格式,针对已注册的服务提供者的需求将消息从一种格式转换到另一种格式。
---Routes 路由消息,将消息传输到已注册的服务,并保证传输的服务质量、服务层的特性。
---Augments扩展信息,在传输的内容中添加额外信息,比如关于消息请求者的元数据。在消息中添加新的通信协议内容以满足服务提供者的需求。
---Notifies通知消息监听者的特定消息请求
---Secures 安全传输,对于传输的消息增加消息认证、授权、不可否认性、机密性等机制。

JBI(Java Business Integration, Java业务集成)介绍

JBI规范及API描述了构建基于插件、基于服务设计的企业级ESB系统的平台。JBI以TRANS需求为基础,基于组件交互和规范化消息(normalized messages)而设计。
JBI是一种规范及API,提供了规范化消息服务、组件框架和管理模型,用以部署路由引擎、规则引擎、以及信息转换等集成服务。基于JBI规范的设计使用特定的基于标准的可插拔架构,此架构内包含一基于 JVM 运行时(runtime)的称为规范化消息路由器(normalized message router,NMR)的组件。

JBI架构的高层组件交互见图1

图1 JBI系统高层架构图

JBI的消息模型基于WSDL,可以很容易地映射到Web服务, HTTP, 电子邮件及JMS中。JBI可以集成旧系统、字节传输、面向文档的传输 (document-oriented transports)以及RPC(Remote Procedure Call, 远程过程调用)等。
图1中的绑定组件(binding components)同面向传输协议的关联方或关联组件通信。图1中的JBI 服务引擎组件(service engine components)提供基于内容的路由、服务整合、规则引擎、信息转换、可定制的信息增强等服务。

规范化消息
JBI系统使用“规范化”消息。消息内包含应用信息荷载、可选的附件、以及用于请求应答双方交互的元数据。消息的规范化过程是将环境相关的信息映射为中立于环境的、抽象的、标准的格式,以便在JBI中传输。所有由规范化消息路由NMR处理的消息都需规范化处理。
规范化消息由如下的三个主要部分构成:
1. 消息内容,亦即荷载,是符合WSDL消息格式的XML文档,不包含针对传输协议或者信息格式的编码。
2. 消息属性,或元数据,是消息携带的额外信息,可以包含安全信息、事务上下文信息、组件特定信息等。消息属性是消息上下文的第一部分。
3. 消息附件,是由消息荷载引用的,包含在一个可以解析处理附件内容的信息处理器内。附件可以是非XML信息。附件是消息上下文的第二部分。

规范化消息路由
JBI系统内消息交换依赖于规范化消息路由NMR在服务者和消费者之间路由消息交换对象(message exchange objects)。针对应用的不同需求以及消息本身特性,NMR提供不同服务质量的消息传输服务。

NMR并不寄宿于任何一个具体的对象中,它被抽象成一套应用程序接口、服务提供者接口、组件接口等。NMR API包括:
---JBI Message API JBI消息接口
---JBI Service API JBI服务接口
---JBI Message Exchange Factory API JBI消息交换对象工厂接口
---Service Description SPI 服务描述接口
---Message Exchange Patterns API 消息交换模式接口
---Endpoint Reference API 端点引用接口

传输通道
JBI传输通道是双向的通信管道,通过NMR传输消息以连接绑定组件和服务引擎。接口javax.jbi.messaging.DeliveryChannel确定服务消费者、服务提供者和NMR三者之间的接口合约关系。
服务使用者通过其传输通道初始化服务调用请求;服务提供者通过其传输通道接受消费者的调用请求。既是使用者又是提供者的组件使用相同的一条传输通道。因此,接口DeliveryChannel的实现必须支持通道实例在多线程下的并发使用。

JBI组件
JBI组件框架提供了可插入的接口,绑定组件和服务引擎可以通过此接口与JBI系统交互。组件框架提供了所有访问JBI服务的接口。
JBI支持二种类型组件,服务引擎和绑定组件。组件可以通过以下二种方式与系统交互:
1. SPIs: 由绑定组件或服务引擎实现的接口。
2. APIs: 系统提供的,绑定组件或服务引擎可以访问的接口

服务引擎
服务引擎是JBI系统内的业务逻辑实现组件,可以作为服务提供者或使用者。服务引擎对服务使用和需求提供整合点。也可以提供诸如信息转换、复杂的路由、以及协调信息等功能。

绑定组件
绑定组件被用来在特定的协议和传输方式中发送和接收消息。通过绑定组件,JBI系统与特定的传输协议解耦。这是通过绑定组件对消息进行相应的协议特定和协议无关的编组(marshalling)和解组(unmarshalling)而实现的,这样JBI环境内仅处理规范化的消息。

规范化消息交换(Normalized message exchange)
JBI首要用途是在组件间路由规范化消息。消息传输时处于规范化形式。
绑定组件必须将特定于协议(传输层)的消息转换为规范化形式。 绑定组件和服务引擎通过传输通道与NMR通信,传输通道提供消息的双向传输机制。

一个JBI系统外服务使用者通过特定协议/传输层发送服务请求到绑定组件。绑定组件转换请求消息为规范化消息,构造一个称为消息交换(message exchange)的消息包, 然后通过传输通道传输到NMR,再由NMR路由到服务提供者。

当所使用的服务引擎或绑定组件收到消息后,创建相应的规范化消息,将此规范化消息填充到一个新的MessageExchange实例中,并传输到目标ServiceEndPoint实例处。服务端点获得消息交换对象后,恢复规范化消息为协议/传输特定格式,然后将消息传输到外部服务提供者。

服务单元
在已安装的引擎或绑定组件中部署的特定于某组件的构件,一般被称为服务单元。服务单元被集成为一个部署文件,称为服务组合。服务组合包含一个部署描述符文件,指定组合中各服务单元的部署方式,如确定将某服务单元部署到那个组件。
服务单元包含内容如下:
---元数据:使用或者生成的服务的JBI描述符
---生成物:一般是XML信息(可能是二进制,或者目标绑定组件或服务引擎需要的任何对象)

ServiceMix 简介

ServiceMix是基于JBI的ESB。它是开源的基于JBI语义和API的ESB和SOA工具包,以Apache许可证方式发布。 它是轻量的ESB实现,易于作为嵌入式ESB使用;集成了对Spring技术的支持;可以在客户端或服务器端运行;可以作为独立的ESB提供者,也可以作为另外ESB的服务组件; 可以在JavaSE或JavaEE服务器中使用;ServiceMix同Apache Geronimo以及JBoss服务器完全集成,并且在Apache Geronimo服务器中可以直接部署JBI组件和服务。

图2 是JBI和ServiceMix关系图


图2 . JBI和ServiceMix

ServiceMix 中包含完整的JBI容器,支持JBI规范的所有功能要求:
---规范化消息服务和路由
---JBI管理Beans (MBeans)
---组件管理和安装的Ant任务
---对JBI部署单元的完全支持,支持JBI组件的热部署

ServiceMix还包含如下的组件和服务:
---Service服务组件
o 通过Drools规则引擎的提供基于规则的路由
o 提供客户端API与JBI组件和服务交互
o Web服务通知(Web Services Notification)协议的实现
o 通过PXE(preboot execution environment, 预启动执行环境)提供对于Web服务BPEL(Business Process Execution Language,业务流程执行语言)的BPEL的支持
o 使用Map缓存或者JCache,支持服务调用缓存
o 支持Java连接架构
o 通过Quartz库集成Timer任务
o 脚本语言支持。任何兼容于JSR-223规范的脚本语言可以用来创建组建,执行信息转换,或者作为表达式语言使用。
o 支持XSLT扩展样式语言转换
o 通过JAXP 1.3 和XML Schema或者RelaxNG提供XML Schema验证支持。
o 通过Oracle的XSQL库支持SQL及XML的XSQL

---SOAP绑定组件
o 通过ActiveSOAP提供基于StAX(XML流处理API)的对SOAP栈的支持
o对基于JAXP的Web服务客户端调用、 服务宿主提供支持,并且支持多种协议方式
o 使用反射支持POJO对象的部署。
o 支持Java SOAP附件API和Apache Axis
o 通过XFire SOAP栈集成POJO对象支持
o 集成Apache WSIF (Web Service Invocation Framework,Web服务调用框架)

---传输绑定
o 通过JavaMail支持Email功能
o 基于文件操作的组件提供将消息写进文件、目录轮询、向JBI发送文件
o 通过Jakarta Commons Net库提供FTP支持
o 支持客户端/服务器端HTTP处理
o 通过 XMPP (Extensible Messaging and Presence protocol,可扩展的消息提供协议)提供与Jabber网络的连接
o 使用ActiveMQ支持JMS功能
o 使用Rome库支持RSS的访问及处理
o 使用Jakarta Commons Net库支持VFS(virtual filesystem switch,虚拟文件系统转换),提供对于文件系统、jar/zip/bzip2临时文件、万维网分布验证及版本机制、Samba文件系统、HTTP、HTTPS、FTP、SFTP等的访问。
大部分的ServiceMix系统初始化过程、活动过程以及消息交换过程,涉及到基于JBI的组件间的通信或交互。 以下部分通过简单的消息交换场景说明这些过程. (ServiceMix 2.0)

初始化JBI容器
使用JBI容器之前,必须调用其init()方法执行初始化过程。此方法会实例化核心系统服务,为JMX管理BEAN服务器以及事务管理器等资源赋值。
代码1是容器启动代码.

代码1. JBI容器初始化
protected JBIContainer jbiContainer = new JBIContainer();
jbiContainer.init();


JBIContainer类的init方法会依次进行如下操作:
---初始化org.servicemix.jbi.management.ManagementContext对象,并在JMX MBean服务器中注册。此对象是JBI管理工具如JMX管理器的调用的首要访问点。
---初始化org.servicemix.jbi.container.EnvironmentContext实例并在JMX MBean服务器中注册。此对象创建资源目录结构,各种资源包括安装文件、部署文件、组件、共享库、服务组合的文件等
---初始化org.servicemix.jbi.framework.Registry实例,此对象维护服务端点和组件等信息。
---初始化org.servicemix.jbi.nmr.Broker实例,此对象管理消息队列,并在org.servicemix.jbi.nmr.flow.Flow对象帮助下分发消息。消息流程对象管理消息代理对象的消息分发策略。
---初始化实现org.servicemix.jbi.framework.FrameworkInstallationService的实例,此对象管理文件包的安装和卸载。
---初始化org.servicemix.jbi.framework.DeploymentService实例,此对象部署服务单元及其相关服务单元。
启动JBI容器

如下面代码2所示,简单的调用JBIContainer对象的start()方法即可触发JBI容器的启动过程。此过程会启动所有嵌入的组件和服务,比如服务注册区、消息代理、管理上下文、环境上下文、安装服务、部署服务等。多数组件和服务的启动过程仅仅设置一个标志位,以表明组件或服务处于运行状态,而且与组件关联的定时计划任务开始执行。

代码2.启动JBI容器
jbiContainer.start(); 


创建支持组件
ServiceMix框架中作为消息生产者和提供者的对象常被称为支持组件。这些对象实现了javax.jbi.component.Component接口,使得JBI容器和其它关联对象能够以标准方式操作它们。在ServiceMix系统中,此类对象一般继承于org.servicemix.components.util包内的某些支持(Support)类,比如ComponentSupport或者PojoSupport。 通过继承,支持组件获得了作为JBI组件的缺省行为,比如JMX功能等。

支持组件一般通过javax.jbi.component.ComponentContext对象获得DeliveryChannel对象,以用于实际的消息交换(message exchange)对象的创建和处理。
请留意代码3中支持组件的类/接口层次。

代码3 支持组件类层次
//PojoSupport类封装了简单的基于POJO的组件,提供标准的被ServiceMix管//理的组件的功能
public abstract class PojoSupport

extends org.servicemix.jbi.management.BaseLifeCycle
implements javax.jbi.component.ComponentLifeCycle
{

}

//ComponentSupport类扩展了PojoSupport类,提供标准JBI组件功能。
public abstract class ComponentSupport
extends org.servicemix.components.util.PojoSupport
implements javax.jbi.component.Component
{

}

// SenderComponent类是消息生产者
public class SenderComponent
extends org.servicemix.components.util.ComponentSupport
implements Sender
{

}
// 类ReceiverComponent是消息消费者
public class ReceiverComponent
extends org.servicemix.components.util.ComponentSupport
implements org.servicemix.MessageExchangeListener, Receiver
{

}


激活支持组件
在使用ServiceMix ESB系统中的组件前,这些组件必须得到“激活”。相应步骤如下:
---创建DeliveryChannel类的实例, 此对象参与随后的消息交换
DeliveryChannel负责:
o 获取路由到此组件的消息
o 发送异步消息
o 发送同步消息

---注册org.servicemix.jbi.framework.ComponentRegistry类的组件,注册后获得一个org.servicemix.jbi.framework.ComponentConnector类的实例,Servicemix 系统在内部使用此ComponentConnector对象来交换消息。

---在组件注册区内注册上面步骤获得的ComponentConnector对象,将此对象与org.servicemix.jbi.container.EnvironmentContext关联。此对象维护组件运行的JBI执行环境,包括安装路径、部署路径、服务单元目录等信息。

---调用组件的生命周期init()方法,然后执行其start()方法。

---封装对象的ComponentConnector实例为一个JMX 管理Bean,并在JBI容器的JMX管理Bean服务器(MBeanServer)中注册此Bean。

激活组件需要与org.servicemix.jbi.container.JBIContainer 类交互,调用其activateComponent()方法。 此方法使用org.servicemix.jbi.container.ActivationSpec类的实例,以此构建有效的JBI组件。ActivationSpec对象是最终可以被激活的三种Java类型中的一种的实例。 对应类型如下:
1.javax.jbi.component.Component
2.javax.jbi.component.ComponentLifeCycle
3.org.servicemix.MessageExchangeListener:此对象实例被封装在org.servicemix.components.util.PojoLifecycleAdaptor或org.servicemix.components.util.PojoLifecycleAdaptor 或org.servicemix.components.util.ComponentAdaptor 类型实例中。比如org.servicemix.components.util.ComponentAdaptorMEListener。

代码4 说明了如何激活消息发送和接收组件。

代码4 激活发送和接收组件
//激活发送组件
String senderComponentID = "sender";
org.servicemix.jbi.container.ActivationSpec senderActivationSpec =
new org.servicemix.jbi.container.ActivationSpec(senderComponentID, sender);
jbiContainer.activateComponent(senderActivationSpec);

//激活接收组件
String receiverComponentID = "receiver";
org.servicemix.jbi.container.ActivationSpec receverActivationSpec =
new org.servicemix.jbi.container.ActivationSpec(receiverComponentID,
receiver)
jbiContainer.activateComponent(receverActivationSpec);


使用支持组件发送以及接收消息
在ServiceMix中发送消息,需要通过发送者支持组件传输此消息,需要消息接收支持组件监听并接收此信息。
典型的发送组件
1.从ComponentContext组件获取javax.jbi.messaging.DeliveryChannel实例
2.从DeliveryChannel实例获取javax.jbi.messaging.MessageExchangeFactory类实例
3.使用MessageExchangeFactory实例创建包含消息内容的javax.jbi.messaging.MessageExchange实例
4.通过DeliveryChannel实例将MessageExchange实例发送到目的地。

代码5中通过发送组件发送基于字符串的XML消息

代码5. 发送消息
public void sendMessage(String xml)
{
try
{
ComponentContext context = getContext();
InOnly exchange =
context.getDeliveryChannel().
createExchangeFactory().createInOnlyExchange();
NormalizedMessage message = exchange.createMessage();
message.setContent(new StringSource(xml));

if (resolver != null)
{
ServiceEndpoint destination =
resolver.resolveEndpoint(getContext(),
exchange,
NullEndpointFilter.getInstance());
exchange.setEndpoint(destination);
}

exchange.setInMessage(message);

// 现在,发送exchange消息
context.getDeliveryChannel().send(exchange);
}
catch (Exception e)
{
e.printStackTrace();
}
}


对特定消息感兴趣的组件可以通过JBI框架提供的多种途径来订阅消息交换对象。一种简单机制是,接收组件可以实现MessageExchangeListener 接口,发送组件设定此接受者为org.servicemix.jbi.resolver.EndpointResolver端点解析组件。这样设定之后,ServiceMix会完成从发送者到接受者的消息传输过程。代码6说明了此过程。

代码6 基于端点解析的简单接收过程
public class ReceiverComponent
extends ComponentSupport
implements MessageExchangeListener, Receiver
{
...

// MessageExchangeListener接口的方法
public void onMessageExchange(MessageExchange exchange)
throws MessagingException
{
NormalizedMessage inMessage = exchange.getMessage("in");
if (inMessage == null)
{
throw new MessagingException("Null in message delivered!");
}
System.out.println(inMessage);
}
}

//创建接收与发送组件,并将接收组件设置为发送组件中的EndpointResolver对象
ReceiverComponent receiver = new ReceiverComponent();
SenderComponent sender = new SenderComponent();
sender.setResolver(new ServiceNameEndpointResolver(ReceiverComponent.QNAME));


图3 是ServiceMix中发送接收简单消息交换的序列图


图3. 发送接受简单消息

在Windows中安装启动ServiceMix
下载并在Windows系统中安装2进制分发包,需如下步骤:
1.从ServiceMix.org下载Windows平台的ServiceMix分发包
2.在目的目录中释放此压缩包。

如下,在Windows命令行窗口中,转到ServiceMix安装目录,
cd [servicemix_install_dir]\bin

替换servicemix_install_dir为ServiceMix的安装目录,如c:\Program Files\servicemix-1.x. 然后敲servicemix命令。

在Unix中安装启动ServiceMix
过程如下:
1.下载ServiceMix unix分发包。转到下载目录,解压gzip文件到目的目录,比如:
gunzip servicemix-x.x.x.tar.gz
tar xvf servicemix-x.x.x.tar

2.如果启动脚本没有执行权限,修改一下bin目录下执行脚本的权限。如果[servicemix_install_dir]是你的安装目录,那么执行如下命令。
cd [servicemix_install_dir]/bin
chmod 755 servicemix

在shell中,转到安装目录[servicemix_isntall_dir],执行启动脚本servicemix,来启动ServiceMix服务。
cd [servicemix_install_dir]/bin.
servicemix

测试安装
如果正确启动,Windows控制台窗口和Unix shell会显示类似如下信息:
INFO JBIContainer -- ServiceMix JBI Container
name: defaultJBI running version: null

终止ServiceMix服务
在Windows窗口或unix shell中敲CTRL-C, 结束Servicemix服务。
如果是Unix后台执行的ServiceMix,可以如下结束相应进程,
ps -ef|grep servicemix
kill PID

替换 PID 为查询获得的实际ServiceMix进程的PID

结论
使用 SOA 架构服务,需要连接不同位置、不同传输协议、不同消息格式的组件或服务的基础设施,ESB企业服务总线满足这些需求。
JBI规范和API定义了范化消息服务、组件框架、管理模型用于构建基于标准的可插拔的ESB系统。ServiceMix是轻量的、基于JBI规范语义和API的、开源ESB和SOA工具包,使用Apache许可证分发。Servicemix可以简单的作为嵌入式或者独立的ESB服务运行。
本文讨论了ServiceMix ESB用于简化构建面向服务的消息基础设施的跨协议消息传输、消息转换、消息安全、服务调用等机制。

作者简介
Jeff Hanson具有20多年软件工业工作经验。其间曾作为Windows Opendoc项目的高级工程师、Novell Route66框架的领导架构师。他是许多文章和书籍的作者。现在是eReinsure.com的总系统架构师,工作包括构建Web服务框架和基于J2EE平台的保险分保系统。

资源
---Matrix:http://www.matrix.org.cn
---下载本文代码:http://www.javaworld.com/javaworld/jw-12-2005/esb/jw-1212-esb.zip
---下载JBI规范:http://www.jcp.org/en/jsr/detail?id=208
---下载ServiceMix:http://servicemix.org/Download
↑返回目录
前一篇: Hibernate初学之可运行的实例(SqlServer版)
后一篇: 把业务流程从操作中剥离出来