Apache Camel简介

2023-05-16

Apache Camel简介_abinge89的博客-CSDN博客

1. 什么是Camel

1.1 来源

Camel项目开始于2007年初,虽然年轻,但它已经是一个成熟的开源项目,基于自由的Apache 2许可,已拥有一个强大的社区。

Apache Camel项目之所以被命名为Camel,只因为简单好记而已,不过也有传言说这个名字的灵感来自于其中一个创始人,让曾抽过骆驼牌香烟。在骆驼的网站上有一个FAQ条目(http://camel.apache.org/why-the-name-camel.html)列出了其他理由,有兴趣可以去看下。

1.2 特点

  1. 路由引擎:Camel的核心是一个路由引擎,更准确地说是一个路由引擎构建器。它允许使用者定义自己的路由规则,根据路由规则决定从接收哪个源头的消息,然后经过自定义的处理,将消息发送到指定的目的地。Camel使用一种集成语言来定义相对复杂的路由规则,就像定义业务流程一样。

  2. 不关心数据类型:Camel的一个基本原则是它不规范数据类型,这样开发人员可以据此集成任何类型的系统,而不需关心这些系统处理的数据类型是怎样的。

  3. 不关心交互协议:Camel提供了更高级的抽象,允许您使用相同的API与各种系统进行交互,而不必关心这些系统使用的协议或数据类型是什么。而这些都是因为Camel本身已经提供了针对不同的协议和数据类型的API的特定实现; 目前Camel支持超过80个协议和数据类型,并且基于其可扩展和模块化架构,允许开发人员自定义实现逻辑并可无缝地插入到集成系统处理逻辑中。

基于上面的这些特点和其本身的体系结构,使得Camel不仅跑得快,而且很轻量。

另外,这里也要特别说明下,Camel不是企业服务总线,尽管有些人因为Camel支持路由、转换、监视、编排等这些功能而将其称为轻量级的ESB。但是Camel并没有引入具有容量或可靠的消息总线,不过Camel确实可以实现对消息总线的兼容,如Open-ESB、ServiceMix。所以Camel是集成框架,而不是ESB。

1.3 核心能力

1.3.1 路由引擎

上面已经提到过,Camel的核心是一个路由引擎,更准确地说是一个路由引擎构建器。

1.3.2 企业集成模式

在Gregor Hohpe和Bobby Woolf的《企业集成模式》一书中,其提到虽然企业系统集成有很多问题,但是很多问题和解决方法都很相似。这个就很像JAVA开发中共你的设计模式一样,企业系统集成也有一定的模式,或者说方法论可寻,这就是企业集成模式EIPs。Camel很大程度上是基于EIPs来实现的,虽然EIPs描述了很多集成问题和解决思路,但它只是解决思路,而Camel是用一种语言来具体实现了这些思路。

1.3.3 领域特定语言(DSL)

Camel的领域特定语言(DSL)是对系统集成的一个主要贡献。目前也有一起支持DSL的集成框架,但都是基于通用语言,而Camel与的不同之处在于,Camel提供了多语言的DSL,如常规编程语言Java、Scala、Groovy,并且Camel还支持通过XML定义路由规则。

DSL的目的是让开发人员专注于集成问题而不是集成工具(编程语言)。虽然Camle是Java开发的,但Camel支持多种语言混合编程。每种语言都有自己的特点和优势,我们可以使用不同的语言来完成不同的任务,然后使用Camel来进行自由的改造和整合。这里有一个例子:

  • Java DSL
from("file:data/inbox").to("jms:queue:order");
  • Spring DSL
<route>
 <from uri="file:data/inbox"/>
 <to uri="jms:queue:order"/> 
</route>
  • **Scala DSL **
from "file:data/inbox" -> "jms:queue:order"

1.3.4 丰富且可扩展的组件包库

Camel提供了可扩展的80多种组件(Component)包库,通过这些组件Component可以让Camel连上不同的通道,使用不同的API、识别不同的数据类型。

1.3.5 支持各种格式的消息内容

Camel可以路由各种形式的消息,绝不仅仅是只有XML格式,这也就意味着在路由的过程中不用把我们的消息内容转换成某一指定的规范格式。

1.3.6 模块化和可插拔的架构设计

Camel是模块化架构,允许将任何组件加载到其中,且无论组件是来自于Camel系统,还是任何其他第三方系统,亦或是我们自己构建的其他系统。

1.3.7 POJO模型

基于面向对象思想,在Camel中,bean(或pojo)被认为是一流的公民,并且Camel允许我们随时随地在集成项目中使用这些bean。据此,我们可以在很多地方把自己的自定义代码扩展到Camel的内置功能中。

1.3.8 易于配置

Camel基于"约定大于配置"(Convention Over Configuration)的原则,尽量减少配置任务;Camel提供了简便且人性化的URL配置方式,直接把端点(Endpoints)配在路由(Rourte)。

例如,配置一个文件消费者,目的是递归扫描子文件夹查找其中只包括.txt文件的文件夹,如下:

from("file:data/inbox?recursive=true&include=*.txt")...

1.3.9 类型自由转换

Camel内置了类型转换器,提供了150多种转换,比如字节数组转换为字符串,如果Camel现有不支持,那么我们可以自定义自己的类型转换器;不过目前常用的大多数类型的数据转换,Camel都已经做好了

1.3.10 轻量的核心

Camel的核心库只有大约1.6 MB,只依赖Apache Commons Logging和FuseSource Commons Management,是相当的轻量,所以我们可以把Camel很轻松的嵌入到到任何地方,如独立应用程序、web应用程序、Spring应用程序、JavaEE应用程序,JBI容器,OSGi bundle, Java Web Start或谷歌应用程序引擎。

这也是Camel的设计初衷,其不是作为服务器或ESB,而是嵌入到任何你需要的平台中。

1.3.11 提供测试组件

Camel提供了一个Test Kit,方便我们更容易地测试自己的Camel程序;这个测试套件包含了超过6000个单元测试。

1.3.12 活跃的社区

Camel有一个活跃的社区:https://camel.apache.org/community/

2. Camel的消息模型

2.1 消息模型分类

在Camel中,有两种用于消息模型:

1、org.apache.camel.message:实体消息,包含具体业务数据的消息,需要在Camel中路由的数据

2、org.apache.camel.Exchange:交换消息,是Camel的一个抽象概念,有"in"消息(入),"out"消息(出)

2.2 消息

消息是系统在使用时用来相互通信的实体消息通道。消息向着一个方向从发送者流到接收者,如图下图所示:

image-20211012161016088

消息有body(主体)、headers(头信息)、attachments(属性),如下图:

image-20211012161153156

消息使用字符类型的标识符进行唯一标识,标识符的惟一性是强制的;该标识符由消息创建者保证,没有固定格式,但并依赖不同的协议;若协议没有定义唯一性的消息标识,则Camel将会使用自己的UID生成器生成唯一标识。

2.2.1 消息头信息和属性(headers 和 attachments)

headers头信息是与消息相关的一些信息,如例如发送者UID、内容编码、认证等等;以k-v键值对形式存在,key需唯一且是不区分大小写的字符串,value为java对象。这意味着Camel没有施加任何类型约束。

attachments属性是消息的可选信息,通常用于web服务和电子邮件服务。

2.2.2 消息主体(body)

消息主体类型是java.lang.Object,所以消息主体可以存储任何类型的内容。

同时,这也意味着应用程序设计人员要确保接收者要能够理解待接收的消息内容。

当发送者和接收者使用不同的主体格式时,我们可以使用Camel提供的很多转换器来将消息主体转换为可接受的格式。

2.2.3 失败标志 (FAULT FLAG)

消息也有一个错误标志。一些协议和规范,如WSDL和JBI,是区分输出消息和错误消息的。它们都是对响应的校验操作,但后者错误消息明确指示一个不成功的结果。

一般来说,集成基础设施不处理错误,这应该是客户端和服务端协议的一部分;错误应该是在应用程序级别进行处理。

在Camel中,消息的路由是通过包含在Exchange中完成的。

2.3 Exchange

Camel中的一个exchange就是消息路由流转过程中的一个消息容器。

通过Exchange可以实现系统之间不同类型的集成,例如众所周知的MEPs(Message exchange patterns)。MEPs 被用来区分单向消息(one-way)和双向消息(request-response)。

在Camel中的Exchange可选择如下消息模式:

  1. InOnly:单向消息 (事件),例如JMS 消息
  2. InOut:双向消息(request-response),例如HTTP消息。

Exchange的包含的内容如下图:

image-20211012164511469

  1. Exchange ID:Exchange的唯一标识,若没有设置,则Camel将会自动生成一个默认的唯一标识;
  2. MEP:消息模式(Inonly或InOut),当InOnly模式时,Exchange只包含一种in消息。若是InOut模式,Exchange将会包含请求和响应;
  3. Exception:当消息路由流转过程中发生错误,那么将会有一个Exception设置到Exchange的这个属性中;
  4. Properties:相似消息头信息,但他们会持续贯穿某个消息的整个路由流转的全过程。这里面一般存放某个消息内容的全局性(global-leve)的属性信息,而消息头信息是用来标记消息本身的。在路由期间Camel框架将会添加自己的各种属性到Properties;同样作为开发者,我们通过Properties可以在消息路由流转交换的全生命周期内的任何地方保存或获取恢复全局性的某些属性;
  5. In message:输入消息,这是必需的,包含请求数据信息;
  6. Out message:输出消息,可选的,仅仅是Exchange的消息模式是InOut模式时才会有,包含响应数据信息。

3. Camel架构

3.1 Camel整体架构

Camel由processors处理器、components组件和routes路由组成,所有这些都是包含在CamelContext中的。
image-20211012170637947

  1. Routing engine:路由引擎,消息路由的详细说明;router路由是使用Camel的一种领域特定语言(DSL)定义的;
  2. Processors:消息处理器,消息路由流转期间的各种转换和操作,以实现各种EIP(企业集成模式);
  3. Components:组件,是Camel中连接其他系统的扩展点。

3.2 CamelContext(Camel运行时上下文)

CamelContext是一个容器,其保存了Camel运行时的所有系统碎片信息,下图展示了CamelContext中保留的值得注意的部分内容:

image-20211012172051626

service描述
Components包含所有运行时使用的组件,Camel能够在运行时动态加载组件(不管是通过类路径下的自动发现还是OSGI容器中的自动激活包)
Endpoints包含已创建的endpoints
Routes包含被添加的所有路由
Type converters包含已载入的所有类转换,Camel拥有手动或自动转换类型的机制
Registry包含可以查阅beans的注册表,默认情况下,它是JNDI registry;若基于Spring,则将是Spring ApplicationContext ;若使用OSGI容器,则将是OSGI registry
Languages包含载入的语言,Camel允许使用不同的语言创建表达式

文献:《Camel In Action》 Meeting Camel

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Apache Camel简介 的相关文章

随机推荐

  • CoreData的外键关联

    创建工程时勾选Use Core Data自动生成以下方法 AppDelegate h span class hljs preprocessor import span class hljs title lt UIKit UIKit h gt
  • 方向梯度直方图(Histogram Of Gradient)详解

    特征描述子 Feature Descriptor 特征描述子就是图像的表示 xff0c 抽取了有用的信息 xff0c 丢掉了不相关的信息 通常特征描述子会把一个w h 3 宽高3 xff0c 3个channel 的图像转换成一个长度为n的向
  • 第五周 D - 滑动窗口

    题目描述 ZJM 有一个长度为 n 的数列和一个大小为 k 的窗口 窗口可以在数列上来回移动 现在 ZJM 想知道在窗口从左往右滑的时候 xff0c 每次窗口内数的最大值和最小值分别是多少 例如 xff1a 数列是 1 3 1 3 5 3
  • Nextcloud基本使用方法

    下载和安装 Nextcloud 客户端 客户端可以在这里下载https nextcloud com install xff0c 您可以选择 Desktop 或者 Mobile 如果您是 Windows 用户 xff0c 可以直接点击这个链接
  • 一本通题解——1437:扩散

    题目链接 一本通OJ xff1a http ybt ssoier cn 8088 problem show php pid 61 1437 我的OJ xff1a http 47 110 135 197 problem php id 61 4
  • Ubuntu使用命令行配置WIFI

    事情起因 前面几天 xff0c 办公室切换网络 xff0c 导致老网络断线 今天办公地点调整了网络结构 xff0c 我的一个放在办公室拥有公网 IP 的 Ubuntu 18 04 服务器连接的内网 WIFI 发生变化 xff0c 需要用命令
  • 洛谷U149013题解

    洛谷U149013题解 前言题目解析逼死人的暴力正经的解析第一个程序第二个程序第三个程序第四个程序第五个程序第六个程序第七个程序第八个程序PS第九 十个程序 题解 结语 前言 今天我突发奇想 xff0c 在洛谷上创建了一道题目 xff0c
  • Codeforces游玩攻略

    Codeforces游玩攻略 1 简介2 网址3 使用1 主界面2 社区3 比赛名字颜色比赛种类比赛流程关于Codeforces赛制 xff1a 如何读懂排行榜Rating 4 题解 最后鸣谢 1 简介 Codeforces是全球最著名的在
  • MySQL连接不了本地服务器原因

    1 运行进入数据库报错 xff1a Could not acquire management access for administration RuntimeError Target host is configured as Windo
  • springboot、SpringCloud 常见版本版本介绍

    官方版本号 xff08 2023年5月6日 xff09 Spring Boot 版本说明 Spring Boot的版本号分析 xff1a Spring Boot的版本以数字表示 例如 xff1a Spring Boot 2 4 1 RELE
  • 热点账户及解决方案

    百度安全验证 我们经常听到一个概念 热点账户 xff0c 可能很多人不陌生什么是热点账户 xff0c 但是对如何解决热点账户问题并没有系统性的完整的思路 事物总是发展的 xff0c 事物所处的场景也是在不断变化的 xff0c 基于有限的经验
  • 笔记:vue 打包忽略部分文件检查。

    在需要 忽略的文件中加入 eslint disable 1 js 文件 首行直接加入 eslint disable 2 vue文件 script 中加入 eslint disable 3 配置文件进行配置 看大佬文章 vue中指定文件或文件
  • 公有云相关概念——region和AZ、VPC、安全组、公有云网络架构

    https www cnblogs com yunjisuanchengzhanglu p 16164376 html 一 region和az region xff08 区域 xff09 xff1a 一个region可以理解为一个大的独立的
  • Java四大引用详解:强引用、软引用、弱引用、虚引用

    Java四大引用详解 xff1a 强引用 软引用 弱引用 虚引用 java 软引用 mikechen的互联网架构的博客 CSDN博客 1 Java引用 从JDK 1 2版本开始 xff0c 对象的引用被划分为4种级别 xff0c 从而使程序
  • 延时队列方案选择及优缺点分析

    1 前言 https juejin cn post 6987233263660040206 在电商 支付等领域 xff0c 往往会有这样的场景 xff0c 用户下单后放弃支付了 xff0c 那这笔订单会在指定的时间段后进行关闭操作 订单关闭
  • 定时任务方案的正确选取

    在电商 支付等领域 xff0c 往往会有这样的场景 xff0c 用户下单后放弃支付了 xff0c 那这笔订单会在指定的时间段后进行关闭操作 xff0c 细心的你一定发现了像某宝 某东都有这样的逻辑 xff0c 而且时间很准确 xff0c 误
  • Redis教程总结

    Redis redis 时间轮 夜猫吃夜宵的博客 CSDN博客 一 Redis特性 快 为什么快 xff1f 基于内存操作 xff0c 操作不需要跟磁盘交互 本身就是k v结构 xff0c 类似hashMap xff0c 所以查询速度接近O
  • Shiro和Spring Security对比(3)

    https www cnblogs com hanease p 15906339 html 1 两个基本的概念 安全实体 xff1a 系统需要保护的具体对象数据权限 xff1a 系统相关的功能操作 xff0c 例如基本的CRUD 1 2 S
  • springboot整合邮箱功能一(实战)

    背景介绍 邮件发送其实是一个非常常见的需求 xff0c 用户注册 xff0c 找回密码 校验码等地方 如果使用短信还需缴费 这里发送者邮箱选用了163邮箱 1 pom xml文件的引用 lt xml version 61 34 1 0 34
  • Apache Camel简介

    Apache Camel简介 abinge89的博客 CSDN博客 1 什么是Camel 1 1 来源 Camel项目开始于2007年初 xff0c 虽然年轻 xff0c 但它已经是一个成熟的开源项目 xff0c 基于自由的Apache 2