Apache Camel核心概念

1. Camel中的相关概念

1.1 ROUTING ENGINE(路由引擎)

Camel的路由引擎是消息移动的实际执行者,但并未暴露给开发者;不过作为开发者,我们应该意识到它的存在;并且它做了所有繁重的消息移动工作并保证了正确的路由。

1.2 ROUTES(路由)

路由是Camel的核心抽象概念,最简单的定义路由的方式是通过一个processors链来实现;在消息应用中使用路由有很多种原因,解耦的客户端和服务器端,生产者和消费者。

Camel中的每个路由都有一个惟一标识,用于日志记录、调试、跟踪,以及启动和停止路由等操作。路由也有一个输入消息源,所以每个路由有效地绑定到了输入的Endpoint。

路由定义使用领域标记语言(DSL)。

1.3 DOMAIN-SPECIFIC LANGUAGE (DSL 领域标记语言)

Camel中通过DSL,将processors 和 endpoints 连接在一起构成路由。

在Camel中,DSL意味着一个流畅的Java API,它包含以EIP术语命名的方法。

下面有一个简单的java代码块,其定义了一个路由实现如下功能:从文件终端消费文件,然后将消息路由到过滤器EIP,该过滤器EIP将使用XPath断言判断消息是否是测试订单,若消息是测试订单,则把消息路由发送到JMS终端,所不是则直接丢弃。

from("file:data/inbox")
 .filter().xpath("/order[not(@test)]")
 .to("jms:queue:order")

Camel提供多种DSL语言支持,所以你可以通过下面Spring Xml格式定义跟上面一样语义的路由实现:

<route>
 <from uri="file:data/inbox"/>
 <filter>
 <xpath>/order[not(@test)]</xpath>
 <to uri="jms:queue:order"/>
 </filter> 
</route>

1.4 PROCESSOR(处理器)

processor处理器是Camel的核心概念,它能够使用、创建和修改传入的Exchange;在路由过程中,Exchange从一个processor流转到另一个processor。

许多processor都是EIP的实现,但我们可以轻松实现任何一个,自定义自己的处理器并将其插入到我们需要的router路由中。

1.5 COMPONENT(组件)

Components 组件是Camel中的主要扩展点;到目前为止,在Camel生态系统中有超过80个组件,功能范围从数据传输到DSL、数据格式处理等。

我们也可以为Camel创建我们自定义的组件。

从编程的角度来看,组件相当简单:它们与URI中使用的名称关联,并充当Endpoint终端工厂。例如FileComponent是URI中引用的文件,它创建FileEndpoints。

在Camel中,Endpoint终端可能是一个更为基本的概念。

1.6 ENDPOINT(终端)

Endpoint终端是Camel中的一个抽象概念,他表示可以通过channel发送或接收消息的一个端点。

Endpoint端点的扮演着一个中立的允许进行系统集成的接口:

image-20211012185545517

在Camel中使用uri配置或引用Endpoint,如:

file:data/inbox?delay=5000

在运行时,Camel将根据URI中的标记符号查找对应的Endpoint,下图展示了具体工作细节:

image-20211012185831404

  1. Scheme:标识哪个Camel组件处理这种类型的Endpoint,这里使用的是file标识FileComponent;之后FileComponent作为一个工厂,基于URI的其余部分创建对应的FileEndpoint
  2. Context path:上下文路径data/inbox告诉FileComponent开始位置是data/inbox;
  3. Options:选项delay=5000 表示以5秒为间隔轮询文件

Endpoint的含义还有很多,下图展示了Endpoint如何与exchange、producer和consumer一起协作:

image-20211012190505338

简而言之,Endpoint充当创建producer(发送消息)和consumer(接收消息)的工厂。

1.7 PRODUCER(生产者)

producer是Camel中的一个抽象概念,他表示可以创建和发送消息到一个Endpoint的主体。

当消息需要发送到Endpoint时,producer将创建一个Endpoint并用具体的消息数据填充它。例如,FileProducer将把消息body写入文件;一个JmsProducer,将把Camel消息在发送到JMS目的地之前映射为javax.js.message。

这在Camel中是一个重要的特性,因为它隐藏了与特定对象交互的复杂性。我们所需要做的就是把一个message路由到一个Endpoint,然后由producer来做这些繁杂的工作。

1.8 CONSUMER(消费者)

consumer是接收producer产生的message的服务,并将消息包装为exchange,然后还可将消息交给processor进行处理。

consumer要创建新的exchange,consumer将使用该exchange包装message。然后使用processor来启动exchange路由,并在Camel路由引擎中流转。

在Camel中有两种consumer:

  1. event-driven consumers:事件驱动的消费者
  2. polling consumers:轮询

1.8.1 EVENT-DRIVEN CONSUMER (事件驱动的消费者)

最熟悉的consumer可能是就是event-driven consumers事件驱动消费者,如下图所示:

image-20211012193501069

event-driven consumers事件驱动消费者大多是关联client-server架构和web服务,在EIP中被称为异步接收者。

event-driven consumers事件驱动消费者通过对特定的消息传递通道进行监听,比如TCP/IP端口或JMS队列,等待client向其发送消息。当一个

消息到达时,consumer苏醒并接受消息进行处理。

1.8.2 POLLING CONSUMER (轮询消费者)

polling consumers 轮询消费者,如下图所示:

image-20211012194042311

与event-driven consumers事件驱动消费者相反,polling consumers 轮询消费者主动轮询访问并从特定的消息源(例如FTP服务器)获取消息。

polling consumers 轮询消费者在EIP中也被称为同步接收器,因为它在完成当前消息的处理之前,不会轮询获取更多的消息。

常见的是定时轮询消费者,它通过预定的时间间隔进行轮询。文件、FTP和电子邮件传输都使用定时轮询消费者。

2. 简单demo

2.1 需求

使用Apache Camel,从一个文件夹(data/发件箱)读取文件,并将读取的文件结果写入另一个文件(data/发件箱)

2.2 demo代码

public class FileCopierWithCamel {
    public static void main(String args[]) throws Exception {
        CamelContext context = new DefaultCamelContext();
        context.addRoutes(new RouteBuilder() {
            public void configure() {
                from("file:data/inbox?noop=true")
                        .to("file:data/outbox");
            }
        });
        context.start();
        Thread.sleep(10000);
        context.stop();
    }
}

上面例子中,首先创建一个CamelContext,它是Camel运行时上下文。然后使用RouteBuilder和Java DSL 添加路由逻辑

通过DSL,可以简洁明了地让Camel实例化components组件、endpoint终端、consumers消费者、producer生产者等等。

而作为使用者的我们,仅仅需要关注的是为集成项目而定义的router路由。

但实际上,Camel会实际访问FileComponent,并使用它作为工厂来创建endpoint端点及producer生产者,同样的FileComponent也用于创建consumer消费者。

3. 企业集成相关概念

上面介绍了Apache Camel中的相关核心概念,其中大部分来源于Gregor Hohpe 和 Bobby Woolf 的优秀著作中企业集成模式](http://www.eaipatterns.com/toc.html),且Camel 支持其中的大部分。

这里对其中的重点概念做如下列举介绍:

3.1 消息系统(Message Endpoint)

类型说明解释
在这里插入图片描述Message Channel 留言频道一个应用程序如何使用消息传递与另一个应用程序通信?
在这里插入图片描述Message 信息一个消息通道连接的两个应用程序如何交换一条信息?
Pipes and Filters 管道和过滤器我们如何在保持独立性和灵活性的同时对消息进行复杂的处理?
在这里插入图片描述Message Router 消息路由器如何解耦各个处理步骤,以便根据一组条件将消息传递到不同的过滤器?
Message Translator 消息翻译器使用不同数据格式的系统如何使用消息传递相互通信?
图片Message Endpoint 消息终端应用程序如何连接到消息通道以发送和接收消息?

3.2 消息渠道(MESSAGING CHANNELS)

分类说明解释
在这里插入图片描述Point to Point Channel 点对点通道发送者如何确定只有一位接收者会收到内容或执行?
在这里插入图片描述Publish Subscribe Channel 发布订阅频道发送方如何向所有感兴趣的接收方广播事件?
在这里插入图片描述Dead Letter Channel 死信频道消息传递系统将如何处理它无法传递的消息?
在这里插入图片描述Guaranteed Delivery 保证交付即使消息传递系统出现故障,发件人如何确保消息会被传递?
在这里插入图片描述Channel Adapter 通道适配器如何将应用程序连接到消息传递系统,以便它可以发送和接收消息?
在这里插入图片描述Messaging Bridge 消息桥如何连接多个消息传递系统,以便在一个消息系统上可用的消息也可在其他消息系统上使用?
在这里插入图片描述Message Bus 消息总线什么样的架构可以让不同的应用程序协同工作,但以解耦的方式使应用程序可以轻松添加或删除而不会影响其他应用程序?
在这里插入图片描述Change Data Capture 变更数据捕获通过捕获对数据库所做的更改并将这些更改应用到另一个系统来实现数据同步。

3.3 消息构造(MESSAGE CONSTRUCTION)

分类说明解释
图片Event Message 事件消息如何使用消息传递将事件从一个应用程序传输到另一个应用程序?
在这里插入图片描述Request Reply 请求回复当应用程序发送消息时,它如何从接收者那里得到响应?
在这里插入图片描述Return Address 退货地址回复者如何知道将回复发送到哪里?
在这里插入图片描述Correlation Identifier 相关标识符收到回复的请求者如何知道这是针对哪个请求的回复?
在这里插入图片描述Message Expiration 消息过期发件人如何指示何时应将消息视为过时且不应处理?

3.4 消息路由(MESSAGE ROUTING)

分类说明解释
在这里插入图片描述Content Based Router 基于内容的路由器我们如何处理单个逻辑功能(例如库存检查)的实现分布在多个物理系统中的情况?
在这里插入图片描述Message Filter 消息过滤器组件如何避免接收无趣的消息?
图片Dynamic Router 动态路由器如何在保持其效率的同时避免路由器对所有可能目的地的依赖?
在这里插入图片描述Recipient List 收件人列表我们如何将消息路由到(静态或动态)指定收件人列表?
在这里插入图片描述Splitter 分路器如果一条消息包含多个元素,每个元素可能必须以不同的方式进行处理,我们如何处理它?
图片Aggregator 聚合器我们如何组合单独但相关的消息的结果,以便将它们作为一个整体进行处理?
在这里插入图片描述Resequencer 重测序器我们如何才能将相关但无序的消息流恢复到正确的顺序?
在这里插入图片描述Composed Message Processor 组合消息处理器在处理由多个元素组成的消息时,您如何维护整体消息流,每个元素可能需要不同的处理?
在这里插入图片描述Scatter-Gather 分散-聚集当一条消息需要发送给多个收件人时,您如何维护整个消息流,每个收件人都可能发送回复?
在这里插入图片描述Routing Slip 路线单当步骤序列在设计时未知并且可能因每条消息而异时,我们如何通过一系列处理步骤连续路由消息?
在这里插入图片描述Process Manager 流程管理当所需的步骤在设计时可能未知并且可能不是顺序的时,我们如何通过多个处理步骤路由消息?
在这里插入图片描述Message Broker 消息代理如何将消息的目的地与发送方分离并保持对消息流的中央控制?
在这里插入图片描述Throttler 限流我如何限制消息以确保特定端点不会过载,或者我们不会超过与某些外部服务达成的 SLA?
在这里插入图片描述Sampling 采样如何在给定时间内从众多消息中抽取一条消息以避免下游路由过载?
在这里插入图片描述Kamelet 模板我如何调用 Kamelets(路由模板)。
在这里插入图片描述Delayer 延迟器如何延迟发送消息?
在这里插入图片描述Load Balancer 负载均衡器如何在多个端点之间平衡负载?
在这里插入图片描述Circuit Breaker 断路器如果服务中断,如何停止调用外部服务?
在这里插入图片描述Service Call 服务调用如何在分布式系统中调用远程服务,该服务是从某种服务注册表中查找的?
在这里插入图片描述Saga 条件选择如何在 Camel 路线中定义一系列相关操作,要么成功完成(全部)要么不执行/补偿?
在这里插入图片描述Multicast 组播如何同时将消息路由到多个端点?
在这里插入图片描述Loop 循环如何在循环中重复处理消息?

3.5 消息转换(MESSAGE TRANSFORMATION)

分类说明解析
在这里插入图片描述Content Enricher 内容丰富如果消息发起者没有可用的所有必需数据项,我们如何与另一个系统通信?
在这里插入图片描述Content Filter 内容过滤器当您只对少数数据项感兴趣时,如何简化处理大消息的过程?
在这里插入图片描述Claim Check 索赔检查我们如何在不牺牲信息内容的情况下减少跨系统发送的消息的数据量?
在这里插入图片描述Normalizer 归一化器您如何处理语义相同但以不同格式到达的消息?
图片Sort 排序如何对邮件正文进行排序?
图片Script 脚本如何执行可能不会更改消息的脚本?
在这里插入图片描述Validate 校验如何验证消息?

3.6 消息端点(MESSAGING ENDPOINTS)

分类说明解释
在这里插入图片描述Messaging Mapper 消息映射器您如何在域对象和消息传递基础设施之间移动数据,同时保持两者相互独立?
在这里插入图片描述Event Driven Consumer 事件驱动的消费者应用程序如何在消息可用时自动使用它们?
图片Polling Consumer 轮询消费者当应用程序准备好时,应用程序如何消费消息?
在这里插入图片描述Competing Consumers 竞争消费者消息客户端如何同时处理多条消息?
在这里插入图片描述Message Dispatcher 消息分发器单个通道上的多个消费者如何协调他们的消息处理?
图片Selective Consumer 选择性消费者消息消费者如何选择它希望接收的消息?
在这里插入图片描述Durable Subscriber 持久订阅者订阅者如何避免在不收听消息时丢失消息?
在这里插入图片描述Idempotent Consumer 幂等消费者消息接收者如何处理重复消息?
在这里插入图片描述Transactional Client 交易客户客户端如何通过消息传递系统控制其事务?
图片Messaging Gateway 消息网关您如何封装从应用程序的其余部分对消息传递系统的访问?
在这里插入图片描述Service Activator 服务激活器应用程序如何设计服务以通过各种消息传递技术和非消息传递技术调用?

3.7 系统管理(MESSAGING ENDPOINTS)

分类说明解析
在这里插入图片描述ControlBus 控制总线我们如何有效地管理分布在多个平台和广泛地理区域的消息传递系统?
在这里插入图片描述Detour 消息绕行您如何通过中间步骤路由消息以执行验证、测试或调试功能?
在这里插入图片描述Wire Tap 消息监听您如何检查在点对点通道上传输的消息?
在这里插入图片描述Message History 消息历史在松耦合系统中,我们如何有效地分析和调试消息流?
在这里插入图片描述Log 日志如何记录处理消息?
在这里插入图片描述Step 步骤将一组 EIP 组合成一个复合逻辑单元,用于度量和监控。

文献:《Camel In Action》 Meeting Camel

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值