Answers:
如果您有5到10分钟的时间,我通常建议人们阅读Jonathan Anstey撰写的与Apache Camel的集成。这是一篇写得很好的文章,简要介绍了Camel的一些概念并对其进行了概述,并且使用代码示例实现了用例。乔纳森在其中写道:
Apache Camel是一个开放源代码Java框架,致力于使集成更容易并且对开发人员更易于访问。为此,它提供了:
- 所有广泛使用的企业集成模式(EIP)的具体实现
- 连接到各种传输和API
- 易于使用的领域特定语言(DSL)将EIP连接在一起并进行传输
骆驼在行动中也有一个免费的章节,在第一章中介绍了骆驼。乔纳森与我合着那本书。
我以一种更易于理解的方式描述了这一点...
为了了解什么是Apache Camel,您需要了解什么是企业集成模式。
让我们从我们大概已经知道的内容开始:Singleton模式,Factory模式等;它们只是组织问题解决方案的方式,而本身并不是解决方案。四人帮在他们出版《设计模式》一书时,对其他人进行了分析和提取。他们节省了我们中的一些人在思考如何最好地构建代码结构方面的精力。
就像“四人帮”一样,Gregor Hohpe和Bobby Woolf撰写了《企业集成模式》(EIP)一书,他们在其中提出并记录了一组新的模式和蓝图,以帮助我们最佳地设计大型基于组件的系统,其中可以使用组件。在同一进程或另一台计算机上运行。
他们基本上建议我们将系统构造为面向消息的-组件之间使用消息作为输入和输出相互通信,而绝对没有其他消息。它们向我们展示了一套完整的模式,我们可以从中选择并在不同的组件中实施,这些组件将一起构成整个系统。
那么什么是Apache Camel?
Apache Camel为您提供了EIP的接口,基础对象,通常需要的实现,调试工具,配置系统以及许多其他帮助器,当您要实现遵循EIP的解决方案时,将为您节省大量时间。
以MVC为例。MVC在理论上非常简单,我们可以在没有任何框架帮助的情况下实现它。但是好的MVC框架为我们提供了现成的结构,并花了很多功夫,并在创建大型MVC项目时考虑了您需要的所有其他“方面”,这就是我们大多数时候使用它们的原因。
这正是Apache Camel用于EIP的含义。对于想要实施其解决方案以遵循EIP的人们来说,这是一个完整的生产就绪框架。
创建项目描述应该不复杂。
我说:
Apache Camel是消息传递技术与路由的结合。它将消息的起点和终点连接在一起,从而允许将消息从不同的源传输到不同的目的地。例如:JMS-> JSON,HTTP-> JMS或渠道FTP-> JMS,HTTP-> JMS,JSON-> JMS
维基百科说:
Apache Camel是基于规则的路由和中介引擎,它使用API(或声明性的Java域特定语言)来配置路由和中介规则,从而提供了基于Java对象的企业集成模式实现。特定领域的语言意味着Apache Camel可以使用常规Java代码在IDE中支持类型安全的路由规则智能完成,而无需使用大量XML配置文件。尽管还支持Spring内部的XML配置。
看到?那不难吗?
简而言之:
当需要连接/集成系统时,您可能需要连接到某些数据源,然后处理该数据以匹配您的业务需求。
为了做到这一点:
1)您可以开发执行此操作的自定义程序(可能耗时且难以理解,对于其他开发人员而言则难以维护)
2)或者,您可以使用Apache Camel以标准化方式进行操作(它已经为您开发了大多数连接器,您只需要进行设置并插入逻辑-称为Process)即可:
骆驼将帮助您:
通过使用Apache Camel,您将易于理解/维护/将系统扩展到其他开发人员。
Apache Camel是使用企业集成模式开发的。这些模式可以帮助您很好地集成系统:-)
骆驼将消息从A发送到B:
为什么要为此建立一个整体框架?好吧,如果您有:
ftp
,http
,jms
等)所以现在您需要:
骆驼开箱即用为您提供以上(以及更多)功能:
用很酷的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");
}
基于类比
通过将自己置于航空公司所有者(例如:美国航空,Jet Airways)的鞋子中,可以很容易地理解基于骆驼的航线。
“您的航空公司”的目的是将“乘客”从一个“城市”运送到世界上的另一个城市。您使用波音,空中客车,HAL等不同“飞机公司”的飞机载客。
您的航空公司使用出发城市的“机场”登上乘客,并使用出发城市的机场下车。乘客可能会“旅行”到多个城市,但是他们必须经过机场才能在航空公司的飞机和城市之间旅行。
请注意,从城市“起飞”的乘客实际上是在“抵达”您航空公司的飞机。一架“进入”市区的护照实际上是从飞机上起飞的。由于我们是航空公司的主人,因此“到达旅客”和“出发旅客”一词与我们从城市角度出发的传统观念相反。
每个城市的“机场”基础设施都由“出发”和“到达”的旅客使用。机场为离港旅客提供“离港基础设施”,这与为到达旅客提供的“到达基础设施”不同。
由于您的航空公司在飞行中在飞机内提供了各种“便利设施”,因此乘客可以继续进行日常活动。
最重要的是,您的航空公司还提供休息室设施,以提供特殊待遇,例如“了解当地语言”或为您的“旅行”做准备。
让我们用以下内容替换上面使用的几个单词/短语:
您的航空公司:Apache Camel
飞机公司:运输机制
您航空公司的飞机:Apache Camel的基本运输机制
携带:路线
乘客:留言;
城市:系统;
机场:骆驼成分;
了解当地语言:类型转换;
离开:生产,生产
到达:消费,消费
旅行:路线
便利设施:提供
替换单词之后,您将获得:
“ Apache Camel”的目的是将“消息”从一个“系统”路由到世界上的另一个系统。Apache骆驼使用不同的传输机制进行消息路由。
Apache Camel使用'from'系统的'基于Camel的组件'接收消息,并使用'to'系统的'基于Camel的组件'删除消息。一条消息可能会路由到多个系统,但是到处它们都必须经过“基于Camel的组件”才能在“ Apache Camel的基础传输机制”和系统之间传播。
请注意,从系统“生成”的消息实际上已“消耗”到Apache Camel的基础传输机制中”。系统消耗的消息实质上是由“ Apache Camel的基础传输机制”产生的。
由于我们试图理解骆驼,因此我们必须从骆驼的角度出发进行思考。因此,术语“消费者消息”和“生产者消息”的含义与基于系统角度的常规概念相反。
“生产者消息”和“消费者消息”使用相同的“基于骆驼的组件”的编码基础结构。“基于骆驼的组件”为“生产者消息”提供了“生产者端点”,为“消费者消息”提供了“消费者端点”。
邮件在路由时可以由骆驼处理。
除了此路由之外,骆驼还提供特殊功能,例如“类型转换”等。
在尝试了解Apache Camel之前,您需要了解的一件事是企业集成模式。实际上,并不是每个人都知道它们。虽然您当然可以阅读《企业集成模式》这本书,但是更快地了解它们的更快方法是阅读诸如Wikipedia上有关Enterprise Application Integration的文章。
您已经阅读并理解了该主题领域,那么您很有可能理解Apache 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编写的应用程序交互?
骆驼使用Java领域特定语言或DSL来创建企业集成模式或各种领域特定语言(DSL)的路由,如下所示。
Java DSL-使用流畅的构建器样式的基于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。
大多数常见问题已被证明是称为设计模式的解决方案。用于消息传递的设计模式是企业集成图形(电子信息产品),其很好地解释这里。Apache骆驼帮助我们使用EIP实施我们的解决方案。
集成框架的优势在于其通过EIP或其他模式为我们提供便利的能力,传输和组件的数量以及易于开发的能力(Apache骆驼位居榜首)
每个框架都有其自身的优势。Apache骆驼的一些特殊功能如下。
用简单的英语来说,骆驼不需要很多样板代码就能完成很多事情。
为了给您一个视角,下面给出的Java DSL将创建一个REST终结点,该终结点将能够接受包含产品列表的XML,并将其拆分为多个产品,并调用BrandProcessor的Process方法。只需添加.parallelProcessing(请注意已注释掉的部分),它将并行处理所有产品对象。(产品类是从XSD用JAXB / XJC生成的Java存根,其输入XML被限制在其中。)这么多的代码(以及很少的Camel依赖项)将完成工作,该工作过去需要使用数百行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
Camel是具有一致的API和编程模型的框架,用于将应用程序集成在一起。该API基于企业集成模式中的理论-即,倾向于使用消息传递的一堆设计模式。它提供了大多数这些模式的现成实现,并附带了200多种不同的组件您可以使用它们轻松地与各种其他系统进行对话。要使用Camel,首先要在POJO中编写业务逻辑,并实现围绕消息的简单接口。然后使用Camel的DSL创建“路由”,这是将应用程序粘合在一起的规则集。
从表面上看,骆驼的功能可以与传统的企业服务总线产品相媲美。我们通常认为骆驼路线是驻留在服务器端的“中介”(也称为编排)组件,但由于它是Java库,因此易于嵌入,并且也可以驻留在客户端应用程序中,并帮助您集成它具有点对点服务(又称为编排)。您甚至可以带您的POJO来处理Camel路由中的消息,并轻松地将它们分解到自己的远程使用者进程中,例如,如果您只需要独立扩展一个消息。您可以根据需要使用Camel通过任意数量的不同远程传输/协议连接路由或处理器。您是否需要一种非常高效,快速的二进制协议,还是更易于阅读和调试的工具?如果要切换怎么办?使用骆驼,这通常就像更改路线中的一两条线一样简单,根本不需要更改任何业务逻辑。或者您可以同时支持两者-您可以在Camel上下文中自由地一次运行许多Route。
您实际上并不需要将Camel用于将要存在于单个进程或JVM中的简单应用程序-这太过分了。但是从概念上讲,这并不比编写自己的代码困难。而且,如果您的需求发生变化,则业务逻辑和胶合代码的分离将使维护更容易。一旦学习了Camel API,就可以像一把瑞士军刀一样容易地使用它,并在许多不同的上下文中快速应用它,以减少您不得不编写的自定义代码量。您可以学习一种口味-例如Java DSL,一种易于链接在一起的流利的API-并轻松挑选其他口味。
如果您尝试进行微服务,那么总体而言Camel非常适合。我发现它对于演化体系结构而言是无价的,因为您可以推迟有关协议,传输和其他系统集成问题的许多困难,“容易弄错”的决定,直到您对问题域有了更多了解为止。只需关注您的EIP和核心业务逻辑,并在了解更多信息时切换到带有“正确”组件的新路由。
是的,这可能有点晚了。但是要添加到其他所有人的评论中的一件事是,Camel实际上是一个工具箱,而不是一整套功能。在开发时应牢记这一点,并且需要进行各种转换和协议转换。
Camel本身依赖于其他框架,因此有时您也需要了解那些框架,以便了解最适合您的需求的框架。例如,有多种处理REST的方法。刚开始时这可能会使您感到困惑,但是一旦您开始使用和测试,您会感到很自在,并且您对不同概念的了解也会增加。
Apache Camel是用于企业集成的Java框架。例如:-如果您要构建一个与许多供应商API交互的Web应用程序,我们可以将骆驼用作外部集成工具。根据用例,我们可以做更多的事情。曼宁出版物中的《骆驼在行动》是一本学习骆驼的好书。集成可以定义如下。
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>
提出您的问题
希望能帮助到你
Apache Camel是一个轻量级的集成框架,可实现所有企业集成模式。您可以使用所需的模式轻松集成不同的应用程序。您可以使用Java,Spring XML,Scala或Groovy。
Apache Camel在Java虚拟机(JVM)上运行。... Apache Camel的核心功能是其路由引擎。它根据相关路由分配消息。路由包含流和集成逻辑。它是使用EIP和特定的DSL实现的。
就像管道连接一样
From---->To
您可以在两者之间添加尽可能多的通道和管道。水龙头可以是用于数据流的自动或手动的任何类型,以及用于引导水流的路径。
它支持并实现所有类型和种类的处理。对于相同的处理,有许多方法,因为它具有许多组件,并且每个组件还可以使用其下的不同方法来提供所需的输出。
例如,文件传输可以在骆驼中完成,文件类型可以移动或复制,也可以从文件夹,服务器或队列中进行。
-from-->To
- from-->process-->to
- from-->bean-->to
- from-->process-->bean-->to
-from-->marshal-->process-->unmarshal-->to
从/到----文件夹,直接,seda,vm可以是任何东西
另一种观点(基于更基本的数学主题)
最通用的计算平台是[ https://en.wikipedia.org/wiki/Turing_machine]
图灵机出现问题。所有输入/输出数据都保留在图腾机内部。在现实世界中,图灵机外部有输入源和输出接收器,通常由我们控制范围之外的系统控制。即,那些外部系统将以任何期望的数据调度器以任何格式随意发送/接收数据。
问题:我们如何设法使独立的图灵机以最通用的方式相互交谈,以使每台图灵机将其对等方视为输入数据源或输出数据宿?
答:使用诸如骆驼,m子,BizTalk或任何其他ESB之类的东西来抽象化完成不同的“物理”(或虚拟软件)图灵机之间的数据处理。