1. 程式人生 > >開源ESB平臺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程式碼。


[html] view plaincopyprint?
  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <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"xmlns:xsi="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  
  3. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd  
  4. http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd  
  5. http://www.mulesoft.org/schema/mule/ee/tracking http://www.mulesoft.org/schema/mule/ee/tracking/current/mule-tracking-ee.xsd">
  6. ...  
  7. </mule>
  8. <flowname="Simple_Example_Flow1"doc:name="Simple_Example_Flow1">
  9.     <http:inbound-endpointexchange-pattern="request-response"host="localhost"port="8081"doc:name="HTTP"path="kittens"/>
  10.     <set-payloadvalue="Kittens? Kittens!"doc:name="Set Payload"/>
  11.     <echo-componentdoc:name="Echo"/>
  12. </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流經你的應用的資料。它包含兩個重要部分:

  • 訊息,包含訊息的元資料。
  • 訊息負載( payload),由你的業務特定的資料組成。

        一些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從負載中提取資訊。

原文連結:http://www.mulesoft.org/documentation/display/current/Mule+Concepts