集成框架Spring Integration, Mule ESB or Apache Camel比较
Posted xinyuan_java
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了集成框架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支持(代码完成,重构,等等)。
以上是关于集成框架Spring Integration, Mule ESB or Apache Camel比较的主要内容,如果未能解决你的问题,请参考以下文章
什么时候应该使用 Spring Integration 或相关框架?
Spring批量集成:java.lang.ClassCastException:org.springframework.integration.file.FileReadingMessageSourc
Spring Integration 5.1 - 使用 @IntegrationConverter 的集成流转换不起作用