Camel(01) - 简要介绍

引言

最近实习中接触到的项目使用Apache Camel作为服务间的路由,深感Camel强大之处,于是决定深入学习Camel的原理及使用。
我在学习Camel的过程中主要以阅读Camel的官方文档以及《Camel in Action》书籍和编写Demo练习的方式。这一系列文章将围绕Camel的背景、作用、特色、组件等详细介绍Camel的原理和使用。

Apache Camel是一个功能强大的开源集成框架,基于已知的企业集成模式和强大的bean集成。Camel项目于2007年初启动,Camel的重点是简化集成。Camel框架的核心是路由引擎,或者更确切地说是一个路由引擎建造者。它允许自定义路由规则,从中决定来源接受消息并确定如何处理和发送这些消息到其他目的地。Camel吸引我的地方也正是其灵活的路由,再佐以可插拔的组件,使其可以在不同的应用中灵活的传递、转换和控制消息。

Camel的原则之一是它没有做出任何假设你需要处理的数据类型,这是一个重点,因为我们有机会集成任何类型的系统,从而无需将数据转换为规范格式。

介绍

Camel允许您创建EIP(Enterpise Integration Patterns, 企业集成模式),以基于Java的DSL(Domain Specific Language, 域特定语言)或Fluent API,通过Spring或Blueprint的xml配置文件或者通过Scala DSL来实现路由和中介规则。这意味着无论是在Java、Scala或者是XML编辑器中都可以在IDE中使用自动提示从而智能地完成路由规则。

Apache Camel使用URIs,因此它可以借助可插入的数据格式选项轻松的与任何类型的传输或消息传递模型(如HTTP、ActiveMQ、JMS、JBI、SCA、MINA或CXF)一起使用。Apache Camel是一个小型的库,具有最小的依赖性,可以轻松嵌入任何Java应用程序。无论使用何种传输方式,Apache Camel都使用相同的API,因此只需要学习一次API即可与开箱即用的所有组件进行交互。

Apache Camel具有强大的Bean绑定功能,可与Spring、CDI、Blueprint和Guice等流行框架无缝集成。

Apache Camel拥有广泛的测试支持,可以轻松的对路由进行单元测试。

组件

Apache Camel附带了许多组件,数据格式和语言等。

DSL

以下示例为路由文件从文件夹到JMS对列。

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

Camel DSL使用Java等真正的编程语言,因此您可以使用现有的工具支持。在这里,您可以看到Eclipse IDE的自动完成功能如何为我们提供DSL列表:

路由自动提示
路由自动提示

Camel消息模型

在Camel中有两种消息模型的抽象。

  • org.apache.camel.Message
  • org.apache.camel.Exchange

Message

Message是系统在使用时彼此通信的实体消息渠道。Message从发送者到接收者以一个方向流动:

Message消息流图
Message消息流图

Message有一个Body、headers和可选的attachments:

Message结构图
Message结构图

Exchange

Camel中的Exchange是路由期间消息的容器,Exchange也为系统之间的各种类型的交互提供支持,也成为消息交换模式MEP。

  • ExchangeID
    一个Exchange贯穿着整个编排的路由规则,ExchangeID就是它的唯一编号信息,同一个路由规则的不同实例(对路由规则分别独立的两次执行),ExchangeID不相同。

  • from Endpoint
    表示exchange实例初始来源的Endpoint控制端点(类的实例),一般来说就是开发人员设置路由时由“from”关键字所表达的Endpoint。

  • properties
    Exchange对象贯穿整个路由执行过程中的控制端点、处理器甚至还有表达式、路由条件判断。为了让这些元素能够共享一些开发人员自定义的参数配置信息,Exchange以K-V结构提供了这样的参数配置信息存储方式。在 org.apache.camel.impl.DefaultExchange 类中,对应properties的实现代码如下所示:

    public Map<String, Object> getProperties() {
        if (properties == null) {
            properties = new ConcurrentHashMap<String, Object>();
        }
        return properties;
    }
    
  • Pattern
    Exchange中的pattern属性非常重要,它的全称是:ExchangePattern(交换器工作模式)。其实现是一个枚举类型: org.apache.camel.ExchangePattern 。可以使用的值包括:InOnly, RobustInOnly, InOut, InOptionalOut, OutOnly, RobustOutOnly, OutIn, OutOptionalIn。从Camel官方已公布的文档来看,这个属性描述了Exchange中消息的传播方式:

    Exchange结构图1
    Exchange结构图1
    Exchange结构图2
    Exchange结构图2

Exchange中的Message

Exchange中还有两个重要属性inMessage和outMessage。这两个属性分别代表Exchange在某个处理元素(处理器、表达式等)上的输入消息和输出消息。

当控制端点和处理器、处理器和处理器间的Message在Exchange中传递时Exchange会自动将上一个元素的输出值作为作为这个元素的输入值进行使用。但是如果在上一个处理器中,开发人员没有在Exchange中设置任何out message内容(即Excahnge中out属性为null),那么上一个处理器中的in message内容将作为这个处理器的in message内容。

Camel架构

Camel架构图
Camel架构图

CamelContext

CamelContext结构图
CamelContext结构图

Routes

  • 动态决定客户端将调用哪个服务器
  • 提供灵活的方式来添加额外的处理
  • 允许独立开发客户端和服务器
  • 允许将服务器的客户端存根(使用模拟)进行测试
  • 增强某些系统的功能和特性(例如消息代理和ESBs)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,681评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,710评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,623评论 0 334
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,202评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,232评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,368评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,795评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,461评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,647评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,476评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,525评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,226评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,785评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,857评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,090评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,647评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,215评论 2 341

推荐阅读更多精彩内容