目录

沈超琦的个人博客

Stay Foolish,Stay Hungry

X

Day03-ApacheCamel的架构介绍

Camel in action2 学习笔记

  1. 什么是camel

    ** 从头开始构建复杂的系统是一项代价高昂的工作,而且几乎很难成功。 一种有效且风险较小的替代方案是从现有的、经过验证的组件组装一个像拼图游戏一样的系统。 我们每天都依赖于大量这样的集成系统,这让电话通信、金融交易和医疗保健到旅行计划和娱乐的一切成为可能。一个好的集成框架为您正在集成的复杂系统提供简单、可管理的抽象,以及将它们无缝连接在一起的“粘合剂”。**

    ** Apache Camel 就是这样一个集成框架。 我将帮助您了解 Camel 是什么、如何使用它以及为什么我们认为它是最好的集成框架之一。首先介绍 Camel 并突出显示它的一些核心功能。 然后我们将展示骆驼分发并解释如何运行 Camel 示例书。 我们将通过引入核心 Camel 来结束本章将概念放到表格中,以便您了解 Camel 的建筑学。
    ****你准备好了吗? 让我们认识骆驼。 **

    1.1

    ** **Camel 是一个集成框架,旨在使您的集成项目富有成效和乐趣。 骆驼项目是2007年初开始,现在是一个成熟的开源项目,在自由的 Apache 2 许可下可用,具有强大的社区。Camel 的重点是简化集成。 我们有信心当你读完这些页面时,你会很感激Camel 并将其添加到您的必备工具列表中。这个 Apache 项目被命名为 Camel,因为它的名字是简短易记。 传闻它的名字可能是灵感来自曾经被其中一位吸过的骆驼香烟创始人。

    1.1.1 WHAT IS CAMEL?

    ** Camel 框架的核心是一个路由引擎——或者更多准确地说,是一个路由引擎构建器。 它允许你定义你的
    自己的路由规则,决定从哪些来源接受消息,并确定如何处理和发送这些消息到其他目的地的消息。 Camel 使用集成语言允许您定义复杂路由规则的语言,类似于业务流程。 如图1.1,Camel形成胶水不同系统之间。Camel 的基本原则之一是它不关于您需要处理的数据类型的假设。 这是很重要的一点,因为它给了你,开发者,有机会集成任何类型的系统,而无需将您的数据转换为规范格式。
    image20210803150244454.png
    Camel 提供了更高级别的抽象,允许您进行交互通过使用相同的 API 与各种系统,而不管系统使用的协议或数据类型。组件在Camel 提供了 API 的特定实现不同的协议和数据类型。开箱即用,骆驼来了支持超过 280 种协议和数据类型。它的可扩展和模块化的架构允许您实现并无缝插入对您自己的协议的支持,专有与否。这些架构选择消除了需要不必要的转换并使 Camel 不仅更快但也精益求精。因此,它适合嵌入到其他需要 Camel 丰富处理能力的项目。其他开源项目,如 Apache ServiceMix、Karaf、和 ActiveMQ,已经使用 Camel 作为执行

    一体化。我们还应该提到骆驼不是什么。骆驼不是企业服务总线 (ESB),尽管有些人称 Camel 为
    轻量级 ESB,因为它支持路由,转换、编排、监控等。骆驼没有容器或可靠的消息总线,但它可以
    部署在一个中,例如前面提到的 Apache ServiceMix。出于这个原因,我们更喜欢称 Camel 为
    集成框架而不是 ESB。如果仅仅提到 ESB 就带回了巨大的回忆,复杂的部署,不要害怕。骆驼同样在家里
    **微小的部署,如微服务或物联网(IoT) 网关。要了解 Camel 是什么,让我们来看看它的主要特征。
    1.1.2 Camel’s message model(camel的消息模型)

** Camel 使用两个抽象来建模消息
org.apache.camel.Message——包含的基本实体在 Camel 中传输和路由的数据。****
org.apache.camel.Exchange——Camel 抽象消息的交换。 这种消息交换有一个输入消息,作为回复,输出消息。**

我们将从查看消息开始,以便您了解方式数据在 Camel 中建模和携带。 然后我们将向您展示如何“对话”是由交易所在 Camel 中建模的。**
**1.3.1 MESSAGE

** ****消息是系统用来与之通信的实体 在使用消息传递渠道时彼此。 消息流入 一个方向,从发送者到接收者,如图 1.5. **image20210803151250681.png
消息具有body(有效负载)、header(标题)和可选的附件(optional attachments),如图 1.6 所示。image20210803151538131.png

消息由类型标识符唯一标识java.lang.String。 标识符的唯一性被强制执行并且由消息创建者保证,它依赖于协议,并且它没有保证的格式。 对于未定义唯一消息标识方案的协议,Camel 使用其自己的ID生成器。

HEADERS AND ATTACHMENTS

** 消息头(headers)是与消息关联的值,例如发件人标识符、关于内容编码的提示、身份验证信息等。 消息头是键值对; 名字是唯一的、不区分大小写的字符串,并且值的类型为java.lang.Object。 骆驼对类型没有限制标题。 消息头的大小也没有限制
**或消息中包含的消息头数量。 消息头在消息中存储为映射。 一条消息也可以有可选附件,通常用于网络服务和电子邮件组件。

BODY

** ****Body是 java.lang.Object 类型,因此消息可以存储任何 类型的内容和任何大小。 这取决于应用程序设计人员 确保接收方能够理解接收方的内容 信息。 当发送方和接收方使用不同的body格式,Camel 提供了将数据转换为 一种可接受的格式,在这些情况下会发生转换 在幕后自动使用类型转换器。 **
FAULT FLAG(故障标识)

** 消息也有故障标志。 一些协议和SOAP Web 服务等规范区分输出和故障信息。 他们都是对的有效回应调用操作,但后者表示不成功结果。 通常,集成不处理故障基础设施。 它们是客户之间合同的一部分和服务器并在应用程序级别处理。在路由期间,消息包含在exchange中。 **

1.3.2 EXCHANGE**(交换机)**

exchange是路由期间消息的容器。 exchange还为系统之间的各种类型的交互提供支持,也称为消息交换模式 (MEP)。 MEP 用于区分单向和请求-响应消息传递样式。 Camel 交换拥有一个模式属性,可以是以下之一:

InOnly — 单向消息(也称为事件消息)。例如,JMS 消息传递通常是单向消息传递。**
**InOut - 请求-响应消息。 例如,基于 HTTP传输通常是请求-回复:客户端提交一个网络请求,等待服务器的回复。
图 1.7 说明了 Camel 中exchange的内容。image20210803153316727.png

让我们来看一下图1.7中的详细内容

ExchangeID** — 标识交换的唯一 ID。骆驼自动生成唯一 ID。**

MEP** — 一种模式,表示您使用的是 InOnly 还是InOut 消息模式。当模式为 InOnly 时,交换包含 in 消息。对于 InOut,还存在一条 out 消息,其中包含请求者者的回复消息。**

Exception** — 如果在路由过程中的任何时间发生错误,异常将在异常字段中设置。**

Properties(属性)** — 类似于消息头,但它们持续整个交换的持续时间。属性用于包含全局级别的信息,而消息头是特定的****
到一个特定的消息。路由期间的交换中camel本身就增加了各种属性。作为开发人员,您可以在路由交换的整个生命周期中存储和检索检索属性.
In message
- 这是输入消息,这是必需的。in message 包含请求消息。**

Out message**—这是一个可选消息,仅当MEP 是 InOut。 out 消息包含回复消息。**

Exchange在路由的整个生命周期中是相同的,但是消息可以改变,例如,如果消息是从一种格式转换为另一种格式。**
**我们在架构之前讨论了 Camel 的消息模型,因为我希望您对什么是camel中的消息有所了解。毕竟,最重要的就是camel message。你现在已经准备好学习了更多关于 Camel 及其架构的信息。

1.4 Camel的架构image20210803154754463.png

**路由引擎使用路由routes作为指示位置的规范标识在哪里消息被路由。 路由被camel定义的某一种DSL所定义。 Processors(处理器)用于转换和操作 路由期间的消息以及实现所有 DSL 中有定义相应名称的EIP。 组件是 Camel 中用于添加与其他连接系统的扩展点。 组件提供端点接口将这些系统暴露给 Camel 的其余部分。 有了这个高级视图,让我们仔细看看 图 1.8 中的各个概念。 **

1.4.2 CAMEL CONCEPTS

我们将从 CamelContext 开始,它是Camel 的运行时间。

你可能已经猜到 CamelContext 是一个容器,从图 1.8 来看。 您可以将其视为 Camel 的运行时系统,将所有部分融合在一起。类似于spring容器的contextimage20210803155833060.png

ServiceDescription(描述)
Components(组件)包含使用的组件。 骆驼能够装载通过类路径上的自动发现或当在xml中被定义
Endpoints(端点)包含了被使用的端点
Routes(路由)包含了被使用的路由
Typeconverters(类型转换器)包含加载的数据格式。
Registry(注册表)包含允许您查找 bean 的注册表
Langueges包含加载的语言。 Camel 允许您使用多种语言来创建表达式。如XPATH,cron等

现在让我们看一下路由和 Camel 的路由引擎!

ROUTING ENGIN

Camel 的路由引擎是在引擎下转移消息。该引擎不向开发人员公开,但您应该意识到它就在那里并且它完成了所有繁重的工作,**
**确保正确路由消息。
ROUTES

路由显然是 Camel 的核心抽象。 最简单的定义路由的方法是作为一个处理器链。 有许多在消息传递应用程序中使用路由器的原因。 经过将客户端与服务器解耦,将生产者与消费者解耦,路由可以执行以下操作:

动态决定客户端将调用哪个服务器

**提供一种灵活的方式来添加额外的处理 **

允许客户端和服务器独立开发

增强某些系统(例如消息代理和 ESB)的特性和功能

允许服务器的客户端被剔除(使用模拟)以进行测试

Camel 中的每条路由都有一个唯一标识符,用于记录、调试、监控以及启动和停止
DOMAIN-SPECIFIC LANGUAGE(特定领域语言)

要将处理器(processors)和端点(endpoints)连接在一起以形成路由,Camel定义一个 DSL。 术语 DSL 在这里使用得有点松散。 在骆驼中,DSL 表示流畅的 Java API,其中包含命名为EIP的规范条款。

考虑下面这个例子

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

在这里,在单个 Java 语句中,您定义了一个使用来自文件端点的文件的路由。 然后将消息路由到filter(过滤器) EIP,它将使用 XPath 来测试消息是否不是测试订单。 如果消息通过测试,则将其转发到 JMS 端点。 未通过过滤器测试的消息将被丢弃。**
**Camel 提供了多种 DSL 语言,因此您可以使用 XML DSL 定义相同的路由,如下所示:

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

DSL 为 Camel 用户提供了一个很好的抽象来构建应用程序。 然而,在引擎盖(就是指不对开发人员暴露的内部引擎流程)下,路由是由processors(处理器)图组成的。 让我们花点时间看看processor(处理器)是什么。

PROCESSOR

处理器是一个核心 Camel 概念,代表一个能够使用、创建或修改传入交换(exchange)的节点。 在路由期间,交换(exchange)从一个处理器流向另一个处理器; 因此,您可以将路线视为具有专用处理器作为节点的图形,以及将一个处理器的输出连接到另一个处理器的输入的线。 处理器可以是 EIP 的实现、特定组件的生产者或您自己的自定义创建。 图 1.10 显示了处理器之间的流程。image20210803163914076.png
路由首先从填充初始交换的消费者(想想 DSL 中的“from”)开始的。 在每个处理器步骤中,来自上一步的输出消息是下一个步骤的输入消息。在许多情况下,处理器不设置输出消息,因此在这种情况下,输入消息被重用。 在路由结束时,交换机(exchange)的 MEP 确定是否需要发回回复送回路由的调用者。 如果 MEP 是 InOnly,则不会有任何回复送回。 如果是 InOut,Camel 会从最后一步并返回。

Camel 中的生产者和消费者乍一看似乎有点违反直觉。 毕竟,生产者不应该是第一个节点,消费者不应该在路由的末尾消费消息吗? 别担心——你不是第一个有这种想法的人! 只需从与外部系统通信的角度考虑这些概念。 消费者消费来自外部系统的消息并将它们带入路由。 另一方面,生产者向外部系统发送(生产)消息。

**交换如何进入或退出此处理器图? 要找到答案,您需要查看组件和端点。 **
COMPONENT

组件是 Camel 中的主要扩展点。 迄今为止,Camel 生态系统拥有 280 多个组件,其功能范围从数据传输到 DSL,再到数据格式等等。 你甚至可以为 Camel 创建你自己的组件。 从编程的角度来看,组件相当简单:它们与 URI 中使用的名称相关联,并且它们充当端点的工厂 . 例如,FileComponent 由 URI 中的文件引用,并创建 FileEndpoints。 端点(ENDPOINT)可能是 Camel 中一个更基本的概念。

ENDPOINT

端点是 Camel 抽象出来的,它模拟系统可以通过它发送或接收消息的通道的末端。 如图 1.11 所示image20210804163207728.png
在 Camel 中,您使用 URI 配置端点,例如 file:data/inbox?delay=5000,并且您也以这种方式引用端点。 在运行时,Camel 根据 URI 表示法查找端点。 图 1.12 显示了这是如何工作的。image20210804163330916.png
1 表示哪个 Camel 组件处理该类型的端点。 在这个案例下,file的scheme选择了 FileComponent。 FileComponent 然后作为工厂工作,根据 URI 的其余部分创建 FileEndpoint。 Context Path data/inbox 2 告诉 FileComponent 起始文件夹是 data/inbox。 选项 delay=5000 3 表示应以 5 秒的间隔轮询文件。

终端绝对不仅仅只是我们看到的这么简单。 图 1.13 显示了端点如何与交换、生产者和消费者一起工作。 乍一看,图 1.13 可能看起来有点难以理解,但几分钟后就会明白一切。 简而言之,端点充当工厂,用于创建能够向特定端点接收和发送消息的消费者和生产者。 我们没有在图 1.8 中 Camel 的高级视图中提到生产者或消费者,但它们是重要的概念。 我们接下来会讨论它们。

PRODUCER

生产者是 Camel 的抽象概念,指的是能够向端点发送消息的实体。 图 1.13 说明了生产者适合其他 Camel 概念的地方。 当消息发送到端点时,生产者处理获取与该特定端点兼容的消息数据的细节。 例如, FileProducer 将消息正文写入文件。 另一方面,JmsProducer 会将 Camel 消息映射到 javax.jms.Message,然后再将其发送到 JMS 目标。 这是 Camel 的一个重要特性,因为它隐藏了与特定传输交互的复杂性。 您需要做的就是将消息路由到端点,然后生产者完成繁重的工作。image20210804164848290.png

CONSUMER

**消费者是接收一些外部系统产生的消息并且将它们包装在一个exchange中,然后将它们发送以进行处理(processed)的服务。 Consumers are the source of the exchanges being routed in Camel. (不会翻译了.....)。 回顾图 1.13,您可以看到消费者与其他 Camel 概念的契合点。 为了创建一个新的交换(exchange),消费者将使用包装正在消费的有效负载的端点。 然后使用处理器(processor)通过路由引擎在 Camel 中启动交换的路由。 Camel 有两种消费者:事件驱动消费者和轮询消费者。 这些消费者之间的差异很重要,因为它们有助于解决不同的问题。 **
EVENT-DRIVEN CONSUMER

**我们最熟悉的消费者可能是事件驱动的消费者,如图 1.14 所示。 **image20210804170913829.png
** 事件驱动的消费者会在消息到达之前保持空闲状态,直到某一个时刻消息到达此时它会醒来并消费该消息。 **

这种消费者主要与客户端-服务器架构和 Web 服务相关联。 在 EIP 世界中,它也被称为异步接收器。 事件驱动的使用者侦听特定的消息传递通道,例如 TCP/IP 端口、JMS 队列、Twitter 句柄、Amazon SQS 队列、WebSocket 等。 然后它等待客户端向它发送消息。 当消息到达时,消费者唤醒并接受消息进行处理。

POLLING CONSUMER

另一种消费者是轮询消费者,如图 1.15 中。image20210804171253717.png

轮询消费者会主动检查新消息。

与事件驱动的消费者相反,轮询消费者积极地从特定来源(例如 FTP 服务器)获取消息。 轮询消费者在 EIP 术语中也称为同步接收器,因为它在处理完当前消息之前不会轮询更多消息。 轮询消费者的一种常见形式是预定轮询消费者,它按预定时间间隔进行轮询。 文件、FTP 和电子邮件组件都使用预定轮询消费者。 我们现在已经涵盖了 Camel 的所有核心概念。 有了这些新知识,让我们来重温下一开始的概念

1.5 Your first Camel ride, revisited

回想一下,在您第一次骑骆驼时(第 1.2.2 节),您从一个目录(data/inbox)读取文件并将结果写入另一个目录(data/outbox)。 现在您已经了解了 Camel 的核心概念,您可以正确看待这个例子。 再看一下以下清单中的 Camel 应用程序。

import org.apache.camel.CamelContext;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.impl.DefaultCamelContext;
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 runTime。 然后,您可以使用 RouteBuilder 和 Java DSL添加路由逻辑。 通过使用 DSL,您可以干净简洁地让 Camel 实例化组件、端点、消费者、生产者等。 您需要关注的只是定义对您的集成项目很重要的路由。 然而,在幕后,Camel 正在访问 FileComponent,并将其用作工厂来创建端点及其生产者。 同样的 FileComponent 也用于创建消费者端。

1.6 Summary

在本章中,您看到了 Camel 如何通过依赖企业集成模式 (EIP) 来简化集成。您还看到了 Camel 的 DSL,它旨在使 Camel 代码自记录并让开发人员专注于胶水代码的编写,而不是它是如何做到的。

我们介绍了 Camel 的主要功能,Camel 是什么,不是什么,以及它可以在哪里使用。 我们展示了 Camel 如何提供抽象和适用于各种协议和数据格式的 API。

此时,您应该对 Camel 的作用及其基本概念有了很好的了解。 很快,您将能够自信地浏览 Camel 应用程序并很好地了解它们的作用。


标题:Day03-ApacheCamel的架构介绍
作者:sharkshen@outlook.com
地址:https://www.linkjb.com/articles/2021/10/15/1634311671376.html