我不明白骆驼到底是做什么的。
如果你能用 101 个字来介绍一下 Camel:
- 它到底是什么?
- 它如何与用 Java 编写的应用程序交互?
- 它与服务器一起使用吗?
- 它是一个独立的程序吗?
请解释骆驼是什么。
我不明白骆驼到底是做什么的。
如果你能用 101 个字来介绍一下 Camel:
请解释骆驼是什么。
我用一种更容易理解的方式来描述这一点......
为了了解 Apache Camel 是什么,您需要了解什么是企业集成模式。
让我们从我们大概已经知道的开始:单例模式、工厂模式等;它们只是组织解决问题的方法,但它们本身并不是解决方案。这些模式是由四人帮在出版他们的书《设计模式》时为我们其他人分析和提取的。他们为我们中的一些人节省了巨大的精力来思考如何最好地构建我们的代码。
就像四人组一样,Gregor Hohpe 和 Bobby Woolf 撰写了《企业集成模式(EIP)》一书,他们在其中提出并记录了一组新模式和蓝图,以说明我们如何最好地设计大型基于组件的系统,其中组件可以在在同一进程或不同机器上运行。
他们基本上建议我们将我们的系统构建为面向消息的——组件之间使用消息作为输入和输出进行通信,而绝非其他任何东西。它们向我们展示了一套完整的模式,我们可以从中选择并在我们的不同组件中实施,这些组件将共同构成整个系统。
那么什么是 Apache Camel?
Apache Camel 为您提供 EIP 的接口、基础对象、常用的实现、调试工具、配置系统和许多其他帮助程序,当您想要实现遵循 EIP 的解决方案时,这将为您节省大量时间。
以MVC为例。MVC 在理论上非常简单,我们可以在没有任何框架帮助的情况下实现它。但是好的 MVC 框架为我们提供了即用型的结构,并且在创建大型 MVC 项目时已经考虑到了您需要的所有其他“侧面”事物,这就是我们大部分时间使用它们的原因。
这正是 Apache Camel 对 EIP 的作用。对于想要实施其解决方案以遵循 EIP 的人们来说,这是一个完整的生产就绪框架。
如果您有 5 到 10 分钟的时间,我通常建议人们阅读Jonathan Anstey 的这篇与 Apache Camel 的集成。这是一篇写得很好的文章,简要介绍和概述了 Camel 的一些概念,并通过代码示例实现了一个用例。乔纳森在其中写道:
Apache Camel 是一个开源 Java 框架,专注于使开发人员更容易和更容易地进行集成。它通过提供:
- 所有广泛使用的企业集成模式(EIP)的具体实现
- 连接到各种各样的传输和 API
- 易于使用领域特定语言 (DSL) 将 EIP 和传输连接在一起
还有一个免费的Camel in Action章节(Camel in Action, 2nd ed. is here)在第一章介绍了 Camel。乔纳森是我和那本书的合著者。
创建项目描述不应该很复杂。
我说:
Apache Camel 是与路由的消息传递技术粘合剂。它将消息传递起点和终点连接在一起,允许将消息从不同来源传输到不同目的地。例如:JMS -> JSON、HTTP -> JMS 或漏斗 FTP -> JMS、HTTP -> JMS、JSON -> JMS
维基百科说:
Apache Camel 是一个基于规则的路由和中介引擎,它使用 API(或声明性 Java 领域特定语言)提供基于 Java 对象的企业集成模式实现来配置路由和中介规则。特定领域的语言意味着 Apache Camel 可以在您的 IDE 中使用常规 Java 代码支持类型安全的路由规则智能完成,而无需大量的 XML 配置文件;虽然也支持 Spring 中的 XML 配置。
看?那不难吧?
Camel 从 A 向 B 发送消息:
为什么要为此设计一个完整的框架?好吧,如果你有:
ftp
, http
,jms
等)所以现在你需要:
Camel 为您提供了上述(以及更多)开箱即用的功能:
使用很酷的 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");
}
简而言之:
当需要连接/集成系统时,您可能需要连接到某个数据源,然后处理这些数据以匹配您的业务需求。
为了做到这一点:
1)您可以开发可以做到的自定义程序(可能很耗时且难以理解,为其他开发人员维护)
2) 或者,您可以使用 Apache Camel 以标准化方式执行此操作(它已经为您开发了大部分连接器,您只需要设置它并插入您的逻辑 - 称为流程):
骆驼将帮助您:
通过使用 Apache Camel,您将很容易理解/维护/将您的系统扩展到其他开发人员。
Apache Camel 是使用企业集成模式开发的。这些模式可以帮助您以一种好的方式集成系统:-)
基于类比
通过将自己置于航空公司所有者(例如:美国航空公司、捷特航空公司)的立场,可以很容易地理解基于骆驼的路线。
“您的航空公司”的目的是将“乘客”从一个“城市”“运送”到世界上的另一个“城市”。您使用来自不同“飞机公司”(如波音、空中客车、HAL)的飞机运送乘客。
您的航空公司使用出发城市的“机场”让乘客登机,并使用目的地城市的机场让他们下机。乘客可能“旅行”到多个城市,但他们必须经过机场才能在您航空公司的飞机和城市之间旅行。
请注意,从城市“离开”的乘客本质上是“到达”您航空公司的飞机。一名乘客“抵达”城市,实质上是离开飞机。由于我们站在航空公司所有者的立场上,因此“到达旅客”和“出发旅客”一词与我们基于城市视角的传统概念相反。
“出发”乘客和“到达”乘客使用每个城市的相同“机场”基础设施。机场为离境旅客提供“离境基础设施”,这与为到达旅客提供的“到达基础设施”不同。
由于您的航空公司在飞机内提供的各种“便利设施”,乘客可以在旅行时继续他们的活动。
最重要的是,您的航空公司还为“了解当地语言”等特殊待遇提供休息室设施,或者为您准备“旅行”。
让我们将上面使用的几个单词/短语替换为以下内容:
您的航空公司:阿帕奇骆驼
飞机公司:运输机制
您航空公司的飞机:Apache Camel 的底层运输机制
携带:路线
乘客:消息;
城市:系统;
机场:骆驼组件;
理解当地语言:类型转换;
离开:生产,生产
到达:消费,消费
行程:路线
设施:提供
替换单词后,您会得到以下内容:
“Apache Camel”的目的是将“消息”从一个“系统”路由到世界上的另一个系统。Apache camel 使用不同的传输机制进行消息路由。
Apache Camel 使用“from”系统的“Camel based Component”获取消息,并使用“to”系统的“Camel based Component”删除它们。一条消息可能会路由到多个系统,但它们必须通过“基于骆驼的组件”在“Apache Camel 的底层传输机制”和系统之间传播。
请注意,从系统“产生”的消息本质上是“消耗”到 Apache Camel 的底层传输机制中。而系统所消费的消息,本质上是由“Apache Camel 的底层传输机制”产生的。
由于我们试图理解 Camel,因此我们必须从 Camel 的角度开始思考。因此,术语“消费者信息”和“生产者信息”的含义与我们基于系统视角的传统概念相反。
“生产者消息”和“消费者消息”使用相同的“基于骆驼的组件”编码基础设施。“基于骆驼的组件”为“生产者消息”提供“生产者端点”,为“消费者消息”提供“消费者端点”。
消息在路由时可以由 Camel 处理。
在此路由之上,Camel 提供了特殊功能,例如“类型转换”等等……
在您尝试了解 Apache Camel 之前,您需要了解的一件事是企业集成模式。并非该领域的每个人都真正了解它们。虽然您当然可以阅读 Enterprise Integration Patterns 这本书,但了解它们的更快方法是阅读类似 Wikipedia 上有关Enterprise Application Integration的文章。
如果您已经阅读并理解了该主题领域,您将更有可能理解 Apache Camel 的目的
高温高压
如果您了解企业集成模式,Apache Camel 是一种实现所有 EIP 的集成框架。
您可以将 Camel 作为独立应用程序部署在 Web 容器中。
基本上,如果您必须使用不同的协议和技术集成多个应用程序,您可以使用 Camel。
另一个角度的定义:
Apache Camel 是一个集成框架。它由一些 Java 库组成,可帮助您在 Java 平台上实现集成问题。我的文章“何时使用 Apache Camel ”中描述了这意味着什么,以及它与 API 和企业服务总线 (ESB) 的区别。
它到底是什么?
Apache Camel是一个轻量级的集成框架,它实现了许多企业集成模式。您可以使用所需的模式轻松集成不同的应用程序。
您可以使用 Java、Spring XML、Scala 或 Groovy。几乎所有你能想象到的技术都是可用的,例如 HTTP、FTP、JMS、EJB、JPA、RMI、JMS、JMX、LDAP、Netty 等。
它如何与用 Java 编写的应用程序交互?
Camel 使用Java 领域特定语言或 DSL以如下所列的各种领域特定语言 (DSL) 创建企业集成模式或路由。
Java DSL - 使用 fluent builder 风格的基于 Java 的 DSL。
企业集成模式的故事围绕这些概念解决:
消息、端点、生产者、消费者、路由、总线、转换和流程。
查看 Anirban Konar 的这篇文章,了解其中一个实时用例。
它与服务器一起使用吗?
它充当跨多个企业子系统的桥梁。
它是一个独立的程序吗?
Apache Camel 是一个集成框架,集成了不同的独立应用程序。
Camel 的主要优势:您可以通过对每次集成使用相同的概念来集成具有不同技术(和不同协议)的不同应用程序。
计算中的大多数“新”事物根本不是真正的新事物,它们只是围绕着一些已经很好理解的事物的神秘包装。当它们难以理解时,通常是因为有人决定为不同的目的发明新的语言术语或殖民现有术语(一个很好的例子是X 开发人员颠倒了“客户端”和“服务器”的含义。)
Camel 是一个基于 Java 的包装器/API,用于跨应用程序中间件。
中间件是在不共享共同语言或数据类型的实体之间提供解释服务的软件的总称。
这就是骆驼的本质。我们可以通过注意它提供 EIP 类型的中间件来充实描述。
它本身不提供中间件,因为它不知道应用程序需要通信的细节。但它提供了用于创建该中间件的不变部分的 API(创建起点、创建终点、创建开始和结束的条件等)
希望有帮助。
这是另一个尝试。
您知道 Webmethods、ICAN Seebeyond、Tibco BW、IBM Broker 之类的东西。他们都为企业中的集成解决方案提供了帮助。这些工具通常被称为企业应用程序集成 (EAI) 工具。
主要是围绕这些技术构建的拖放工具,并且在某些情况下您必须用 Java 编写适配器。这些适配器代码要么未经测试,要么在测试方面的工具/自动化很差。
就像编程中的设计模式一样,您拥有通用集成解决方案的企业集成模式。他们因 Gregor Hohpe 和 Bobby Woolf 的同名书而闻名。
尽管使用一个或多个 EIP 实现集成解决方案是完全可能的,但 Camel 尝试使用 XML、Java、Groovy 或 Scala 之一在您的代码库中执行此操作。
Camel 通过其丰富的 DSL 和路由机制支持书中列出的所有企业集成模式。
因此,Camel 是与其他 EAI 工具竞争的技术,可以更好地支持测试您的集成代码。由于领域特定语言 (DSL),代码很简洁。它甚至可以被商业用户阅读,而且它是免费的,可以让你更有效率。
有很多框架可以帮助我们进行消息传递和解决消息传递中的问题。一种这样的产品是 Apache Camel。
大多数常见问题都有经过验证的解决方案,称为设计模式。消息传递的设计模式是企业集成模式(EIP),这里有很好的解释。Apache camel 帮助我们使用 EIP 实现我们的解决方案。
集成框架的优势在于它能够通过 EIP 或其他模式为我们提供便利、传输和组件的数量以及 Apache Camel 位居榜首的易于开发
每个框架都有自己的优势 Apache camel 的一些特殊功能如下。
用简单的英语来说,camel 可以在没有太多样板代码的情况下完成(很多)事情。
只是为了给您一个视角,下面给出的 Java DSL 将创建一个 REST 端点,该端点将能够接受由产品列表组成的 XML,并将其拆分为多个产品,并使用它调用 BrandProcessor 的 Process 方法。只需添加 .parallelProcessing(注意注释掉的部分),它就会并行处理所有产品对象。(产品类是 JAXB/XJC 从 XSD 生成的 Java 存根,输入 xml 被限制在其中。)这么多代码(以及很少的 Camel 依赖项)将完成过去需要 100 行 Java 代码的工作。
from("servlet:item-delta?matchOnUriPrefix=true&httpMethodRestrict=POST")
.split(stax(Product.class))
/*.parallelProcessing()*/
.process(itemDeltaProcessor);
添加路由 ID 和日志记录语句后
from("servlet:item-delta?matchOnUriPrefix=true&httpMethodRestrict=POST")
.routeId("Item-DeltaRESTRoute")
.log(LoggingLevel.INFO, "Item Delta received on Item-DeltaRESTRoute")
.split(stax(Product.class))
.parallelProcessing()
.process(itemDeltaProcessor);
这只是一个示例,Camel 不仅仅是 REST 端点。看看可插拔组件列表http://camel.apache.org/components.html
假设您创建了一家像亚马逊这样的电子商务公司,并且您只想专注于销售产品的策略/选择。与亚马逊送货车队不同,您无需自己处理货物从卖家到仓库的移动,而是在仓库中对其进行更改(如包装)并将其发送到其他城市和客户。您聘请了一家公司来完成所有这些工作,只需向他们提供您所有仓库位置、车辆类型、交货地点以及何时做什么的列表的信息。然后他们自己处理,那就是 Apache Camel。一旦你把东西交给他们,他们就会把东西从一端转移到另一端,这样你就可以自由地专注于其他事情了。
Camel 有助于路由、转换和监控。
它使用路由;这可以描述为:
当服务总线接收到特定消息时,它将通过任何服务/代理目的地(例如队列/主题)来路由它。这条路径称为路由。
示例: 您的股票申请已获得分析师的一些输入,它将通过应用程序/Web 组件进行处理,然后将结果发布给所有感兴趣/注册的成员以进行特定的股票更新。
Apache Camel 是一个用于企业集成的 Java 框架。例如:- 如果您正在构建一个与许多供应商 API 交互的 Web 应用程序,我们可以使用骆驼作为外部集成工具。我们可以根据用例做更多的事情。Manning 出版物的 Camel in Action 是一本学习 Camel 的好书。集成可以定义如下。
Java DSL
from("jetty://0.0.0.0:8080/searchProduct").routeId("searchProduct.products").threads()
.log(LoggingLevel.INFO, "searchProducts request Received with body: ${body}")
.bean(Processor.class, "createSearchProductsRequest").removeHeaders("CamelHttp*")
.setHeader(Exchange.HTTP_METHOD, constant(org.apache.camel.component.http4.HttpMethods.POST))
.to("http4://" + preLiveBaseAPI + searchProductsUrl + "?apiKey=" + ApiKey
+ "&bridgeEndpoint=true")
.bean(Processor.class, "buildResponse").log(LoggingLevel.INFO, "Search products finished");
这只是为了创建一个 REST API 端点,该端点又调用外部 API 并将请求发回
春天的DSL
<route id="GROUPS-SHOW">
<from uri="jetty://0.0.0.0:8080/showGroups" />
<log loggingLevel="INFO" message="Reqeust receviced service to fetch groups -> ${body}" />
<to uri="direct:auditLog" />
<process ref="TestProcessor" />
</route>
来回答你的问题
希望能帮助到你
Camel 是一个具有一致 API 和编程模型的框架,用于将应用程序集成在一起。API 基于企业集成模式中的理论——即倾向于使用消息传递的设计模式。它提供了大多数这些模式的开箱即用实现,并且还附带了 200 多个不同的组件,您可以使用这些组件轻松地与各种其他系统进行通信。要使用 Camel,首先在 POJO 中编写业务逻辑并实现以消息为中心的简单接口。然后使用 Camel 的 DSL 创建“路由”,它们是将应用程序粘合在一起的规则集。
从表面上看,Camel 的功能可以与传统的企业服务总线产品相媲美。我们通常认为 Camel Route 是存在于服务器端的“中介”(又名编排)组件,但由于它是一个 Java 库,因此易于嵌入,它也可以存在于客户端应用程序中并帮助您集成它带有点对点服务(又名编排)。您甚至可以使用在 Camel 路由中处理消息的 POJO,并轻松地将它们分离到自己的远程消费者进程中,例如,如果您只需要独立扩展一个部分。您可以根据需要使用 Camel 通过任意数量的不同远程传输/协议连接路由或处理器。您是否需要一个极其高效和快速的二进制协议,还是一种更易于阅读且易于调试的版本?如果你想转行怎么办?使用 Camel,这通常就像在您的路线中更改一两行并且根本不更改任何业务逻辑一样简单。或者您可以同时支持两者——您可以在 Camel 上下文中一次自由地运行多条路线。
对于将存在于单个进程或 JVM 中的简单应用程序,您实际上并不需要使用 Camel - 这将是矫枉过正。但从概念上讲,它并不比您自己编写的代码更难。如果您的需求发生变化,业务逻辑和粘合代码的分离使得随着时间的推移更容易维护。一旦您学习了 Camel API,就可以像瑞士军刀一样轻松使用它,并在许多不同的环境中快速应用它,以减少您必须编写的自定义代码的数量。您可以学习一种风格 - 例如 Java DSL,一种易于链接在一起的流畅 API - 并轻松掌握其他风格。
如果您正在尝试做微服务,总体而言,Camel 非常适合。我发现它对于进化架构非常宝贵,因为您可以推迟许多关于协议、传输和其他系统集成问题的困难、“容易出错”的决策,直到您对您的问题领域有更多了解。只需专注于您的 EIP 和核心业务逻辑,并在您了解更多信息时切换到具有“正确”组件的新路由。
是的,这可能有点晚了。但是要添加到其他所有人的评论中的是,Camel 实际上是一个工具箱,而不是一套完整的功能。在开发和需要进行各种转换和协议转换时,您应该牢记这一点。
Camel 本身依赖于其他框架,因此有时您还需要了解这些框架,以便了解哪个最适合您的需求。例如,有多种方法可以处理 REST。起初这可能会让人有些困惑,但是一旦您开始使用和测试,您就会感到轻松,并且您对不同概念的了解也会增加。
它就像一个管道连接
From---->To
在两者之间你可以添加尽可能多的通道和管道。水龙头可以是任何类型的自动或手动数据流和引导流的路径。
它支持并实现了所有类型和种类的处理。并且对于相同的处理,许多方法,因为它有许多组件,并且每个组件还可以使用其下的不同方法提供所需的输出。
例如,文件传输可以在骆驼中完成,文件类型为移动或复制,也可以从文件夹、服务器或队列中完成。
-from-->To
- from-->process-->to
- from-->bean-->to
- from-->process-->bean-->to
-from-->marshal-->process-->unmarshal-->to
From/to----文件夹,direct,seda,vm可以是任何东西
另一种观点(基于更基础的数学主题)
最通用的计算平台是图灵机。
图灵机有问题。所有输入/输出数据都保留在图灵机内。在现实世界中,我们的图灵机外部存在输入源和输出接收器,并且通常由我们无法控制的系统控制。也就是说,那些外部系统将使用任何所需的数据调度程序以任何格式随意发送/接收数据。
问题:我们如何设法使独立的图灵机以最通用的方式相互交流,以便每个图灵机将其对等设备视为输入数据的源或输出数据的接收器?
答:使用像骆驼、骡子、BizTalk 或任何其他 ESB 之类的东西来抽象完成不同的“物理”(或虚拟软件)图灵机之间的数据处理。