Servicemix是一个基于JBI规范的ESB,从Servicemix4开始全面支持OSGI,所谓全面支持是指不仅Servicemix4本身是基于OSGI framework和OSGI Bundle来实现,而且在Servicemix4上跑的应用也是由OSGI Bundle来构成的。而目前有很多J2EE应用服务器本身是基于OSGI来实现,但在这些应用服务器上跑的应用则是传统架构的。
Servicemix(以下我们讨论的Servicemix均指Servicemix4)是由集成了多个开源项目的“综合性”项目,主要包括Karaf、Camel、ActiveMQ等等。
其中Karaf是Servicemix的核心,Karaf是一个OSGI的运行时平台,其它的几个项目都是在Karaf的平台上运行的。实际上,Karaf最初就是从Servicemix项目中,将内核部分分离出来成为一个独立的Apache开源项目的。但Karaf不是一个OSGI framework,它需要真正的OSGI framework(例如Felix、Equinox等)的支撑,才能运作,通过集成这些OSGI framework,Karaf具有OSGI framework的功能,而且在这个提供了:
Logging:日志服务
Console:Shell控制台和Web控制台
Deployer & Provisionning:提供一些必要的运行时支撑库,可支持Bundle的fileinstall、OBR、features等应用热部署功能。
Admin:提供动态配置管理、操作系统集成、Karaf实例管理、Bundle生命周期管理等等管理功能。
JAAS-based Security Framework:基于JAAS的安全认证框架。
Blueprint:对象和服务的依赖注入框架(通过集成Aries Blueprint Container实现)。
... ...
很多直接基于OSGI framework来运行应用的OSGI初学者都因为要实现以上基础功能而感觉入门门槛极高。所以,Karaf实际上是将一些OSGI应用所需的一些基础性的功能实现了,供上层应用使用。它大大降低了运行OSGI应用的入门门槛。
接着就是Camel项目了。Camel是一个强大的集成框架,它是EIP(Enterprise Integration Pattern企业集成模式)的一个具体实现框架。Camel可以支持用基于Java API、blueprint(或spring)、Scala DSL等方式来实现各种传输协议或消息的路由,充当这些协议或消息的交换媒介。说白点,就是负责这些不同的协议和消息之间的转换和路由工作,使两个支持不同协议的组件能够互相通讯,互相调用对方提供的服务,而这些正是ESB实现多系统间集成的核心。
Camel可以支持的协议几乎是无限的,例如:HTTP、CXF based Web Service、CXF based RESTful Web Service、Socket、JMS、FTP、Mail(smtp/pop3/imap)、RMI、SNMP、LDAP... ...。Camel是以URI的方式来统一对各种协议的支持。对每种协议,都开发了相应的Component。在Camel里,Component的概念就相当于一个支持解析和处理一种协议的实例的工厂,它在实际使用时,会产生相应的endpoint,endpoint就是这个解析和处理协议的实例,在Camel里,用URI的方式来代表这个endpoint。所以,我们可以在Camel的应用代码里看到各种各样的URI,例如:
jms:topic:stock-price
mina:tcp://211.122.134.121:8100
pop3://username@210.11.123.25:110
rmi://localhost:3161/ServiceBean?remoteInterfaces=com.p.Service
在JBI规范内,这些endpoint可分成绑定组件BC(Binding Component)和服务引擎SE(Service Engine)。作为
BC的endpoint将协议转换成规格化消息NM(Normalized Message)或者将NM转换成对协议的调用。而SE的endpoint则负责处理NM,必要时产生新的NM。通过NMR(消息路由),SE的endpoint从上一个endpoint处获得NM并处理,还可以产生一个NM给下一个endpoint。
一个可能的应用场景:一套系统A原来是用socket的方式和另一套系统B互联,后来系统B做了升级,只提供了Web service的接口来提供服务,但系统A只能支持socket方式,那么系统A就可以通过socket和Camel-mina component的endpoint连接转成消息(NM),在Camel内再定义SE endpoint从这个消息中整理出调用系统B web service所需的数据,再通过一个Camel-cxf component的endpoint采用web service的方式调用系统B的web service,返回的结果又转成NM,再通过原来的Camel-mina endpoint以socket的方式回应系统A,这个过程是同步的。这样就实现了系统A和系统B的互联。
但在Servicemix4中,由于和OSGI融合得十分好,Servicemix4本身就是一个独立应用的运行时载体。所以ServiceMix4不是一个简单的ESB。所以在Servicemix4中,Camel的bean component是一个重要的角色,我们可以用OSGI bundle作为bean component,来实现我们需要的业务逻辑。这样,Camel就不只是充当异构系统之间互联的角色,而是成为应用本身的一个基础架构。
总而言之,Camel使Servicemix功能得到扩展,而Servicemix和karaf则使Camel变得更加模块化,提升了基于Camel的应用的复用水平。