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

首先,为全面披露信息,在过去的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)与通道连接在一起,并将通道的另一端连接到EIP(如Splitter或Router)。 但是对于要连接的每个组件,您还必须注意所使用的通道是什么,输入是什么,输出是什么。

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

例如,看一下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

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

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

相关文章

blue html中转换,Vue/Vue中Html和Markdown互相转换/README.md · bluemoon/LearningNotes - Gitee.com...

# Vue中Html和Markdown互相转换## 前言最近想实现的一个功能,就是将系统中的博客进行导出成Markdown格式,后面经过了调研发现有两种方法能够满足需求,一个是Java后台中将HTML转换成Markdown, 然后导出。第二种方式是在客户端将Htm…

WePY:在质疑中前进 | 文末福利

WePY 作者介绍 Q: 先介绍一下自己吧~ Gcaufy: 我 2011 年大学毕业之后,阴错阳差的走上了 Web 开发的道路。15 年之前算是自由职业 SOHO 工作,主要给一些国外的大公司做外包系统,更多的是做后端开发。15 年之后以前端工程师的身份加入腾讯&a…

表单必填标星_怎么用JS做form表单验证,要详细代码,求救!(带星号的是必填项)...

匿名用户1级2014-06-17 回答举个例子吧&#xff1a;<input type”text” id”telephone” ><input type“button” οnclick“functioncheck1”value“检测”>如果要检测它是否符合标准&#xff0c;那我就会在页面中导入js包然后写一个<script> f…

MySQL/MariaDB表表达式(3):视图

视图是表表达式的一种&#xff0c;所以它也是虚拟表。对视图操作的时候会通过语句动态的从表中临时获取数据。 1.创建、修改视图 CREATE [OR REPLACE][ALGORITHM {UNDEFINED | MERGE | TEMPTABLE}]VIEW [IF NOT EXISTS] view_name [(column_list)]AS select_statement[WITH [C…

使用Arquillian(包括JPA,EJB,Bean验证和CDI)测试Java EE 6

很长时间以来&#xff0c;我听到很多人对Arquillian说好话 。 虽然我一直在阅读有关其用法的文章&#xff0c;但实际上我无法在一篇文章中找到涵盖我认为重要的某些方面的文章。 当然&#xff0c;我看起来还不够努力。 我要讲的要点是&#xff1a; 使用JPA。 我只是在这里使用…

xpath和css selector

参考&#xff1a;https://www.cnblogs.com/captainmeng/p/7852044.html css selector解释&#xff1a;https://www.cnblogs.com/feng0815/p/8367672.html 转载于:https://www.cnblogs.com/Mezhou/p/9671284.html

android任务书技术要求,毕业设计任务书-Android应用程序开发

* *大学信息工程学院毕业设计(论文)任务书指导教师&#xff1a;*** 职称&#xff1a;讲师学生人数&#xff1a; 3学生姓名(学号、专业)&#xff1a;刘**(200927030111 09信息管理)***(200927030120 09信息管理)李**(200927030107 09信息管理)毕业设计(论文)题目(来源、类型)And…

Event Loop 其实也就这点事

前段时间在网上陆续看了很多关于 Event loop 的文章&#xff0c;看完也就混个眼熟&#xff0c;可能内心深处对这种偏原理的知识有一些抵触心情&#xff0c;看完后也都没有去深入理解。最近在看 Vue 的源码&#xff0c;在读到关于 nextTick 的实现时&#xff0c;总有一种似曾相识…

mock模拟接口测试 vue_在 Vue-CLI 中引入 simple-mock实现简易的 API Mock 接口数据模拟...

在 https://www.jb51.net/article/151520.htm这篇文章中&#xff0c;我们介绍了在 Angular-CLI 中引入 simple-mock 的方法。本文以 Vue-CLI 为例介绍引入 simple-mock 实现前端开发数据模拟的步骤。本质上这里介绍的是在 webpack-dev-server 中配置 simple-mock 实现 API Mock…

Kudu系列: Kudu主键选择策略

每个Kudu 表必须设置Pimary Key(unique), 另外Kudu表不能设置secondary index, 经过实际性能测试, 本文给出了选择Kudu主键的几个策略, 测试结果纠正了我之前的习惯认知. 简单介绍测试场景: 表中有一个unqiue字段Id, 另外还有一个日期维度字段histdate, 有三种设置kudu PK的方法…

OSS网页上传和断点续传(OSS配置篇)

OSS网页上传和断点续传主要根据BrowserJS-SDK和相关文档整理而得&#xff0c;快速构建OSS上传应用 一、Bucket设置 浏览器中直接访问OSS需要开通Bucket的CORS设置 将allowed origins设置成 *将allowed methods设置成 PUT, GET, POST, DELETE, HEAD将allowed headers设置成 *将e…

html vbs 输入框,HTML_vbs实现的下拉框对应键入值,vbs实现的下拉框对应键入值 - phpStudy...

vbs实现的下拉框对应键入值vbs实现的下拉框对应键入值 选择自 gu1dai 的 Blog关键字 vbs实现的下拉框对应键入值select centerbody{text-align:left;font:12px #000080 ;}#main{float:left;width:750px;border:#dddddd 1px solid;margin:5px 10px;padding:10px 5px;}#maintable…

为您的下一个基于Spring的应用程序考虑使用spring-boot的原因!

Spring-boot提供了一种创建基于Spring的应用程序的快速方法。 对于下一个项目&#xff0c;有一些非常令人信服的理由考虑使用Spring-boot&#xff1a; 原因1&#xff1a;使用spring-boot启动程序项目进行更简单的依赖性管理。 考虑使用Spring引导提供数据访问抽象的h2数据库实…

小程序各种姿势实现登录

喜闻乐见的背景时间--由于最近接触小程序比较多&#xff0c;又刚好经历过小程序的自动登录时代以及现在的点击登录时代。结合自己的实践以及观察到其他小程序的做法&#xff0c;就有了这篇小分享~ 本文可能涉及的内容-- 更新 首先感谢shaonialife同学的精彩评论~ 可能由于用词…

c#如何使用反射去创建一个委托_C# 反射的委托创建器

.Net 的反射是个很好很强大的东西&#xff0c;不过它的效率却实在是不给力。已经有很多人针对这个问题讨论过了&#xff0c;包括各种各样的 DynamicMethod 和各种各样的效率测试&#xff0c;不过总的来说解决方案就是利用 Expression Tree、Delegate.CreateDelegate 或者 Emit …

BBS-登录

from django.db import models# Create your models here. from django.contrib.auth.models import AbstractUser#用户 class UserInfo(AbstractUser):nidmodels.AutoField(primary_keyTrue)telephonemodels.CharField(max_length32)avatarmodels.FileField(upload_toavatar/,…

html 输入框从左上角,在输入框的左上角,使文本开始_input_开发99编程知识库

網頁上有幾個輸入框&#xff0c;我希望文本從左上角開始。 目前&#xff0c;使用 below&#xff0c;它的左對齊&#xff0c;但在框的中間。 我嘗試了垂直對齊和其他的東西&#xff0c;但沒有。 我不想使用 padding&#xff0c;因為文本需要包圍&#xff0c;它只能使它彈出框頂部…

PHP定时任务Crontab结合CLI模式详解

从版本 4.3.0 开始&#xff0c;PHP 提供了一种新类型的 CLI SAPI&#xff08;Server Application Programming Interface&#xff0c;服务端应用编程端口&#xff09;支持&#xff0c;名为 CLI&#xff0c;意为 Command Line Interface&#xff0c;即命令行接口。 STDIN 标准输…

使用Mockito和BeanPostProcessors在Spring注入测试双打

我非常确定&#xff0c;如果您曾经使用过Spring并且熟悉单元测试&#xff0c;那么您会遇到与您不想修改的Spring应用程序上下文中注入模拟/间谍&#xff08;测试双打&#xff09;有关的问题。 本文介绍了一种使用Spring组件解决此问题的方法。 项目结构 让我们从项目结构开始&…

当面试官问你如何进行性能优化时,你该这么回答(一)

背景 在开发好页面后&#xff0c;如何让页面更快更好的运行&#xff0c;是区分一个程序猿技术水平和视野的一个重要指标。所以面试时&#xff0c;面试官总会问你一个问题&#xff0c;如何进行性能优化呢&#xff1f; 如果你这时是头脑一片空白&#xff0c;或是像之前的我一样…