Apache Camel是什么?

1616

我不理解Camel到底是做什么的。

如果你能用101个字简单介绍一下Camel:

  • 它到底是什么?
  • 它如何与使用Java编写的应用程序交互?
  • 它是否需要和服务器一起使用?
  • 它是一个独立的程序吗?

请解释一下Camel是什么。

22个回答

1372

我尝试以更易懂的方式描述这个...

为了理解Apache Camel,你需要先理解企业集成模式是什么。

让我们从我们可能已经知道的开始:单例模式、工厂模式等。它们只是组织问题解决方案的方法,但它们本身并不是解决方案。这些模式是由四人帮在他们出版的书《设计模式》中分析和提取的,他们为我们节省了大量思考如何最佳地构建代码的精力。

与“四人帮”类似,Gregor Hohpe和Bobby Woolf编写了书籍《企业集成模式》(EIP),其中他们提出和记录了一组新的模式和“蓝图”,以最佳设计基于大型组件的系统,其中组件可以在同一进程或不同计算机上运行。
他们基本上建议我们将系统结构化为面向“消息”的方式 - 组件使用消息作为输入和输出相互通信,绝对不使用其他任何东西。他们向我们展示了一套完整的模式,我们可以选择并在我们的不同组件中实现,这些组件将共同形成整个系统。
那么什么是Apache Camel?
Apache Camel为您提供EIP的接口、基础对象、常用实现、调试工具、配置系统和许多其他辅助工具,这将为您节省大量时间,使您能够实现遵循EIP的解决方案。

MVC为例。MVC在理论上非常简单,我们可以在没有任何框架帮助的情况下实现它。但是好的MVC框架为我们提供了准备就绪的结构,并且已经考虑了创建大型MVC项目时需要的所有其他“附加”事项,这就是为什么我们大多数时候使用它们的原因。

这正是Apache Camel用于EIP的目的。它是一个完整的、可投入生产的框架,适用于想要按照EIP实现其解决方案的人们。


207
这可能是这个问题的最佳答案。所有其他答案都与互联网上的其他文章一样令人困惑。 - Abbas Gadhia
27
EIP 是关键。如果你不理解 EIP,就像盲人摸象(骆驼)一样使用 Camel。EIP - http://www.eaipatterns.com/ - hutingung
25
EIP(Enterprise Integration Patterns)是一组已被广泛接受的集成模式,用于解决企业应用程序中的常见集成问题。类似于设计模式如GOF(Gang of Four)和MVC(Model-View-Controller),EIP提供了一种统一的语言和方法来描述和解决各种集成问题。与传统的应用程序开发不同,现代应用程序通常依赖于多个分布式服务和系统。这些服务和系统需要沟通和协调,以共同完成业务流程。 EIP提供了一组标准化的模式,可用于描述和解决这些分布式系统之间的通信和协作问题。使用EIP可以帮助企业更好地管理其IT基础设施,提高代码质量和可维护性,并减少重复工作。使用EIP,企业可以更快地构建、测试和部署新的应用程序和服务,从而实现更快的市场响应速度。总之,EIP是一种强大的工具,可用于解决企业级应用程序中的集成问题,它类似于GOF和MVC等框架和设计模式,提供了一种统一的语言和方法来描述和解决各种集成问题。 - lowLatency
8
这段描述应该被添加到Apache Camel主页上,因为它回答了问题并提供了更多细节。正如他对使用MVC的类比手写或使用“工具”来辅助完成此任务的描述一样,这个回答让我明白了,而不必在无数其他(有用的)链接中搜寻,当只需要这个简洁的答案即可。 - Azkuma
3
一些EIP问题:“多年来有许多库和框架来帮助集成。但是,企业集成模式背后的概念经常被转换为一些复杂的类层次结构或对象,需要精确地连接在一起,原始意图和模式经常会丢失。从那时起,开发人员被迫专注于低级别细节和一些复杂的类库API,失去了更大的局面和模式。” - Quan Nguyen
显示剩余5条评论

788
如果你有5到10分钟的时间,我通常建议人们阅读Jonathan Anstey所撰写的Integration with Apache Camel。这是一篇写得很好的文章,简要介绍了Camel框架的一些概念和概述,并且实现了一个带有代码示例的用例。在其中,Jonathan写道:

Apache Camel是一个开源的Java框架,专注于使集成更易于开发人员使用和接近。它通过提供以下内容来实现:

  • 所有广泛使用的企业集成模式(EIPs)的具体实现
  • 与各种传输和API的连接性
  • 易于使用的领域特定语言(DSL),将EIP和传输连接在一起
此外,《Camel in Action》也提供了一章免费内容,第一章介绍了Camel。Jonathan是我在该书中的合著者之一。请注意,第二版已经出版,您可以在这里找到它。

58
《Camel 实战》这本书非常好,可以帮助初学者了解基础知识,并学习如何使用一些更复杂的 Camel 特性。我强烈推荐!(我与该书或出版社无任何关联) - Matt Aldridge
2
如果想在Mule ESB和Camel之间进行选择,应该如何区分它们以选择其中一个? - kuhajeyan
8
请参阅以下链接,了解与骆驼竞争对手的比较:http://camel.apache.org/articles.html。 - Claus Ibsen
1
当然可以用于连接微服务,毕竟它只是一个小型的Java工具包/框架。《Camel实战第二版》一书中有一整章关于Camel微服务的内容。 - Claus Ibsen
4
"Integration with Apache Camel" 文章中的图片已经无法正常显示。以下是一个存档版本链接,其中图片可以正常浏览:https://web.archive.org/web/20171029104103/https://dzone.com/articles/open-source-integration-apache - Peter V. Mørch
显示剩余4条评论

679

创建一个项目描述不应该很复杂。

我这样说:

Apache Camel是一种消息技术粘合剂,具有路由功能。它将不同来源的消息传输到不同的目标地点,从而连接起始点和终止点。例如:JMS-> JSON,HTTP-> JMS或漏斗形FTP-> JMS,HTTP-> JMS,JSON-> JMS。

维基百科说:

Apache Camel是一种基于规则的路由和中介引擎,它提供了使用API(或声明性Java领域特定语言)配置路由和中介规则的Java对象实现企业集成模式。领域特定语言意味着Apache Camel可以支持您的IDE中使用普通Java代码进行路由规则的类型安全智能完成,而无需大量XML配置文件;但也支持Spring中的XML配置。

明白了吗?这并不难吧?


353
Apache Camel的主页提到了这个帖子...他们没有成功地提供自己产品的简短功能说明。 - youri
17
这篇文章是一个很好的例子,说明建设性批评和诚实努力可以创造出卓越的文档。它被发布在官方骆驼网站上。但让我们保持建设性,避免指名道姓。文档编写者和其他贡献者有时很难得到,他们值得我们的尊重。顺便说一下 - 我们有许多关于Java编程规范的标准...并以自豪和荣誉坚持它...那么对于维基和官方指南这样的媒体,如何制定一个文档化的标准呢? - YoYo
1
它像是一个细粒度的反向代理吗? - Asad Hasan
15
这是我所说的简明扼要的回答。奇怪的是,被接受的答案看起来像一则广告。+1 - EMM
5
现在是2017年,三年来他们所做的就是承认他们自己的描述是虚词汤,并添加了一个链接到这个帖子。他们甚至没有花时间向页面本身添加这个帖子的摘要(或者仅仅复制粘贴一些东西)。我们所得到的只是一个指向Stack Overflow的链接。拜托,你必须停止为这种态度辩护。 - Stijn de Witt
显示剩余2条评论

175

Camel将消息从A发送到B:

enter image description here

为什么需要一个完整的框架?因为您可能会遇到以下情况:

  • 许多发送者和接收者
  • 一打协议(ftphttpjms等)。
  • 许多复杂规则
    • 将消息A仅发送给接收者A和B
    • 将消息B作为XML发送给Receiver C,但部分内容进行翻译,丰富它(添加元数据),并且如果满足条件X,则将其作为CSV也发送给Receiver D。

现在您需要:

  • 在不同协议之间进行转换
  • 粘合组件
  • 定义路由- 将消息发送到何处
  • 在某些情况下对某些内容进行过滤

Camel提供以上功能以及更多:

enter image description here

并且提供了一种酷炫的DSL语言,让您定义何时以及如何进行操作:

  new DefaultCamelContext().addRoutes(new RouteBuilder() {
        public void configure() {
            from("jms:incomingMessages")
                    .choice() // start router rules
                    .when(header("CamelFileName")
                            .endsWith(".xml"))
                    .to("jms:xmlMessages")
                    .when(header("CamelFileName")
                            .endsWith(".csv"))
                    .to("ftp:csvMessages");
}

另请参阅此处此处,以及《Camel实战》(正如其他人所说的那样,这是一本极好的书!)


23
作为一个新手,这一页上唯一让我理解Camel是做什么的答案。谢谢。 - anotherDev

122

简而言之:

当需要连接/集成系统时,你可能需要连接到某些数据源,然后处理这些数据以满足你的业务要求。

为了实现这一点:

1)你可以编写自定义程序来完成它(可能耗时且难以理解、维护),

2)或者,您可以使用 Apache Camel 以标准化的方式完成它(它已经为您开发了大多数连接器,只需设置并插入您的逻辑-称为 Process):

Camel 将帮助你:

  1. 从任何来源/格式获取数据
  2. 处理这些数据
  3. 将数据输出到任何来源/格式

使用 Apache Camel,可以使其他开发人员更容易理解/维护/扩展您的系统。

Apache Camel 是根据企业集成模式开发的。这些模式可以帮助你以良好的方式集成系统 :-)


这意味着其他开发人员也可以用另一种编程语言更改逻辑吗? - JavaTechnical
2
@JavaTechnical,根据消息传递模式(EIP),您已经可以使用不同的编程语言编写不同的组件,因为这些消息采用独立于语言的格式,如JSON。Camel提供了一个简单的框架来实现EIP。这是我理解的基础上,请纠正我如果我错了。 - Dheeraj Bhaskar

62

基于类比的思想,Camel路由可以更好地理解为处于航空公司所有者的角度(例如:美国航空公司、捷特航空)。

你的航空公司的目的是从世界上一个城市‘搭载’‘乘客’到另一个城市。你使用来自不同‘飞机制造商’如波音、空客和HAL的飞机来运输乘客。

你的航空公司会使用始发城市的‘机场’登机乘客,并在目的城市的机场下机。乘客可能会前往多个城市,但无论何时,他们都必须通过机场在你的航空公司的飞机和城市之间旅行。

请注意,离开城市的乘客实质上是进入了你的航空公司的飞机,而抵达城市的乘客则是离开飞机。由于我们身居航空公司的业主角色,因此“到达乘客”和“离开乘客”的术语与我们基于城市视角的常规概念相反。

每个城市使用相同的‘机场’基础设施来为出发和到达的乘客提供服务。机场为出发乘客提供“出发基础设施”,与为到达乘客提供的“到达基础设施”不同。

乘客可以在旅行时借助你的航空公司提供的各种‘便利设施’继续进行日常活动。

除此之外,你的航空公司还提供休息室设施,用于特殊治疗,例如‘了解当地语言’或为‘出行’做准备。

让我们用以下词汇替换上述内容:

你的航空公司:Apache Camel

飞机制造商:传输机制

你的航空公司的飞机:Apache Camel的底层传输机制

搭载:路由

乘客:消息;

城市:系统;

机场:Camel组件;

了解当地语言:类型转换;

出发:产生,已产生

到达:消耗,已消耗

出行:路由

便利设施:提供

替换单词后的内容如下:

Apache Camel的目的是路由从世界上一个‘系统’到另一个‘系统’的‘消息’。Apache Camel使用不同的传输机制进行消息路由。

Apache Camel使用‘基于Camel的组件’从‘from’系统中接收消息,并使用‘to’系统的‘基于Camel的组件’将它们放置。一条消息可以路由到多个系统,但是无论何时,他们都必须通过‘基于Camel的组件’在‘Apache Camel的底层传输机制’和系统之间旅行。

请注意,从系统中“产生”的消息实质上是被消费进入了Apache Camel的底层传输机制中。而被系统消耗的消息实质上是由“Apache Camel的底层传输机制”产生的。

我们试图理解骆驼,因此从骆驼的角度思考。因此,“消费者消息”和“生产者消息”的术语含义与我们基于系统角度的传统概念相反。
“基于Camel组件”的编码基础设施被“生产者消息”和“消费者消息”使用。 "基于Camel组件"为"生产者消息"提供"生产者端点",为"消费者消息"提供"消费者端点"。
当消息被路由时,可以通过Camel处理消息。
在这个路由之上,Camel提供了特殊功能,比如“类型转换”等等...

很棒的解释,易于阅读和记忆。我想知道在Camel中跑道或飞行员有什么作用,如果它们真的存在的话。 - Stimpson Cat
很棒的解释,特别是机场的例子讲得非常好。如果您再添加一些扩展术语和一点代码示例就更好了!谢谢。 - Ankur Nirmalkar

55

在你尝试理解Apache Camel之前,你需要了解企业集成模式的相关知识。该领域并不是每个人都知道的。虽然你可以阅读《企业集成模式》这本书,但更快速熟悉他们的方法是阅读类似于维基百科上企业应用集成 的文章。

当你阅读并理解这个主题后,你会更容易理解Apache Camel的目的。

希望对你有所帮助。


39
如果您了解企业集成模式,Apache Camel是一个实现所有EIP的集成框架。您可以将Camel部署为Web容器中的独立应用程序。如果您需要将几个使用不同协议和技术的应用程序进行集成,您可以使用Camel。

“实现所有EIPs”是不正确的:“因为Camel实现了EIP书中许多设计模式” - Gerold Broser

23

另一个角度的定义:

Apache Camel 是一个集成框架。它由一些Java库组成,可以帮助您在Java平台上实现集成问题。这意味着什么以及与APIs和企业服务总线(ESB)相比如何不同,在我的文章"何时使用Apache Camel"中有描述。


22
什么是Apache Camel? Apache Camel是一个轻量级的集成框架,实现了许多企业集成模式。您可以轻松地集成不同的应用程序。 您可以与HTTP、FTP、JMS、EJB、JPA、RMI、JMX、Netty等多种技术集成。 它如何与使用Java编写的应用程序交互?
Camel使用Java特定领域语言或DSL在各种特定于领域的语言(DSL)中创建企业集成模式或路由。
企业集成模式围绕以下概念展开: 消息、端点、生产者、消费者、路由、总线、转换和处理。 它是否与服务器一起使用?
它作为跨多个企业子系统的桥梁而发挥作用。
它是一个独立的程序吗?
Apache Camel是一个集成框架,用于集成不同的独立应用程序。 Camel的主要优势:您可以通过使用相同的概念来集成不同的应用程序和协议与不同的技术。

我想知道为什么你使用“轻量级”这个词。我的观察是Apache Camel实际上很重。 - Krzysztof Tomaszewski
“实现所有企业集成模式”是不正确的:“因为Camel实现了EIP书中的许多设计模式” - Gerold Broser
我能在Apache Camel中创建一个HTTP端点,以便外部用户能够向该端点发送请求吗?我正在阅读HTTP组件,它说生产者 - 这是什么意思? - variable

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接