Apache Camel簡介以及使用場景

我們要解決的問題以及解決方案

我們要解決的問題

企業應用集成

  1. 完成組織內外的各種異構系統、應用、數據源之間共享和交換信息。
  2. 優化現有結構,使整個系統易於拓展和維護。
  3. 保證多個系統各自獨立互不干擾。

總結髮現我們實際要解決的問題是:企業應用集成(Enterprise Application Integration,EAI) 是完成在組織內、外的各種異構系統,應用和數據源之間共享和交換信息和協作的途徑,方法學,標準和技術。

EAI的常用解決方案

SOA架構模型

SOA架構
SOA(Service Oriented Architecture) 中文釋義爲 “面向服務的架構”它是一種設計理念,其中包含多個服務, 服務之間通過相互依賴最終提供一系列完整的功能。各個服務通常以獨立的形式部署運行,服務之間通過網絡進行調用。要求各個服務遵循統一的規範和契約。

ESB企業服務總線

ESB架構
ESB(Enterprise Service Bus,即企業服務總線) 就是一根管道,用來連接各個服務節點。ESB的存在是爲了集成基於不同協議的不同服務,ESB 做了消息的轉化、解釋以及路由的工作,以此來讓不同的服務互聯互通

如何實現ESB

企業集成模式
當前實現ESB比較成熟的模型爲EIP(Enterprise Integration Patterns)1。他的包含如下規範:

  • 集成方式(Integration Styles):EIP規定所有集成模式要基於消息傳送模式。
  • 通道模式(Channel Patterns):消息通過通道進行傳遞。
  • 消息體模式(Message Construction Patterns):描述了在消息系統中交互的消息的規範。
  • 路由模式(Routing Patterns):消息如何從發送者分發到正確的接收者,中間一般不進行修改。
  • 轉換模式(Transformation Patterns):將消息體的內容修改爲接收者可以理解的結構,中間可能要對數據進行修改或者篩選。
  • 終端模式(Endpoint Patterns):生成或者接收消息的客戶。
  • 系統管理模式(System Management Patterns):提供監控整個系統狀態的工具,包括錯誤處理,壓力測試或者監控系統變化。

爲什麼使用Camel

當前熱門的EIP集成框架分別有:Spring Integration、Mule ESB、Apache Camel。接下來分別對三個框架進行分析(打分爲博主的評估,僅供參考):
Spring Integration
Spring Integration只提供了非常基礎的支持,如文件,FTP,JMS,TCP,HTTP或Web服務。集成是通過編寫大量的XML代碼(沒有一個真正的DSL)實現的。使用它,寓意着大量的XML編寫工作
Mule ESB
Mule ESB不是僅僅一個集成框架,而是一個包括一些額外功能的完整ESB,比Spring集成它更像是一個DSL。
因爲是一個完整的ESB,所以集成邏輯會比較複雜
Apache Camel
Apache Camel實現了你能想到的幾乎每一個技術,提供很多組件,同時你可以很容易的自定義組件。而且Camel和Spring的集成很完善。Camel可以實現用到才依賴,不用不依賴。

Camel可以做什麼

Apache Camel簡介

Apache camel 是一個基於EIP的開源框架。實現了EIP定義的一些不同應用系統之間的消息傳輸模型,包括常見的Point2Point、Pub/Sub模型。
Message System
Camel的消息傳遞系統(Message System)2:

  • 終端(Message Endpoint):可以是異構的業務系統,都需要提供Endpoint實現集成。
  • 通道(Message Channel):兩個應用之間進行信息通訊的通道。
  • 消息(Message):Endpoint之間交互的標準化單位。
  • 路由(Message Router):根據一定的條件,將消息傳遞給不同的過濾器以實現對單個處理步驟的解耦。
  • 轉換器(Message Translator):消息在傳輸過程中的轉換和數據映射,包括報文格式轉換和內容轉換映射。
  • 管道和過濾器(Pipes & Filters):在保持獨立性和靈活性的基礎上,對複雜的消息進行處理。

Camel的應用場景

  • 消息匯聚:比如將來自不同服務器的數據,有ActiveMQ、RabbitMQ、WebService等的數據合成報表。
  • 消息分發:將消息從消息生產者轉發給消息接收者,分發方式分爲兩種:順序分發&並行分發。
from("amqp:queue:order")
.to("uri:validateBean", "uri:handleBean", "uri:emailBean");

from("amqp:queue:order")
.multicast()
.to("uri:validateBean", "uri:handleBean", "uri:emailBean");
  • 消息轉換:將消息內容進行轉換,比如xml轉爲json格式。
from("amqp:queue:order")
.process(new XmlToJsonProcessor())
.to("bean:orderHandler");
  • 規則引擎:可以使用Spring XML配置或DSL來定義route。同時camel提供了大量內置Processor,用於邏輯運算、過濾等,這樣更容易靈活的管理route。
<route>
    <from uri="amqp:queue:order"/>
    <multicast>
        <to uri="uri:validateBean"/>
        <to uri="uri:handleBean"/>
        <to uri="uri:emailBean"/>
    </multicast>
</route>
from("amqp:queue:order")
.filter(header("foo")
.isEqualTo("bar"))
.choice()
.when(xpath("/person/city = &#39;London&#39;"))
  .to("file:target/messages/uk")
.otherwise()
  .to("file:target/messages/others");

Camel的核心要素

Camel核心要素
Camel有以下五要素:3

  • Endpoint:用於收發消息。
  • Exchange:消息本體。
  • Processor:消息處理器。
  • Routing:路由規則。
  • Service:Camel基礎概念。

Endpoint

Endpoint

  • Endpoint是Camel與其他系統進行通信的設定點。

  • Camel自身提供了廣泛的通信協議支持,例如:RPC協議、HTTP協議、FTP協議……

  • Camel中的Endpoint使用URI描述對目標系統的通信。

  • 對Endpoint實例的創建通過對Camel中org.apche.camel.Component接口的實現來實現的。

  • Camel通過Plug方式提供對各種協議的Endpoint支持,如果需要使用某種Endpoint,需要引入響應的plug。例如要使用Camel對Netty4-Endpoint的支持,要引入camel-netty4的依賴包。

Exchange

Exchange

  • Properties:Exchange對象貫穿整個路由執行過程中的控制端點、處理器甚至還有表達式、路由條件判斷。爲了讓這些元素能夠共享一些開發人員自定義的參數配置信息,Exchange以K-V結構提供了這樣的參數配置信息存儲方式。

  • Patterns:Exchange中的pattern屬性非常重要,它的全稱是:ExchangePattern(交換器工作模式)。其實現是一個枚舉類型:org.apache.camel.ExchangePattern。可以使用的值包括:InOnly, RobustInOnly, InOut, InOptionalOut, OutOnly, RobustOutOnly, OutIn, OutOptionalIn。從Camel官方已公佈的文檔來看,這個屬性描述了Exchange中消息的傳播方式。

  • Message IN/OUT:當Endpoint和Processor、Processor和Processor間的Message在Exchange中傳遞時,Exchange會自動將上一個元素的輸出作爲這個元素的輸入使用。

Processor

處理器

Processor用於接受從Endpoint、Routing或者另一個Processor的Exchange中傳來的消息,並進行處理。
Camel核心包和各個Plugin組件都提供了很多Processor的實現,開發人員也可以通過實現org.apache.camel.Processor接口自定義Processor。

// 一個自定義處理器的實現
public class OtherProcessor implements Processor {
    @Override
    public void process(Exchange exchange) throws Exception {
        Message message = exchange.getIn();
        String body = message.getBody().toString();
        //===============
        // 您可以在這裏進行數據格式轉換
        // 並且將結果存儲到out message中
        //===============
        // 存入到exchange的out區域
        if(exchange.getPattern() == ExchangePattern.InOut) {
            Message outMessage = exchange.getOut();
            outMessage.setBody(body + " || other out");
        }
    }
}

Routing

Routing用於處理Endpoint和Processor之間、Processor和Processor之間的路由跳轉。
Camel中支持的路由規則非常豐富,包括基於內容、接收者列表、循環動態路由等。
Message Routing

Service

在Apache Camel中有一個比Endpoint、Component、CamelContext等元素更基礎的概念元素:Service。
包括Endpoint、Component、CamelContext等元素在內的大多數工作在Camel中的元素,都是一個一個的Service。
Camel應用程序中的每一個Service都是獨立運行的,各個Service的關聯銜接通過CamelContext上下文對象完成。每一個Service通過調用start()方法被激活並參與到Camel應用程序的工作中,直到它的stop()方法被調用。也就是說,每個Service都有獨立的生命週期。
Service源碼

CamelContext上下文

CamelContext橫跨了Camel服務的整個生命週期,並且爲Camel服務的工作環境提供支撐。
CamelContext


  1. 企業集成模式 ↩︎

  2. 消息傳遞系統 ↩︎

  3. Camel核心要素 ↩︎

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章