apache camel_轻量级的开源集成:Apache Camel还是Spring集成?

apache camel

首先,为全面披露信息,在过去的1.5年中, 我一直担任 FuseSource(现为Red Hat) 的顾问,为零售,运输,银行/金融等不同行业的大型和小型公司提供SOA和集成项目支持。我的专长是使用该领域的一些最佳开源项目来设计具有高可伸缩性和吞吐量要求的解决方案: Apache ActiveMQ , Apache Camel , Apache ServiceMix , Apache CXF等。

我是Apache Camel的DZone Refcardz的作者之一,题为“ Apache Camel Essential Components” ,也是同一标题的网络广播的发言人。 我还是Packt Publishing即将出版的有关Apache Camel的书的技术审稿人,我希望很快能公开发布该书。

不用说,我已经使用Apache Camel做过一些工作,对此我做出了贡献,并鼓励人们进行检查。

但是在开始使用FuseSource之前,我曾与其他中间件集成项目打过交道-一些开源,一些商业,但是我第一次尝试轻量级开源集成项目并不是使用Apache Camel。

我在2009年偶然发现了Spring Integration ,非常喜欢它。

我写了有关Spring Integration的博客 ,对用户论坛做出了贡献,对bug修复和示例做出了贡献等,在社区中保持了一些活跃。 我非常尊重Mark,Oleg,Gary,Gunnar等。 等 在Spring Integration上所做的出色工作。

placeholder_video_spring_projects 我喜欢它如何扩展Spring以及它如何紧密实施由Gregor Hohpe和Bobby Wolf分类的Enterprise Integration Pattens 。 那时我在几个项目上使用过它,我坚信除非您将它用于实际项目上以解决实际问题,否则您对项目没有真正的感觉。 但是,由于我有机会足够深入地使用了这两个项目,因此我想为Blogo贡献我的观察和见解

首先,有很多文章比较了两个项目。 有些关注统计数据,例如社区活动或组件数量。 尽管在某种程度上相关,但我想更深入一点。 因此,以下博客文章是对Apache Camel和Spring Integration的想法 ,以及(破坏者警报!)为什么我会选择Camel作为集成项目。

抽象,抽象,抽象

这两个项目旨在满足类似的需求:轻量级的集成库,具有EIP的完整实现,用于中介和路由,以及在常用技术之上提供抽象以与外部系统接口。 一些常见的技术包括Web服务(SOAP / REST),JMS或异步消息传递,基于文件的批处理系统,TCP套接字,FTP / SFTP,RDBMS等。 基本上,只要两个异构系统需要同步或异步进行交互并交换数据,轻型集成库就可以为您提供极大的帮助。 对于那些问“不是ESB做什么的人?” ..恩……有点……但是我可以再写一次。

对于我们这些集成系统的人来说,我们很快就发现了有关集成的两件事。 #1不性感,#2很难。
了解系统在技术和语义上的差异以及如何将其用于实现业务功能至关重要。 您最终编写的代码应专注于这些业务问题,并应尽可能利用现有的商品组件。 编写代码以与文件系统交互或将消息发送到队列绝对被认为是商品代码,只是增加了必须维护的代码库。 如果您手动/滚动自己编写代码,那么您还承担将错误引入对业务逻辑或业务语义不是至关重要的区域的风险。 以我的拙见,这是不必要的风险。

这样便可以使用Apache Camel或Spring Integration。它们通过提供对社区审核过的商品组件的访问以及实现常见的EIP(如转换,路由,过滤,拆分/聚合等)来帮助简化集成项目。再次..由社区审查。 如果您手动编写这些代码,祝您好运。 当然可以做到,人们一直都在这样做,但这对大多数项目来说都是不必要的风险。

我在哪里

是的,因此您可以将这两个项目中的任何一个视为特定技术之上的“抽象”。 这个抽象概念使您可以专注于“集成应该做什么”。 为了解决这个问题,我相信Apache Camel很有意思。

领域特定语言

集成要比编写的要经常得多..与代码相同。 因此,就像您渴望编写带有短函数,描述性变量,适当级别的数据隐藏等的精美代码一样,集成项目的编码也是如此,但将其带入了一个新的高度。 您想要对其进行编码,以便您可以阅读并理解它。 尽管使用了集成代码,即使您的代码编写得井井有条,“正在集成的内容”的全部含义和意图最终仍会丢失在成堆的代码中。 您可以利用集成抽象库,但是就上述目的而言,它们与它们一样好,但您想要的是清楚地回答“正在集成什么”。

Apache Camel提出了一种领域特定语言 ,我相信这是两个项目之间的重要区别。 使用DSL,即使面对中等到复杂的集成,其他项目也开始不清楚,您可以非常简洁地表达“正在集成的内容”。 Apache Camel 以Java(我最喜欢的),Spring XML,Scala,Blueprint-OSGI,Groovy ..以及其价值(甚至是Kotlin)提供DSL。

使用DSL,您可以使用“ from”,“ split”,“ choice”和“ to”之类的结构来构建集成“ Routes”。 这些使您可以用通用语言指定“集成正在做什么”。

当我使用Spring Integration时,他们没有DSL。 您使用Spring XML直接处理了通道和组件(管道和过滤器),而通道是主要的抽象。 他们当时在Scala DSL上工作,但是尽管我很喜欢Scala,但它仍然没有得到广泛使用,因此出于在通用语言或XML集成项目中使用它的目的,没有太多选择。 基本上,您将端点(如jms-gateway或http-gateway)与通道连接在一起,并将通道的另一端连接到诸如Splitter或Router的EIP。 但是对于要连接的每个组件,您还必须注意使用哪个Channel的输入是什么,以及它具有什么输出。

一旦您的项目开始发展,您就会发现通道对象激增。 最终稀释了集成的含义。

例如,看一下Cafe Spring Integration Example 。 这个例子并不复杂,但是它说明了我遇到的问题。 想象一下在许多Spring上下文文件中拆分通道和组件,您会看到它如何变得非常混乱。

这是使用Apache Camel实现完全相同的示例的方法:

当然,我不希望人们能够在不了解或未使用各个库的情况下准确掌握每个示例的操作,但是毫无疑问,我发现阅读以骆驼式DSL表示的富有表现力的DSL更容易。与尝试解释所有通道的SI路径/流量。 这使我更接近“此集成的功能”,而不会为细节所困扰。

测试中

编写集成流程的另一个非常重要的部分是测试。 我不会像往常一样大声疾呼,如果不测试代码,你会是个傻瓜,但是即使不测试集成,也会加倍。 他们所能达到的复杂程度以及所涉及的调解,都需要验证其是否有效!!

当时,Spring Integration没有专门用于测试路由的良好实践。 大概是因为他们已经有一个针对Spring本身的通用测试框架 。 您可以肯定地做到这一点,因为我们都习惯于使用Spring编写单元测试或集成测试,并使用EasyMock或Mockito模拟合作者 ,对吗? 而且,如果您需要任何其他功能,则必须自己构建它们。

但是,有了Apache Camel,就可以立即使用丰富的测试支持,并且可以很容易地使用它来鼓励测试您的路线。 Camel的测试框架建立在Spring Test的某些功能之上,因此最终成为两全其美。 例如,您可以模拟会影响实时系统的路由部分,并专注于路由和中介功能。 您可以像使用Mockito一样设置期望和断言行为,但是它内置在库中并添加了其他功能。 我的同事David Valeri拥有出色的测试和调试博客,以及他在CamelOne上的演讲

例如,在以下代码段中,我们可以断言在5000ms的时间内在模拟端点上收到了两条消息:

您甚至可以通过应用AOP建议来模拟实时端点,如下所示:

除了模拟组件之外,如果您在执行OSGI时无需部署到容器,您还可以获得协助测试Blueprint XML的功能,您可以使用DataSet组件进行浸泡测试或压力测试,以及许多其他复杂的测试场景。

查看这些链接以获取更多信息:

  • 端点测试:数据集
  • 端点测试:模拟
  • 端点测试:测试
  • 淘汰实时技术
  • 骆驼测试
  • 骆驼弹簧测试
  • 蓝图测试

社区

最后,但同样重要的是,我想指出的是,Apache Camel拥有一个充满活力的多元社区,由来自世界各地的不同公司的不同项目的参与者组成。 在写到邮件列表或提交JIRA之后,几分钟之内就能收到回复并不罕见。 您可能希望在非营利性的核心开源基金会(如Apache Software Foundation )中找到相同的生态系统,而在其他项目中却不会完全一样。

我当然不是说Spring Integration论坛和JIRA并不活跃,但是我认为Apache Camel项目中非项目或公司(VMWare / SpringSource)人员的活动更多。 在我看来,这倾向于培养更多的创造力,更多的外部人做出贡献并使项目变得更好等,这是开源和开放社区发展的核心。 当然会有更多的争论,但最终结果是非常积极的。

在有关Spring Integration与Camel的其他一些文章中,作者指出Camel比Spring Integration具有更多的组件。 这里有一个更大的连接选项方面的观点,但我认为更重要的一点是,其中许多是由非核心的Camel开发人员贡献的。 另外,您可以尝试在github上进行快速搜索,您会发现人们编写的Camel组件甚至还没有带到Apache社区,但是您仍然可以利用。

您应该使用哪一个?

因此,我在这里几乎永无止境的散文中发表了自己的见解。.但我鼓励您检查两个项目并自己决定。 其他人将有不同的经验和意见,并且在一定程度上将在决定下一个集成项目中使用哪个方面起很大作用。

以上是我的观点。 但是,如果我遗漏了某些内容或歪曲了某些内容,请发表评论并纠正我!

参考: 轻量级的开源集成:Apache Camel还是Spring集成? 由我们的JCG合作伙伴 Christian Posta在Christian Posta –软件博客博客中获得。

翻译自: https://www.javacodegeeks.com/2013/10/light-weight-open-source-integration-apache-camel-or-spring-integration.html

apache camel

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/346459.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

科尔达服务101

我今天想写一篇简短的要点文章。 我真的很好奇我能多快出版此书。 所以走吧 这篇文章是关于Corda Services(使用Corda 3.2版)的。 这些是什么? 作为经常使用Spring的开发人员,我个人会说它们就像Beans。 Spring Beans可以做的还很…

intent隐式和显式_Neo4j:使隐式关系成为显式和双向关系

intent隐式和显式我最近阅读了Michal Bachman关于 Neo4j中双向关系的文章 ,他建议对于某些关系类型,我们对关系的方向不那么感兴趣,因此可以在查询时忽略它。 他使用以下示例显示Neo Technology和GraphAware之间的合作关系: 两家…

mysql读写分离 存储过程_基于maxscale的读写分离部署笔记

使用maxscale搭建的读写分离架构,后期还可以再结合MHA做master的故障转移,这样业务层面上不需要做任何的改动即可。基于connect方式的不要使用。从库延迟他还会继续分发请求过去,暂时不适合生产使用。实验演示:目前的主从结构&…

python读书笔记2000_流畅的Python读书笔记

特殊方法的存在是为了Python解释器调用的,你自己并不需要去调用他们,比如说my_object.len()这种写法是没有的,应该使用len(my_object)。在使用len(my_object)的时候,如果my_object是一个自定义类的对象,那么Python会自…

antd 3升级命令_是时候拥有一个你自己的命令行工具了

本篇博客主要介绍了如何使用commander, inquirer以及chalk从零开始,创建属于自己的命令行工具。0. 一分钟体验首先我们先花一分钟的时间,体验一下创建自己的命令行cli工具是什么感觉。0.1. 新建项目目录假如我们的项目名称叫hello-cli,使用如…

找不到要去的声明_老汉将行李袋交由他人看管 去了一趟卫生间找不到人了.........

春节走亲访友难免多喝两杯,但酒后乘车却容易造成财物遗失。目前正值春运返程高峰,从沧州女儿家返程回山东老家的蔡先生就因为中午多喝了几杯酒,便将装有12000元生活费的行李袋弄丢了。好在沧州火车站派出所民警最终将蔡先生的失物找回&#x…

java可视化压缩_web可视化技术发展(1/6)

EverCraft一直在关注Web可视化技术的发展,在本系列文章里,小编将对国外一篇感觉很不错的综述性文章进行翻译,供这一领域的爱好者相互学习。这篇paper的信息为:“Mwalongo, F., et al., State-of-the-Art Report in Web-based Visu…

屏幕坏点检测图片_电视屏幕出现坏点?行家会这样做!

液晶电视经常会有几个亮点或暗点,这些通常被称为电视坏点。作为强迫症患者,面对这些屏幕坏点我们应该怎么做?下面跟小智聊聊这个问题吧!首先,坏点形成的原因首先是因为液晶屏幕由很多点组成,每个点由RGB三原…

Java:GraalVM数据库流性能

GraalVM是JVM块的新成员。 它是一个开源虚拟机,能够同时运行多种编程语言,例如Java,Rust和JavaScript。 GraalVM还有一个新的内部代码优化器管道,在某些情况下,与其他JVM相比,它可以显着提高性能。 了解如何…

kubelet启动失败_kubelet 架构浅析

一、概要kubelet 是运行在每个节点上的主要的“节点代理”,每个节点都会启动 kubelet进程,用来处理 Master 节点下发到本节点的任务,按照 PodSpec 描述来管理Pod 和其中的容器(PodSpec 是用来描述一个 pod 的 YAML 或者 JSON 对象…

shell 提取sql 的字段名表名_SQL代码风格规范

作为新时代SQL Boy,大部分时间都是在写sql,很多时候看到别人写的代码实在是不规范,命名随便写,没有缩进,看起来很没有逻辑性,今天分享下我自己的一些规范,从这里修改而来。--名称:xx…

亚马逊ec2 实例删除_亚马逊免费使用套餐:在EC2 Linux实例上安装Tomcat 7

亚马逊ec2 实例删除Amazon Web Services提供了12个月的免费使用期限,使开发人员可以在云中运行任何他们想要的东西。 免费层包括14个服务,其中Web开发人员最关注EC2服务。 EC2是一项服务,通过停止和启动Windows和/或Linux的虚拟实例来提供可调…

使用混合多云每个人都应避免的3个陷阱(第4部分)

每天都在肆意宣传云,但每个人都应避免三个陷阱。 从云,混合云到混合多云,您被告知这是确保业务数字化未来的一种方式。 您必须做出的这些选择不会排除提高客户体验和敏捷交付这些应用程序的日常工作。 让我们开始一段旅程,仔细研…

Java,JavaFX的流畅设计风格拨动开关

嗨,这次我将在新版本的JMetro中讨论新的Toggle Switch样式。 拨动开关是一种近年来变得非常流行的控件。 我前一段时间在ControlsFX库中添加了JavaFX实现。 刚刚发布的JMetro版本4.1中提供了此新样式。 什么是拨动开关 在以前的文章中,我谈到了切换开…

python解析多层嵌套json_Python爬虫解析多个嵌套JSON,多级,json

Python爬虫解析多级嵌套json最近刚接触Python爬虫,正好最近肺炎在全国蔓延,所以准备从网站爬取肺炎实时数据,并解析自己想要的数据。获取json数据网址为 https://m.look.360.cn/events/feiyan爬取网址:def main():urlhttps://m.lo…

如何使用vps 异地组网_使用ZEROTIER异地组建内网(局域网)

一、注册账号(该网站打开比较慢,但并不影响组网后的网速)二、建立虚拟局域网网(获取Network ID)1.选择菜单栏的Networks菜单2.选择创建网络3.注意获取到的Network ID(需要在每台组网的电脑上加入这个network id)4.大部分设置默认就可以了.三、下载软件点菜单中的Dow…

编写一个watchdog.sh脚本_五大原因!为何要将Jupyter Notebook转换为python脚本?

全文共3360字,预计学习时长9分钟图源:unsplash大多数数据科学在线课程都把Jupyter Notebook作为教学媒介,这是因为初学者在Jupyter Notebook的单元格中编写代码,比编写包含类和函数的脚本更容易。另一个原因在于它使浏览和绘制数据…

java 多线程 总结_Java 多线程总结

昨天熬了个通宵,看了一晚上的视频,把java 的多线程相关技术重新复习了一遍,下面对学习过程中遇到的知识点进行下总结。首先我们先来了解一下进程、线程、并发执行的概念:进程是指:一个内存中运行的应用程序&#xff0c…

基本服务-使用大使网关

这是我对Knative服务进行实验的延续,这次是围绕在Knative服务应用程序之上构建网关。 这是基于我之前的两篇文章- 使用Knative部署Spring Boot App以及在Knative中进行服务到服务的调用 。 为什么在Knative应用程序之上使用网关 为了解释这一点,让我谈谈…

mysql function 表名作为参数_mysql 常用的分组聚合函数

mysql 常用的分组聚合函数1.聚合运算一般情况下,需要的聚合数据(和,平均值,最大,最小等)并不总是存储在表中,但是可以执行存储数据的计算来获取它.根据定义,聚合函数对一组值执行计算并返回单个值.MySQL提供了许多聚合函数,包括AVG,COUNT,SUM,MIN,MAX等.除COUNT函数外,其它聚合…