关于爪哇:阿帕奇骆驼Apache Camel到底是什么?

What exactly is Apache Camel?

我不明白骆驼到底在干什么。

如果你能用101个词介绍骆驼:

  • 到底是什么?
  • 它如何与Java编写的应用程序交互?
  • 它是与服务器一起工作的吗?
  • 这是一个独立的项目吗?

请解释一下骆驼是什么。


我认为用一种更容易理解的方式来描述这一点…

为了理解什么是ApacheCamel,您需要了解什么是企业集成模式。

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

就像"四人帮"一样,Gregor Hohpe和Bobby Woolf撰写了《企业集成模式》(EIP)一书,他们在其中提出并记录了一组新的模式和蓝图,以说明我们如何最佳地设计大型基于组件的系统,其中组件可以运行在同一个过程中,也可以运行在不同的机器中。

他们基本上建议我们将系统结构为面向消息的——在这里,组件使用消息作为输入和输出进行相互通信,而绝对没有其他内容。它们向我们展示了一组完整的模式,我们可以从这些模式中进行选择,并在不同的组件中实现这些模式,这些组件将共同构成整个系统。

那么什么是阿帕奇骆驼?

ApacheCamel为您提供了EIP的接口、基本对象、通常需要的实现、调试工具、配置系统和许多其他帮助器,当您希望实现解决方案以遵循EIP时,这些帮助器将为您节省大量时间。

以MVC为例。MVC在理论上相当简单,我们可以在没有任何框架帮助的情况下实现它。但是好的MVC框架为我们提供了随时可用的结构,并且在创建一个大型MVC项目时,为您考虑了所有其他需要的"边"方面的事情,这就是我们大多数时候使用它们的原因。

这正是阿帕奇骆驼对于EIP的意义所在。这是一个完整的生产就绪框架,适用于希望实现其解决方案以遵循EIP的人员。


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

我说:

Apache Camel is messaging technology glue with routing. It joins together messaging start and end points allowing the transference of messages from different sources to different destinations. For example: JMS -> JSON, HTTP -> JMS or funneling FTP -> JMS, HTTP -> JMS, JSON -> JMS

维基百科说:

Apache Camel is a rule-based routing and mediation engine which provides a Java object based implementation of the Enterprise Integration Patterns using an API (or declarative Java Domain Specific Language) to configure routing and mediation rules. The domain specific language means that Apache Camel can support type-safe smart completion of routing rules in your IDE using regular Java code without huge amounts of XML configuration files; though XML configuration inside Spring is also supported.

看到了吗?不是很难吧?


如果您有5到10分钟的时间,我通常建议人们阅读JonathanAnstey与ApacheCamel的集成。这是一篇写得很好的文章,它简要介绍和概述了camel的一些概念,并用代码示例实现了一个用例。乔纳森在信中写道:

Apache Camel is an open source Java framework that focuses on making integration easier and more accessible to developers. It does this by providing:

  • concrete implementations of all the widely used Enterprise Integration Patterns (EIPs)
  • connectivity to a great variety of transports and APIs
  • easy to use Domain Specific Languages (DSLs) to wire EIPs and transports together

在第一章中,还有一个自由的"骆驼行动"章节介绍了骆驼。乔纳森是那本书的合著者。


简而言之:

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

为了做到这一点:

1)您可以开发定制的程序来完成这项工作(可能很费时且难以理解,为其他开发人员维护)

2)或者,您可以使用ApacheCamel以标准化的方式完成这项工作(它已经为您开发了大部分连接器,您只需要设置它并插入逻辑(称为过程):

骆驼会帮助你:

  • 使用任何源/格式的数据
  • 处理此数据
  • 将数据输出到任何源/格式
  • 通过使用ApacheCamel,您可以很容易地理解/维护您的系统,并将其扩展到另一个开发人员。

    ApacheCamel是用企业集成模式开发的。这些模式有助于您以良好的方式集成系统:—)


    骆驼从A到B发送消息:

    enter image description here

    为什么要建立一个完整的框架?好吧,如果你有:

    • 许多发送者和许多接收者
    • 12种协议(ftphttpjms等)
    • 许多复杂的规则
      • 仅向接收器A和B发送消息A
      • 以XML的形式将消息B发送给接收者C,但要对其进行部分翻译,对其进行丰富(添加元数据),如果条件X,则也要将其发送给接收者D,但要以CSV的形式发送。

    所以现在你需要:

    • 在协议之间转换
    • 将组件粘合在一起
    • 定义路线-去哪里
    • 在某些情况下过滤某些内容

    骆驼给你以上(以及更多)的开箱即用:

    enter image description here

    使用一种很酷的DSL语言,您可以定义以下内容和方式:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
      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");
    }

    另请看这本书和这本书,以及《骆驼行动》(正如其他人所说的,一本好书!)


    一张图表比成千上万的描述要好。这张图说明了骆驼的结构。

    enter image description here


    在试图理解ApacheCamel之前,您需要了解的一件事情是企业集成模式。不是每个人都知道。虽然您当然可以阅读企业集成模式书籍,但一种更快地了解它们的方法是阅读类似维基百科关于企业应用程序集成的文章。

    如果您已经阅读并理解了主题领域,那么您将更有可能了解ApacheCamel的用途。

    高温高压


    基于类比

    骆驼航线可以很容易地理解,把自己放在一个航空公司老板的鞋子(例如:美国航空公司,喷气航空公司)。

    "贵公司"的目的是将"乘客"从一个"城市"运送到世界上的另一个"城市"。您使用来自不同"飞机公司"的飞机,如波音公司、空客公司、哈尔航空公司,来运送乘客。

    您的航空公司使用"机场"从城市登机,并使用"到城市"的机场让乘客下车。乘客可以"旅行"到多个城市,但无论在哪里,他们都必须通过机场才能在航空公司的飞机和城市之间旅行。

    请注意,"离开"城市的乘客基本上是"到达"您的航空公司的飞机。一名乘客"抵达"城市,基本上是从飞机上起飞。由于我们处于航空公司所有者的位置,术语"到达乘客"和"离开乘客"与基于城市视角的传统概念相反。

    每个城市相同的"机场"基础设施供"出发"和"到达"乘客使用。机场为离港旅客提供"离港基础设施",这与为到港旅客提供的"到港基础设施"不同。

    由于航空公司在飞机内提供了各种各样的"便利设施",乘客可以在旅行期间继续从事他们的活动。

    除此之外,您的航空公司还为您提供休息设施,用于"了解当地语言"和/或为您的"旅行"做准备等特殊治疗。

    让我们将上面使用的几个词/短语替换为以下内容:

    您的航空公司:阿帕奇骆驼

    飞机公司:运输机制

    贵公司的飞机:阿帕奇骆驼的基本运输机制

    进路:进路

    乘客:留言;

    城市:制度;

    机场:骆驼组件;

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

    出发:生产、生产

    到达:消费,消费

    旅行:路由

    便利设施:提供

    替换单词后,您将得到:

    "apache camel"的目的是将"消息"从一个"系统"路由到世界上的另一个"系统"。ApacheCamel使用不同的传输机制进行消息路由。

    ApacheCamel使用"from"系统的"camel-based component"接收消息,并使用"to"系统的"camel-based component"删除它们。一条消息可以路由到多个系统,但无论在哪里,它们都必须通过"基于骆驼的组件"在"ApacheCamel的底层传输机制"和系统之间传输。

    请注意,系统"生成"的消息本质上是"消耗"到ApacheCamel的底层传输机制中的。一个系统消耗的消息,基本上是由"ApacheCamel的底层传输机制"产生的。

    既然我们试图理解骆驼,我们必须从骆驼的角度来思考。因此,术语"消费者信息"和"生产者信息"的含义与基于系统视角的传统概念相反。

    "生产者消息"和"消费者消息"使用相同的"基于骆驼的组件"编码基础设施。"基于camel的组件"为"producer message"提供"producer endpoint",为"consumer message"提供"consumer endpoint"。

    在路由消息时,camel可以处理这些消息。

    除此之外,camel还提供了诸如"类型转换"等特殊功能…


    如果您了解企业集成模式,ApacheCamel是一个实现所有EIP的集成框架。

    您可以将camel部署为Web容器中的独立应用程序。

    基本上,如果必须将多个应用程序与不同的协议和技术集成在一起,则可以使用camel。


    从另一个角度定义:

    ApacheCamel是一个集成框架。它由一些Java库组成,它们帮助您实现Java平台上的集成问题。这意味着什么,以及它与一端的API和另一端的企业服务总线(EnterpriseServiceBus,ESB)的区别在我的文章"何时使用ApacheCamel"中进行了描述。


    What exactly is it?

    ApacheCamel是一个轻量级的集成框架,它实现了所有的企业集成模式。您可以使用所需的模式轻松地集成不同的应用程序。

    可以使用Java、Spring XML、Scala或Groovy。几乎所有您能想到的技术都是可用的,例如http、ftp、jms、ejb、jpa、rmi、jms、jmx、ldap、netty等。

    看看这篇文章和EIP模式文章

    How does it interact with an application written in Java?

    CAMEL使用Java域特定语言或DSL来创建企业集成模式或路由,如下面列出的各种特定于域的语言(DSL)。

    JAVA DSL——使用FLUENT Builder风格的基于Java的DSL。

    企业集成模式的故事围绕着这些概念解决:

    消息、端点、生产者、消费者、路由、总线、转换和处理。

    请看一下AnirbanKonar撰写的这篇文章,了解其中一个实时用例。

    Is it something that goes together with the server?

    它充当跨多个企业子系统的桥梁。

    Is it an independent program?

    ApacheCamel是一个集成框架,它集成了不同的独立应用程序。

    camel的主要优势:通过对每次集成使用相同的概念,您可以将不同的应用程序与不同的技术(以及不同的协议)集成在一起。


    计算机中的大多数"新"事物都不是真正的新事物,它们只是一个关于已经被很好理解的事物的神秘包装。当他们很难理解的时候,通常是因为有人决定发明新的语言术语,或者为了不同的目的殖民现有的术语(一个很好的例子是X开发人员对"客户机"和"服务器"的意思的颠倒)。

    CAMEL是面向应用程序中间件的基于Java的包装器/API。

    中间件是软件的通用术语,它在不共享公共语言或数据类型的实体之间提供解释服务。

    这就是骆驼,在底部。我们可以通过注意到它提供了EIP类型的中间件来充实描述。

    它不提供中间件本身,因为它不知道应用程序需要通信的细节。但是它提供了创建中间件不变部分的API(创建起点、创建终点、创建起止条件等)

    希望有帮助。


    这是另一个尝试。

    你知道webmethods、ican-seebeyond、tibco-bw、ibm-broker等东西是如何存在的。它们都对企业中的集成解决方案提供了帮助。这些工具通常被称为企业应用程序集成(EAI)工具。

    在这些技术中主要有拖放工具,在某些方面,你必须用Java编写适配器。这些适配器代码要么没有经过测试,要么在测试过程中缺乏工具/自动化。

    就像编程中的设计模式一样,您有用于通用集成解决方案的企业集成模式。他们因格雷戈·霍普和鲍比·伍尔夫的同名书而出名。

    虽然很可能实现使用一个或多个EIP的集成解决方案,但CAMEL是使用XML、Java、Groovy或Scala中的一个在代码库中实现这一点的尝试。

    camel通过其丰富的DSL和路由机制支持书中列出的所有企业集成模式。

    因此,camel是其他EAI工具的竞争对手,对测试集成代码有更好的支持。由于特定于域的语言(DSL),代码很简洁。它甚至可以被业务用户阅读,而且是免费的,使您富有成效。


    有很多框架可以帮助我们进行消息传递并解决消息传递中的问题。其中一个这样的产品是阿帕奇骆驼。

    大多数常见问题都有被称为设计模式的经验证的解决方案。消息传递的设计模式是企业集成模式(EIP),这里将对此进行详细说明。ApacheCamel帮助我们使用EIP实现我们的解决方案。

    集成框架的优势在于它能够通过EIP或其他模式为我们提供便利、运输和组件的数量以及易于开发的能力,而ApacheCamel在这一点上位居榜首。

    每个框架都有自己的优点,ApacheCamel的一些特殊特性如下。

  • 它提供了许多DSL中的编码,即Java DSL和基于Spring XML的DSL,这是流行的。
  • 简单易用。
  • Fuse IDE是一种帮助您通过UI进行编码的产品

  • 在简单的英语中,camel不需要太多的锅炉盘代码就可以完成很多事情。

    为了给您一个透视图,下面给出的Java DSL将创建一个REST端点,它将能够接受由产品列表组成的XML并将其拆分为多个产品并调用Brand处理器的处理方法。只需添加.parallelprocessing(注意注释部分),它就可以并行处理所有产品对象。(产品类是来自XSD的JAXB/XJC生成的Java存根,输入XML被限制在这里)。这多个代码(连同少量的CAMEL依赖关系)将完成所做的任务,用于获取100s的Java代码行。

    1
    2
    3
    4
    from("servlet:item-delta?matchOnUriPrefix=true&httpMethodRestrict=POST")
    .split(stax(Product.class))
    /*.parallelProcessing()*/
    .process(itemDeltaProcessor);

    添加路由ID和日志语句后

    1
    2
    3
    4
    5
    6
    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);

    这只是一个样本,骆驼不仅仅是休息的终点。请看一下可插入组件列表http://camel.apache.org/components.html


    camel有助于路由、转换和监视。

    它使用路由;可以描述为:

    当服务总线接收到特定的消息时,它将通过服务/代理目的地(如队列/主题)来路由它。此路径称为路由。

    例子:您的股票应用程序得到了分析师的一些输入,它将通过应用程序/Web组件进行处理,然后结果将发布给所有感兴趣的/注册的成员,以进行特定的股票更新。


    是的,可能有点晚了。但是,要添加到其他人的评论中的一件事是,camel实际上是一个工具箱,而不是一组完整的特性。在开发和需要进行各种转换和协议转换时,您应该记住这一点。

    camel本身依赖于其他框架,因此有时您也需要了解这些框架,以便了解哪一个框架最适合您的需要。例如,有多种方法可以处理休息。这一开始可能会让人有点困惑,但一旦开始使用和测试,您会感到轻松,并且您对不同概念的了解也会增加。


    在企业中,存在许多不同类型的系统。其中一些可能是遗留系统,而有些可能是新的。这些系统经常相互作用,需要集成。这种交互或集成不像系统的实现那样容易,它们的消息格式可能不同。实现这一点的一种方法是实现桥接这些差异的代码。然而,这将是点对点集成。如果明天再来,如果一个系统发生变化,另一个系统也可能会发生变化,这是不好的。我们可以实现一个额外的层来调解系统之间的差异,而不是这种点到点的集成,它会导致紧密耦合。这会导致松耦合,对我们现有的系统影响不大。Apache CAMEL是一种基于规则的路由和中介引擎,它使用API(或声明性Java域特定语言)来提供基于Java对象的企业集成模式的实现,以配置路由和中介规则。详细的解释和例子可以在这里找到ApacheCamel教程


    Apache CAMEL是企业集成的Java框架。如果您正在构建一个与许多供应商API交互的Web应用程序,我们可以使用camel作为外部集成工具。我们可以根据用例对它做更多的工作。曼宁出版的《骆驼行动》是一本学习骆驼的好书。集成可以定义如下。

    Java DSL

    1
    2
    3
    4
    5
    6
    7
    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");

    这只是创建一个RESTAPI端点,该端点反过来调用一个外部API并将请求发回

    弹簧DSL

    1
    2
    3
    4
    5
    6
    <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>

    回答你的问题

  • 到底是什么?它是一个实现企业集成模式的框架。
  • 它如何与Java编写的应用程序交互?ans:-它可以与任何可用的协议交互,如http、ftp、amqp等。
  • 它是与服务器一起工作的吗?ANS:它可以部署在像Tomcat这样的容器中,也可以作为Java进程独立部署。
  • 这是一个独立的项目吗?答:可以。
  • 希望它有帮助


    假设你创建了一个像亚马逊这样的电子商务公司,你只想把重点放在销售产品的战略/选择上。与亚马逊送货车队不同的是,你不需要自己处理从卖家到仓库的货物运输,而是在仓库中对货物进行更改,比如包装,然后将其发送到其他城市和客户。你雇了一家公司来完成所有这些工作,只需向他们提供你所有的仓库位置、车辆类型、交货地点以及何时做什么的列表。然后他们自己处理,那就是阿帕奇骆驼。一旦你把东西交给他们,他们就会负责把东西从一端移到另一端,这样你就可以自由地专注于其他事情。


    就像一条管道

    1
    From---->To

    在中间可以添加尽可能多的通道和管道。水龙头可以是任何类型的用于数据流的自动或手动操作,以及用于引导数据流的路由。

    它支持并实现所有类型和类型的处理。对于相同的处理,许多方法是因为它有许多组件,并且每个组件也可以使用其下的不同方法提供所需的输出。

    例如,文件传输可以通过移动或复制类型的文件以及从文件夹、服务器或队列进行。

    1
    2
    3
    4
    5
    -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]

    图灵机有问题。所有输入/输出数据都保存在图灵机内。在现实世界中,图灵机器外部有输入源和输出接收器,通常由我们控制之外的系统控制。也就是说,这些外部系统将使用任何所需的数据调度程序以任何格式随意发送/接收数据。

    问题:我们如何设法使独立的图灵机以最一般的方式相互对话,以便每个图灵机将其对等机视为输入数据源或输出数据接收器?

    答:使用类似camel、mule、biztalk或任何其他ESB的工具,抽象完成不同的"物理"(或虚拟软件)图灵机之间的数据处理。


    101字介绍

    camel是一个框架,具有一致的API和用于将应用程序集成在一起的编程模型。API基于企业集成模式中的理论,即倾向于使用消息传递的一系列设计模式。它提供了大多数这些模式的开箱即用实现,另外还附带了200多个不同的组件,您可以使用这些组件轻松地与各种其他系统进行对话。要使用camel,首先在pojos中编写业务逻辑,并实现以消息为中心的简单接口。然后使用camel的DSL创建"路由",这是将应用程序粘合在一起的规则集。

    扩展介绍

    表面上,Camel的功能与传统的企业服务总线产品竞争。我们通常认为CAMEL路由是一个"中介"(ActualPoint)组件,它位于服务器端,但因为它是一个Java库,它很容易嵌入,它也可以在客户端应用程序上运行,并帮助您将它与点对点服务(Aka CordReopy)集成。您甚至可以将处理驼峰路线内消息的POJO带到自己的远程消费流程中,例如,如果您只需要单独扩展一个部分,则可以轻松地将它们分离到自己的远程消费流程中。根据需要,您可以使用camel通过任意数量的不同远程传输/协议连接路由或处理器。您需要一个非常高效和快速的二进制协议,还是一个更容易被人阅读和调试的协议?如果你想转换呢?对于camel,这通常与在您的路线中更改一两行以及根本不更改任何业务逻辑一样容易。或者你可以两者都支持——你可以在骆驼的环境下同时自由地运行许多路线。

    对于将要在单个进程或JVM中运行的简单应用程序,您实际上不需要使用camel——这将是一种过度杀伤力。但在概念上,这并不比您自己编写的代码更困难。如果您的需求发生变化,业务逻辑和粘合代码的分离将使随着时间的推移更容易维护。一旦您学习了camel API,就可以像瑞士军刀一样轻松地使用它,并在许多不同的上下文中快速应用它,从而减少您必须编写的自定义代码的数量。你可以学习一种味道——例如Java DSL,一个易于链接的FLASH API,并且很容易地找到其他的味道。

    总的来说,如果你想做微服务,camel非常适合。我发现它对于进化体系结构来说是无价的,因为你可以推迟很多关于协议、传输和其他系统集成问题的困难的、容易出错的决策,直到你对你的问题领域有更多的了解。只需关注您的EIP和核心业务逻辑,并在了解更多信息时使用"正确的"组件切换到新的路由。