- 對開發者沒有任何標準的侷限
- 簡化了POJO類程序模式,更好的發輝開發者的現有技能而加快部署
- 支持多種接入點,像是JMS, JDBC, 和SOAP
- 容易使用 - 只用一個配置文檔便可設置多種服務
- 支持多種不同數據的轉換
- 整合平臺模式:高度模塊化,易於擴展的基本代碼 - 基於行之有效的模式生成簡明的解決方案來面對各種獨特的挑戰
- 開源優勢:衆多的擁有實際經驗的專家和開發人員無私的爲Mule的基本代碼做貢獻
Mule是一個輕量級的消息框架也是分佈式的對象中介,允許你快速、簡單的連接各個應用來交換數據。以企業級服務總線這個企業集成模式開設計的Mule可以無縫的利用總多的技術像JMS、HTTP、Email、XML-RPC來處理應用之間的交互。
簡單的說,Mule就是可以利用各種技術來對不同的應用之間進行連接,來達到應用之間交互的目的。Mule是很容易擴展的,最初的時候,你可能只有幾個應 用通過Mule來進行連接,但是隨着規模的不斷變大,Mule管理的應用可以不斷的增大。Mule對於應用或者組件之間的交互的管理是透明的,不管是否在 同一臺機器上,不管通信的協議是否相同。 Mule是基於企業級服務總線(ESB)架構的思想。Mule是廠商中立的,所以不同廠商的產品都可以連接到Mule系統,你也可以自己進行相應的擴展。
最簡單的說來,Mule應用通過若干像樂高積木一樣的消息處理器來處理消息,這些處理器組合在一起就是一個我們稱之爲flow的過程。理解基本的消息結構以及flow體系是理解Mule的關鍵所在。本質上來講,每一個Mule flow都包含一系列接收、傳輸和處理消息的構件(building block)。
本文將首先介紹Mule的flow概念,然後分解流經flow的Mule消息組件。
Mule Flow
在一個flow中,你將若干獨立的組件連接在一起來完成消息的接收、處理以及最終的路由。Flow支持同步和異步的子flow,單向以及請求-響應交換模式,以及其它符合體系結構的選項。你可以將很多flow連接在一起來創建一個完整的應用,部署在(on premise?)Mule或其它應用服務器,或者雲端。
使用Flow開發
你可以通過兩種方法構建一個Muleflow:
- 直接向一個基於XML的應用配置文件中敲入幾行代碼
- 使用Mule Studio的圖形接口將組件圖標整理爲可視化的序列
接下來,你使用Studio附加的圖形工具來配置這些有序的構件,當然你也可以直接編輯配置文件中的XML代碼來進行配置,或者兩者結合着使用。
Flow的剖析
最簡單地說,flow是消息處理事件的序列。進入flow中的一條消息可能會流經各種各樣的處理器。下面的示圖中,Mule通過一個請求-響應入站端點(request-response inbound endpoint)來接收消息,將內容轉換成一種新的格式,並在通過消息源返回響應之前,進行業務邏輯處理。
這些構成了flow的基本單元通常被稱爲構件(在Mule Studio中)或者元素(在單擊或Studio的XML配置中)。總的來說,一個構件在Mule Studio中對應一個icon圖標——圖標則表示一個消息源、處理器或者組件。構件是Mule應用配置文件中一個XML元素的可視化表現形式。
下圖所示分別爲Mule Studio可視化編輯器中的一個簡單的flow及其對應的XML代碼。
- <?xml version="1.0" encoding="UTF-8"?>
- <mule xmlns:tracking="http://www.mulesoft.org/schema/mule/ee/tracking" xmlns:http="http://www.mulesoft.org/schema/mule/http" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation" xmlns:spring="http://www.springframework.org/schema/beans" version="EE-3.4.0" ="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd
- http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd
- http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
- http://www.mulesoft.org/schema/mule/ee/tracking http://www.mulesoft.org/schema/mule/ee/tracking/current/mule-tracking-ee.xsd">
- ...
- </mule>
- <flow name="Simple_Example_Flow1" doc:name="Simple_Example_Flow1">
- <http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="8081" doc:name="HTTP" path="kittens"/>
- <set-payload value="Kittens? Kittens!" doc:name="Set Payload"/>
- <echo-component doc:name="Echo"/>
- </flow>
Mule處理由外部資源(如事件)初始化的消息。例如,一條消息可以由用戶從移動設備出發的一次請求初始化,或者由諸如數據庫中的一次數據變更、SaaS應用中一個新的用戶ID的創建等事件初始化。
大多數flow中的第一個構件是一個接收器,負責接收新消息並將其放入處理隊列。Mule使用一個消息源元素——上例中的入站HTTP端點(inboundHTTP endpoint)——從一個或多個外部源頭接收消息,於是觸發了一個flow的執行。一個運輸機(transport)攜帶消息在集成與應用層流轉使其得到處理。
Mule轉換器(transformer)是節點間數據交換的關鍵,它們允許Mule將消息負載數據(payloaddata)轉換爲其它應用可以理解的格式。Mule還能夠進行消息內容的強化,允許你在處理過程中接收額外的數據附加到消息中。
Mule使用組件(component)來針對特定的業務邏輯(如檢查客戶與清單數據庫)進行末端處理。所以,組件將消息路由給正確的應用(例如一個訂單執行系統)。Mule使用一種被稱爲階段性事件驅動架構(Staged Event-Driven Architecture,SEDA)的架構進行flow中的異步消息處理這一核心功能。值得一提的是,組件不需要使用任何特定的與Mule相關的代碼;它們可以是簡單的POJO、Spring的bean,Java bean,Groovy腳本或者包含了處理數據的業務邏輯web service。組件甚至可以是其它語言開發的,例如Python、JavaScript、Ruby和PHP。Mule構件的種類包括了當前最常用的企業集成模式。
Flow還可以包含過濾器、作用域、flow控制、錯誤處理策略,以及諸多種類的雲連接器。更多關於這些種類的flow構件,以及關於它們如何能夠被連接起來,爲你的應用提供你需要的確切功能的細節,請參閱Mule應用架構 。
當你配置那些連接到一起組成了你的flow的單獨的元素時,你可以使用Mule表達式語言來提取關於消息或者其環境的信息,並且指導Mule基於這些信息做出處理決策。更多關於Mule表達式語言以及在Mule中如何使用表達式的信息,請參閱Mule表達式介紹。
更詳細的關於消息如何在flow中流轉的細節,請參閱理解Mule體系。
Mule消息
Mule消息是通過一個或多個flow流經你的應用的數據。它包含兩個重要部分:
一些Mule消息可能包含第三部分:一個附件。不過,由於附件並不常用,我們在這裏將不再贅述。
消息頭
Mule消息頭包含關於這條消息的元數據。元數據包括屬性和變量,提供了關於這條消息的有用信息,幫助其到達目的地。屬性和變量使用統一的格式:每一個屬性和變量都具有一個name和一個value。name用於在Mule中引用這個屬性或變量,value是其中存儲的信息。所以,name就像是一扇門的鑰匙,value就是門後面的任何東西。
一條消息的頭部包含的屬性和變量具有特定的域,定義並組織它們如何在消息的整個生命週期中起作用。
屬性具有兩個主要的域:入站和出站。
- 入站屬性(inbound properties)由消息源自動生成,用戶不能設置或者操縱這些屬性。
- 出站屬性(outbound properties)可以由用戶配置。出站屬性是在一個flow的過程中被設置的,並且當消息通過運輸機從一個flow的出站端點傳遞到另個一flow的進站端點的時候,出站屬性可以變爲入站屬性。(注意,如果這條消息是通過flow-ref而不是運輸機傳遞到另一個flow,出站屬性仍然是出站屬性,而不會被轉換爲入站屬性。)
消息攜帶的屬性信息依據作用域來發送元數據,以便於處理以及避免消息穿過運輸機邊界時發生錯誤——無論是進入一個新的flow,或者是被傳輸到另一個應用。入站屬性持有消息源特定的元數據,以防數據格式混亂或者之後消息生命週期發生其它處理事故。出站屬性持有類似的元數據,不過該元數據在消息進入flow的時候纔有效。出站屬性可以被Mule自動設置,也可以通過開發者在flow中插入一個或多個轉換器來手動設置。
變量是用戶定義的關於消息的元數據。變量具有兩個作用於:
- Flow變量只在當前flow存在。
- Session變量在同一應用的所有flow中都有效。
變量是關於消息的臨時信息片段,意在用於對它進行處理的應用,而不是隨消息一起被髮送到目的地。所以,變量更有可能被人觸發,反之屬性更有可能被系統設置和觸發。然而,並沒有關於如何使用屬性和變量的嚴格規定。簡言之,有了這些分別被劃分到各自作用域的屬性和變量,Mule支持4種共享相同的鍵/值對結構的元數據。這四種類型有基於它們作用域的不同的應用。
你可以使用Mule表達式語言( Mule Expression Language,MEL)來設置、觸發和操縱出站屬性,flow變量以及session變量。
消息負載
消息負載是Mule消息最重要的部分,因爲它是你通過Mule應用發送的數據的內容。你可以在消息頭使用元數據來傳達關於你的消息的信息,或者保護其免受干擾,但是消息的核心——你要傳輸的數據——是消息最初存在的原因。
然而,負載在流經flow的時候,沒有必要保持不變。Muleflow中各種各樣的消息處理器都可以在沿途影響負載,設置、豐富它的值,或者將其轉換爲新的格式。你也可以在flow中使用MEL從負載中提取信息。
四、MULE ESB 開發環境搭建
(1)、部署mule到本機
A、Mule下載
從Mule的官方網站(http://www.mulesoft.org/display/COMMUNITY/Home)上下在社區版。目前的最新版本是3.0,下載下來的文件是mule-standalone-{version}.zip
B、安裝
1. 解壓下載下來的zip文件。如圖中所示
2. 將解壓出來的mule文件夾拷貝到想要的地方,比如放在d:/soft目錄下,然後將其重命名爲mule
3. 鼠標右擊我的電腦 —>屬性—>高級—>環境變量—>系統變量。在系統變量新建MULE_HOME變量,值爲Mule的路徑。
4. 將MULE_HOME變量添加到Path路徑
至此,Mule安裝配置完成。
C、Mule服務啓動
點擊開始菜單—>運行—>輸入cmd—>進入控制檯—>輸入mule,出現啓動信息。表明配置成功。
在這裏注意 java的環境變量配置要修改一下,實際開發的時候應用的的是mule 3.3.0
(2)、安裝開發工具Mule Studio
第1步 - 下載和安裝Mule Studio
從www.mulesoft.org下載Mule ESB Community Edition的發佈包. 無需安裝, 解壓至本地硬盤即可使用。
第2步 - 啓動Mule Studio
在解壓目錄下執行muleStudio.exe
以啓動Mule Studio, 並在Select
a workspace
界面中輸入或選擇一個workspace路徑。
第3步 - First Steps
如果啓動的是一個新的workspace, Mule Studio會顯示First Steps
界面, 選擇Go
to Mule Studio
開始使用Mule Studio。
五、Mule ESB-在架構中的常用模式應用
根據實際使用過程中的常見場景,我們總結出MuleESB在項目中的四種常用模式:
1、簡單服務模式
簡單服務模式用於簡化同步服務調用的配置,對應消息傳遞方式中的請求-響應方式。
2、橋接模式
橋接模式用於在inbound endpoint和outbound endpoint之間建立直接連接,不需要component提供業務邏輯
3、校驗器模式
校驗器模式通過定義一個校驗過濾器過濾服務請求,並同步返回ACK(ACKnowledge)或NACK(Not Acknowledge)結果。通過校驗的服務請求被異步分發給處理方。
4、服務代理模式
Web服務代理模式用於將Web Service請求直接轉發至遠程目標Web Service服務端,Mule本身不提供實際的Web Service。
簡單的服務,可以通過Mule的流程配置文件通過拖拖拽拽完成。牽扯的複雜的邏輯,我們還是需要手工寫一些類做輔助工作。
Mule支持多種編程模型,常用的有Web Service,Web Service Proxy,以及基於JMS的消息發佈訂閱等。
MuleESB提供了一個消息框架,用於程序之間的數據交換。應用被封裝成爲服務,服務包含服務組件、消息路由和其它一些配置。Transport使得服務間的數據在不同渠道內得以傳送,並且transport在對數據的傳輸過程中,對需要格式轉換的數據進行數據轉換。