Camel in action 第一章譯文(請勿用於商業用途)
1 First steps
1.Camel 介紹
2.Camel路由
Firststeps
Apache camel 是 一個開源的一體化框架,其目的是使一體化系統更容易。本書的第一章節我們將介紹camel及展示它適合大企事業單位的軟體。你將會學習到關於camel的概念及一些專業術語。
第二章將介紹camel其中一個最重要的一部分:訊息路由。Camel主要有兩種方式的路由規則:基於java領域的指定語言(DSL)和基於spring的xml檔案的配置。這些路由技術的新增,將向你展示怎麼設計及實現路由,來解決企業系統間的整合問題。
Camel介紹
本章要點
nCamel介紹
n
n你的第一個camel試駕
nCamel的體系結構及內容
打造一個複雜的一體化系統是一個非常昂貴的實驗,並且這個實驗室幾乎不可能成功的。一個有效的並且降低風險的方式是用經過驗證的元件以拼圖的方式組裝一個一體化系統。我們平時就依賴此一體的系統,我們就可以用電話交流發生的一起,例如財務交易、有益於身心健康的旅行計劃或者娛樂活動。
你還不能完成一個拼圖遊戲,直到我們有了這些可以自由組合、無縫連線的集合塊。有了這樣的系統就可以更多的關係自己的業務,不需要在考慮系統之間的連線及系統內部之間的工作。一個好的一體化的框架提供了簡單的,易管理的系統。
Camel就是這樣的一個框架,在本書中,我們將幫助你理解camel是什麼,如何去使用它及為什麼它是一個最好的一體化框架。
這一章就開始介紹camel框架及它核心最精彩的部分。我們接下來將要介紹camel的分佈及解釋在本書中可以執行起來的例子。我們將會全面的介紹camel的最核心最精彩的部分,是你能夠理解camle的體系架構。
1.1介紹camel
Camel是一個整合框架,其目的是使你的所有的專案更高效有趣。Camel專案最早開始於2007年。但是它還很年輕,camel已是一個成熟的開源專案了。在apache 2 的許可證是有效的,它有一個強大的交流社群。
Camel 關注在簡易整合。我們相信你到目前為止已經完成了前面的閱讀。接下來你將會領略到camel的魅力,新增它到你的工具清單中。
Camel專案之所以被命名為簡單的“Camel”是 因為這個名字簡短易記。傳言camel的名字是有一個發現者抽的是駱駝牌香菸。在camel website輸入(
1.1.1Camel是什麼
Camel框架的核心是一個路由引擎,它允許你定義自己的路由規則,決定接受哪些訊息,做出決定如何處理,傳送這些訊息給其他目標。Camel用這種整合語言允許你定義複雜的路由規則。
Camel的基本原則之一是不會假設任何你需要處理的資料,這是很重要的一點,因為它給你們開發者一個整合任何系統的一個機會,不需要轉換你的資料為另外的一種公認格式。
Camel 提供了高水平的抽象,它允許你根據相同的api協議或者系統的資料型別整合各種各樣的系統。Camel的元件提供了特殊實現的介面api,其目的是給不同的協議和資料型別服務。Camel打破了傳統模式,它支援80多種不同的協議和資料型別,它的擴充套件性和模組性允許你實現你自己專有協議的無縫外掛。這些體系結構的選擇淘汰沒有必要的轉換,從而使camel更加的高效,易學。結果證明,camel是適合嵌入到其他專案中的,因為它提供了充足的處理能力。其他開源的專案,例如Apache ServiceMix和ActiveMQ已經使用camel作為企業整合的一種處理方式。
我們應該提問camel不是什麼,camel不是ESB,有些人稱camel是個輕量級的ESB,因為它支援路由、事務、監控、編制等。Camel 沒有一個容器或者一個可靠的訊息匯流排,但是它可以依賴例如開源的ESB或者前面提到的ServiceMix,由於以上原因,我們更喜歡把camel稱作超越一個ESB的整合框架。
理解camel是什麼,這樣能夠更能好的看到它的主要功能點。讓我們來看一下它的主要功能點。
1.2.1為什麼使用Camel
Camel為整合領域介紹了一些新奇的觀點,這就是為什麼它的作者們決定在第一領域建立camel,代替正在使用已經存在的框架。我們將通過本書介紹富有camel所有的功能點。這些功能點如下:
n路由和斡旋引擎
n企業整合模式
nDomain-speclfic language(DSL)
n可拓展元件庫
n有效負載路由
n模組化、元件式體系結構
nPOJO模型
n容易配置
n資料型別自動轉換
n輕量核心
n測試裝備
n充滿活力的社團
路由和斡旋引擎
路由和斡旋引擎是camel的核心功能。路由引擎基於路由配置有選擇的對訊息進行路由。在camel的例項中,路由配置佇列是以企業整合模式和DSL。以上兩種我們將在下面介紹。
企業整合模式(EIPS)
儘管整合的問題多中國多樣,Gregor Hohpe 和Bobby Woolf 發現了很多問題。接著你們很容易的把問題解決掉了。他們編寫一本《Enterprise Integration Patterns》書,這本書對那些專業整合的人來說是必讀的書。接下來,它將幫助你理解又快又容易地理解camel。
企業整合模式或者EIPS對我們是有幫助的,因為它不僅給我們提供了問題的解決方案,並且也幫我們定義了我們所交流問題的本身。有了模式問題交流起來更容易。使用模式語言比描述需要解決的問題容易的多,就好像學習漢語比學習甲骨文要容易的多。
Camel基於EIPs是沉重的。儘管EIPs描述了整合問題的解決方案,同時也提供了通用的詞彙列表,但這些詞彙列表沒有形成書面語言。Camel就避免了這個問題,它提供了一種整合描述性語言。在EIPs和camel的DSL語言之間幾乎有一種一對一的關係。
Domain-specific language(DSL camel自己的描述性語言)
Camel的domain-specific language(DSL) 對整合領域來說是一個主要的貢獻。有一些類似於DSL(允許你用XML去描述路由規則)特徵的整合框架。並不像camel,他們的DSLs是基於特定語言。Camel提供了多種DSLs。例如程式語言 java、Scala,Groovy,它還允許以XML特定方式的路由規則。
DSL的目的是讓開發者關注整合問題而不是程式開發工具。儘管Camel大部分是用java開發的。但是它支援多種程式語言。每一種語言都有屬於它治的健壯性,你可能想用不同的語言完成的不同的任務。你有這樣的自由建立自己的解決方案。
這有一些使用不同程式語言DSL例子。
nJava DSL
From(“file:data/inbox”).to(“jms:queue:order”);
nPring DSL
<route>
<from uri=”file:data/inbox”/>
<to uri=”jms:queuq:order”/>
</route>
nScala DSL
from “file:data/inbox”->”jms:queue:order”
這些例子都是真實程式碼,展示了路由一個或者多個檔案從一個資料夾到JMS佇列是很容易的。因為這是真正的底層程式語言,你可以用已經存在的工具支援,例如程式碼實現,程式碼編譯錯誤的檢查。例如:
你剛才看見的是Eclipse IDE的自動完成列表清單,供我們選擇。
額外的元件庫(大量的元件庫)
Camle提供了超過80個元件的拓展庫。這些元件使camel用APIs連線傳送和理解資料的格式。
有效的負載路由
Camle能夠提供任何一種有效的負載路由。你不能限制XML負載。這種自由的意思是你沒有必要轉換你自己的負載為權威的容易路由格式
模組化和元件式體系結構
Camel 有一個模組化體系結構,它允許任何元件載入到camel中,當元件船上出現不受歡迎的元件時,那就是來自第三方或者你自己定製的元件。
POJO模型
Beans(POJO)在camel是一等公民,它致力於讓你在任何地方任何時間使用beans。這也就意味著很多地方你可以繼承camel內建功能編寫自己風格的程式碼。在第四章已經討論了在camel中bean的使用。
配置簡單
配置的慣例是儘量減少配置的要求,是為了在路由中配置終點。Camel使用更簡單更直接的URL配置。
例如你可能配置一個資料夾下面的a.txt檔案,如下:
from(“file:data/inbox?recursive-true&include-*.txt”)…
型別自動轉換
Camel已經嵌入了150多種自動轉換的機制。你不在需要配置型別轉換規則,例如把byte arrays轉換為 Strings。如果你需要一種camel沒有的轉換型別,你可以自己去建立屬於自己的Converter。最關鍵的部分工作在引擎中,so你可以不用擔心it。
Camel的元件有槓桿的特點。他們可以接受各種各樣的資料型別,把這些型別轉換為其他型別。他們有這個能力。在camel社群裡面這是個最受歡迎的特性。你甚至可能開始想問為什麼在java本身不提供這樣的功能呢?在第三章將介紹多種型別轉換。
輕量級的核心
Camel核心被認為是輕量級的,總共自由包加起來大約也就1.6MB,它只依賴Apache Commons Logging,資源的通用管理。這樣使camel更容易在你喜歡的任何地方嵌入或者部署。例如在標準的應用、web應用、spring應用、J2EE應用、JBI容器、OSGI bundle、java web start或者Google Appengine。Camel沒有被設計成一個server或者ESB,取而代之的是可以嵌入到你選擇的任何平臺中。
測試工具箱
Camel提供了測試工具箱,使測試你自己的camel應用更容易。這些測試工具在測試camel本身中廣泛應用。例如他們可以幫助你虛擬真正的endpoints。它提供了安裝進度條的功能。Camel可以根據它來斷定服務是正常啟動或者啟動失敗。在第六章cover了Camel的testing。
活躍的社團
Camel有一個活躍的社團。如果在你的專案中想使用任何開源的專案,加入的該社團中是必須得。不活躍的專案幾乎沒有社團的支援,出了問題那就是你自己的問題。使用camel,如果你有任何問題,熱心的使用者和開發者會迅速處理幫助你。
到目前為止你已經看到了camel的主要組成的功能。我們有不多的人手在觀察camel的使用範圍和試用的例子。
1.2快速開始
我們將介紹怎麼得到Camel的幫助文件,解釋camel裡面包括什麼。怎麼用Maven執行例子。After this,你將學會執行從本書原始碼中的任何例子。手續看一下camel的分佈。
1.2.1Getting camel
開啟網址你將會看見你將會看見不同版本的camel下載列表,當然也會有最新版本的下載。
我們將使用camel2.5.0。去下載這個版本,點選camel 2.5.0 版本的連結。幾乎在本頁的底部你會找到兩個二進位制的釋出包:為windows使用者zip釋出包,和為Unix/Linux/Cygwin 使用者提供的tar.gz釋出包。把下載好的包解壓開。
1.2.2 你的第一個camel例子
第一個例子我們會用傳統的“hello world”:路由檔案。假如你需要讀一個目錄(data/inbox)下面的檔案,然後用一定的方式進行處理,然後把結果寫到另外一個檔案目錄(data/outbox)。很簡單,你將會跳過處理過程,你的輸出僅僅是一份原來檔案的copy。圖Figure 1.2 畫出了這個過程。
看起來非常簡單是不是。以下程式碼是用純java來實現的。
以上十分簡單的用例,但是用java實現仍舊需要34行程式碼。你不得不使用低階的檔案API,確保資料流已經關閉,這樣的程式很容易出錯。
用camel來實現如下:
但你使用Camel時大部分類似於java這樣的程式碼都顯得有點樣板了。每一個Camel應用使用CamelContext 中的方法進行啟動或者停止。你也可以新增一個sleep method為你copy檔案準備時間。見listing 1.2.
Camel路由是以邊讀邊流動的方式來定義的。上面那個路由是以這樣的方式來讀的:消費者的訊息來自位置為data/inbox(設定noop選項)資料夾下面的檔案,接著把檔案路由到位置data/outbox中。noop 選項告訴Camel離開(保留)資原始檔。若有你不使用noop選項,這個檔案會被刪除掉。從沒有見過Camel的人們能夠理解camel的路由做了些什麼。你可能也想關注這一點。出去掉樣板程式碼,你建立一個路由檔案替換上面的java code。
Note 本書上的程式碼用的是Maven 2.2.1。最新版本可能出現意想不到的錯誤。
POM展現如下:
Maven本身是個複雜的話題。我們在這不做更多的細節介紹。我們將給你足夠的資訊介紹本書中的所有例子。推薦讀 Maven by Example和 The Complete Reference。我們也用Maven部署應用。(沒有用過Maven的同學,可以去學習一下,很不錯 比ant好用)
1.3 camel訊息模型
在camel中有兩個訊息模型的抽象概念。下面的section我們將會涉及到。如下:
nOrg.apache.camel.Message----這個基礎的實體包含需要在camel中路由的資料。
nOrg.apache.camel.Exchange----訊息交換是camel的抽象概念。訊息交換有個“in”訊息作為回覆,還有一個“out”訊息。
我們開始通過檢視訊息來理解資料是怎樣在Camel中被塑造和運輸的。我們將看到在Camel中“conversation”是怎樣被塑造的。
1.3.1 訊息
系統之間通訊的時候Messages是作為獨立實體來用的。訊息從傳送者的方向到訊息的接受者,插入如下:
訊息有一個體,頭資訊及一些附加配置,如下圖:
訊息有定義標識,標識的type是java.lang.String。訊息建立的時候,其唯一標識是被迫必須被建立的。訊息是依賴協議的,它沒有強制的格式。這些協議沒有定義一種訊息的唯一標識庫。Camel通常用它自己的UID。
頭資訊和附加配置
頭資訊裡面放的是訊息之間的關係,例如傳送者的UID、內容編碼的跡象、認證訊息等等。
頭信資訊是name-value對;name是唯一的。強轉換為String型別,因為name的型別是java.lang.Object型別的。這就意味著Camel在header型別上強加約束。頭是以Map的形式來儲存資訊。一個訊息可能也會有選項附加配置,例如通常被web service和email 元件使用。
訊息體(Body)
訊息體是java.lang.Object型別。這就意味著可以儲存任何型別的訊息。由應用設計者來決定訊息接收者可以理解的訊息內容。當訊息的接收者和傳送者使用不同的body 型別。Camel提供了一些轉換可以接收格式的資料機制。
失敗標誌(FAULT FLAG)
訊息也有一個失敗標誌。
1.3.2 交換
Camel的交換是在路由過程中發生在訊息容器中。一種交換同時提供了系統之間不同型別的整合,例如眾所周知的MEPs(Message exchangepatterns)。MEPsbetween事件訊息(one-way) and request-response 以不同的訊息風格被使用。Camel的exchange有一種屬性模式供選擇。
InOnly ---事件訊息( A one-way message)。例如,JMS訊息經常就以時間訊息來使用。
InOut---請求響應訊息(request-response message)。例如,HTTP。一個客戶端請求一個需要返回的web頁面,等待server回覆。Canel交換都包括哪些內容如下插圖:
讓我們來看一下Figure1.5每個元素的細節。
nExchage ID---用來交換的唯一標識。Camel會提供一個預設的唯一ID
nMEP-A--指定的樣式。你是否正在使用Inonly或者InOut訊息結構樣式。當只是InOnly樣式時,The change只包含一種in訊息。若是InOut模式,out訊息也包含一個回覆訊息給請求者。
nException(異常)---如果在路由的過程中任何時間發生異常,則這個異常被放到異常空間。
n屬性---相似的訊息頭,他們持續在整個交換過程中。屬性包含有被使用global-leve資訊。反之訊息頭對哪些特有的訊息來說是特別的。Camel在路由期間它自己將新增各種屬性。你作為一個開發者可以在交換的生命週期內的任何point保留或者恢復這些屬性。
nIn 訊息—這是一種被強制的輸入訊息。這In 訊息包含請求訊息。
nOut 訊息---這是一種宣洩訊息。它僅存在MEP中。這Out訊息包含恢復訊息。
我們想在講camel體系結構前討論一下camel的訊息模型。我們想你對camel的訊息已經有了一定的理解。畢竟camel大部分重要的方面都是路由訊息。你現在已經具備了更多的去學習關於camel和他的體系結構。
1.4 camel體系結構我們現在把注意力轉到camel的體系架構上來。我們將首先看一下高水平的體系架構,接著深入的研究一下這些內容。你讀過本章段後,你應該懂得了整合的術語,在第二章為你準備了。我們將深入研究camel的路由能力。
1.4.1camel體系機構
我們製作了高水平的camle體系架構檢視,如下插圖:
路由引擎有訊息路由的詳細說明。路由作為DSLs語言被定義使用。在路由期間訊息會被處理成各種型別的訊息。在訊息在路由期間實現了所以的EIP。在camel中這些元件時作為連線其他系統的拓展點。
1.4.2 camel的概念
Camel有很多新的概念,因此讓我們花一些時間一個一個理解它。我們從CamelContext開始,它是camel的執行環境。很重要喲。
CamelContext
你可能已經猜到CamelContext是一個有類別容器,從figure1.6的插圖你可能認為它是camel的執行環境系統。Figure1.7展示了大部分值得注意的服務。這些服務都是camel保留下來的。如下插圖:
The details of each of these services will be discussed throughout the book. Let’s
now take a look at routes and Camel’s routing engine.
這些服務將會貫穿本書。現在我們先看一下ROUTES和ROUTING ENGINE 。
上圖部分翻譯:
Components:包含用到的元件。Camel 能夠通過自動載入類路徑或者自動啟用OSGI容器等方式來執行。第七章中討論。
Endpoints:包含已建立的endpoints。
Routes:包含被新增的路由。會在第二章中講解。
Type converters:包括已經載入的類轉換。Camel擁有可以手動或自動轉換類的機制。第三章中詳細描述。
Registry:包含可以查閱beans的登錄檔。預設情況下,它是JNDI registry。如果基於Spring,它是Spring ApplicationContext ,如果使用OSGI容器,它是OSGI registry。第四章講。
Languages:包含載入的語言。Camel允許使用不同的語言建立表示式。你會看到在講解DSL的時候使用的Xpath 語言。完全參考camel自己的簡約的表示式語言可以參考 附錄A。
路由引擎
Camel的路由引擎其實就是做訊息移動。引擎不會暴露給開發者。但是你應該意識到它的存在,它做了所以的重活,確保訊息能夠根據屬性準確路由。
路由
路由是camel的一個核心抽象概念。最簡單的方式是定義一個路由作為處理鏈。在訊息 應用中使用路由有很多種原因。解耦的客戶端和伺服器端,生產者和消費者,路由可以
n動態的決定一個客戶端將會被那個服務呼叫。
n提供了一種處理額外流程的靈活方式
n執行伺服器端和客戶端獨立開發。
n增強一些系統的功能。
Camel中的每一個路由都有一個唯一的標識。這些標識為logging,debuging,監控,路由的啟動停止服務的。路由也有一個精確的輸入訊息資。
Each route in Camel has a unique identifier that’s used for logging, debugging, monitoring, and starting and stopping routes. Routes also have exactly one input source for
messages, so they’re effectively tied to an input endpoint.
Camel中每一個路由都有一個唯一的標識,用於日誌、除錯、監控、和啟動停止路由。路由有完整的輸入資源,所以他可以有效的和input endpoint 聯絡。
下面定義一個使用DSL語言的路由。
DSL:
定義一個路由。
DSL(Domain-Specific Language)
在camel中,DSL也就是經常使用的java API(給EIP提供的方法名稱)。考慮一下下面的例子:
from(“file:data/inbox”).filter().xpath(“/order[not(@test)]).to(“jms:queue:order”)
在這一句java語句中,你定義了路由。From 一個檔案,這個檔案路由到EIP,這個訊息是否是測試的目的 或者不是。如果一個訊息通過了測試,它將會被轉發到JMS結束點。失敗訊息過濾器將會放棄執行。
Canmel提供了多種DSL語言,你可以用spring定義同樣的路由。Like this:
建立應用的時候DSL為Camel使用者提供了一個抽象的概念。路由真正構成了處理過程。讓我們來看一下處理過程是什麼。
PROCESSOR
處理過程是camel的一個核心概念。代表了一個有處理能力節點的使用,建立,或者修改交換輸入。在路由期間交換會從一個處理流到下一個處理;例如你可以想象一個畫面,每個節點都有指定的處理方式。一個處理的輸出到一個處理的輸入連成一個隊。怎麼做交換的輸入輸出處理畫面呢?我們需要看一下components和endpoints
Component
在camel中元件是主要的繼承點。時至今日,已經有超過80個元件體系,應用範圍有資料轉換函式,DSL,資料格式,等等。你甚至可以建立自己的元件。在第11章討論。
從程式的視角來看,元件是十分簡單扼。他們的名字會用在URL中產生關聯關係,他們扮演著終點工廠。例如一個FileComponent 會關聯URI中的一個檔案,然後建立一個FileEndpoints。EndPoint可能是一個非常基本的事件概念。
EndPoint
Endpoint是camel的抽象概念。通道末端模型。系統可以利用通道收發訊息。如下圖:
<