SOA专题

集成框架Spring Integration, Mule ESB or Apache Camel比较

   Spring Integration, Mule ESB 和 Apache Camel(FuseSource (http://fusesource.com) and Talend (http://www.talend.com))都实现了著名的企业整合模式 Enteprise Integration Patterns ( EIP , http://www.eaipatterns.com ),提供了一个标准化的集成应用程序的领域特定语言。

  这三个框架有很多相似之处。都实现了EIPs 提供了一致的模型和消息传递架构,不管你要使用哪种技术,都是以同样的方式实现集成,即语法相同,相同的API ,同样的自动测试。唯一的区别是每个端点的配置不一样(例如JMS需要队列名称,而JDBC需要数据库连接URL)。Camel 的路由等于Mule flows“, Camel 组件等同于Spring Integration.的„adapters。

  与重量级ESB不同,它们都是轻量框架,你只需要一些库添加到类路径中。可以在JVM环境中到处使用每个框架。无论您的项目是Java SE独立的应用程序,或者如果您想将它部署到Web容器(例如Tomcat), JEE应用服务器(如Glassfis的) , OSGi容器或云端。

  如果你掌握这些框架中的一个,你就很容易学习另外一个,因为它们有相同的概念和其他许多相似之处。接下来,让我们讨论他们之间的差别,以便能够决定什么时候使用哪一个。两个最重要的差异是支持的技术的数量和所使用的DSL。

Spring Integration

  Spring集成只提供了技术非常基础的支持 - 只是“基本的东西”,如文件,FTP,JMS,TCP,HTTP或Web服务(Spring各种集成源码案例见这里)。骡子Mule和Apache骆驼Camel则提供了很多很多的进一步组件!集成是通过编写大量的XML代码(没有一个真正的DSL)实现的:

<file:inbound-channel-adapter
            id=”incomingOrders”
            directory=”file:incomingOrders”/>

<payload-type-router input-channel=”incomingOrders”>
            <mapping type=”com.kw.DvdOrder” channel=”dvdOrders” />
            <mapping type=”com.kw.VideogameOrder”
                                channel=”videogameOrders” />
            <mapping type=”com.kw.OtherOrder” channel=”otherOrders” />

</payload-type-router>

<file:outbound-channel-adapter
               id=”dvdOrders”
               directory=”dvdOrders”/>

<jms:outbound-channel-adapter
               id=”videogamesOrders”
               destination=”videogameOrdersQueue”
               channel=”videogamesOrders”/>

<logging-channel-adapter id=”otherOrders” level=”INFO”/>

  当然还可以使用Java代码的注释,但最终,你需要很多的XML。很多人不喜欢太多的XML声明。对于简单的东西配置是好的(例如JMS连接工厂),但不适用于复杂的集成逻辑。至少,它应该是具有更好的可读性是DSL,但更复杂的Spring集成的例子是非常艰难的阅读。
  此外,可视化设计器Eclipse(称为集成图形)是好的,但不如和直观的竞争对手。因此,如果是基于现有Spring项目,只需添加一些只要求“基础技术”,如文件,FTP,JMS或JDBC集成逻辑时,使用Spring集成框架。

  

Mule ESB

  Mule骡子ESB是 - 顾名思义 - 它不是仅仅一个集成框架,而是一个包括一些额外功能的完整ESB,(你可以将其和基于Apache骆驼的ESB:Apache ServiceMix相比较。骡子只是一个轻量级的集成框架,除了EIP集成以外 没有添加任何附加功能。相比Spring集成,骡子只有提供了一个XML的DSL。至少,这比Spring集成很容易理解。骡子的Studio提供了一个很好的和直观的可视化设计。从上面下面的代码片段比较Spring集成代码。比Spring集成它更像是一个DSL。这一点很重要,如果集成逻辑比较复杂。

<flow name=”muleFlow”>
        <file:inbound-endpoint path=”incomingOrders”/>
        <choice>
            <when expression=”payload instanceof com.kw.DvdOrder”
                         evaluator=”groovy”>
                        <file:outbound-endpoint path=”incoming/dvdOrders”/>
            </when>
            <when expression=”payload instanceof com.kw.DvdOrder”
                          evaluator=”groovy”>
                          <jms:outbound-endpoint
                          queue=”videogameOrdersQueue”/>
            </when>
            <otherwise>
                                <logger level=”INFO”/>
            </otherwise>
        </choice>
</flow>

骡子的主要优点是提供一些非常有趣的连接器:SAP, Tibco Rendevous, Oracle Siebel CRM, Paypal 或 IBM’s CICS Transaction Gateway。.如果你的集成项目需要一些这些接口,那么可能会选择骡子。

Apache Camel

  Apache Camel几乎和骡子相同。你能想到的几乎每一个技术,提供很多很多的组件(比骡子甚至更多)。如果没有可用的组件,你可以很容易地创建自己的组件,使用Maven原型!如果你是一个Spring跟随者:骆驼和Spring集成一样棒。

<route>
        <from uri=”file:incomingOrders”/>
        <choice>
            <when>
                <simple>${in.header.type} is ‘com.kw.DvdOrder’</simple>
                            <to uri=”file:incoming/dvdOrders”/>
            </when>
            <when>
                <simple>${in.header.type} is ‘com.kw.VideogameOrder’
               </simple>
                            <to uri=”jms:videogameOrdersQueue”/>
            </when>
            <otherwise>
                <to uri=”log:OtherOrders”/>
            </otherwise>
        </choice>
    </route>

  可读性比Spring集成更好,和骡子Mule几乎是相同的。此外,有一个不错的(但是商业的)可视化设计器称,Fuse IDE, FuseSource提供 - 生成XML的DSL代码。然而,不管你使用一个可视化设计器,或只是XML编辑器,这将是一个很大的XML,。

  另一个真棒功能:Apache的骆驼还提供用Java,Groovy和Scala编写的DSL。你不必写了这么多丑陋的XML。就个人而言,我更喜欢使用这些流利的DSL不是XML的一个集成逻辑。我只是做配置的东西,如JMS连接工厂或使用XML的JDBC属性。在这里,您可以使用Java的DSL代码片段中看到同样的例子:

from(“file:incomingOrders “)
       .choice()
                .when(body().isInstanceOf(com.kw.DvdOrder.class))
                                .to(“file:incoming/dvdOrders”)
                .when(body().isInstanceOf(com.kw.VideogameOrder.class))
                                .to(“jms:videogameOrdersQueue “)
                .otherwise()
                                .to(“mock:OtherOrders “);

 

流利编程的DSL是非常容易阅读(甚至在更复杂的例子)。此外,这些编程的DSL比XML有更好的IDE支持(代码完成,重构,等等)。

SOA之企业应用集成EAI

什么时候使用Apache camel

使用Apache CXF开发Web服务

使用Spring Webservices建立SOAP服务代理