企业服务总线(ESB)
思考:
1.ESB的定義到底是什么?是一款產(chǎn)品還是一種架構(gòu)模式?
2.ESB有何實(shí)際用處?
定義ESB
對(duì)于企業(yè)服務(wù)總線(Enterprise Service Bus),目前還沒有公認(rèn)的定義,根據(jù)供應(yīng)商和來源的不同,有很多種不同的定義,其中包含如下定義:
一種集成架構(gòu)樣式,支持提供者和服務(wù)用戶之間通過由各種點(diǎn)對(duì)點(diǎn)連接構(gòu)成的公共通信總線進(jìn)行通信”
“企業(yè)用來集成應(yīng)用程序環(huán)境中服務(wù)的基礎(chǔ)架構(gòu)。”
“一種架構(gòu)模式,使用面向服務(wù)支持異構(gòu)環(huán)境之間的互操作性。”(圖 1)
圖 1:ESB 架構(gòu)模式分成這幾個(gè)主要系統(tǒng)架構(gòu)
ESB 用于服務(wù)虛擬化,通常管理更大的服務(wù)集且位于內(nèi)聯(lián)網(wǎng)內(nèi)部。
何時(shí)使用ESB?
有沒有確定何時(shí)應(yīng)使用ESB實(shí)現(xiàn)的最佳實(shí)踐,需要集成三個(gè)或更多的應(yīng)用程序或服務(wù)時(shí),可以考慮使用ESB。連接兩個(gè)應(yīng)用程序時(shí),點(diǎn)對(duì)點(diǎn)集成非常簡(jiǎn)單而且更經(jīng)濟(jì)劃算。如果要從企業(yè)無法控制的外部服務(wù)提供者獲取服務(wù),也可以考慮使用ESB。然后,可以使用ESB監(jiān)視外部提供者保證的服務(wù)級(jí)別協(xié)議。可進(jìn)一步將服務(wù)合同調(diào)整的影響控制到最小,因?yàn)镋SB對(duì)消息進(jìn)行必要更改的同時(shí)將繼續(xù)提供一個(gè)穩(wěn)定的接口。
如果使用多種不同協(xié)議(如果:http、SQAP和FTP)并將它們標(biāo)準(zhǔn)化成一個(gè)協(xié)議(如SOAP),ESB可以執(zhí)行必要的協(xié)議轉(zhuǎn)換。如果始終需要將服務(wù)合并成一個(gè)架構(gòu)才能接收、處理和生成消息,那么使用ESB也比較合適。如果需要訪問一組預(yù)定義的組件和適配器,ESB也同樣使用,這將支持以標(biāo)準(zhǔn)化方式集成各種協(xié)議和原有應(yīng)用程序。如果需要安全、可靠地處理消息,ESB可以簡(jiǎn)化兩個(gè)異構(gòu)事務(wù)性數(shù)據(jù)源之間事務(wù)性消息流的實(shí)現(xiàn)。
如果需要通過總線將大量數(shù)據(jù)作為大量獨(dú)立消息進(jìn)行發(fā)送,那么使用 ESB 可能存在一些問題。ESB 絕不應(yīng)取代傳統(tǒng)數(shù)據(jù)集成,比如 ETC 工具。將數(shù)據(jù)從一個(gè)數(shù)據(jù)庫(kù)復(fù)制到另一個(gè)數(shù)據(jù)時(shí),使用數(shù)據(jù)集成可能更高效,因?yàn)樵摬僮髦粫?huì)不必要地增加 ESB 的負(fù)擔(dān)。
如果需要實(shí)現(xiàn)長(zhǎng)期業(yè)務(wù)流程,ESB 應(yīng)支持無狀態(tài)的消息流。長(zhǎng)期運(yùn)行的業(yè)務(wù)流程是有狀態(tài)的,最好使用 BPEL 和/或 BPMN 實(shí)現(xiàn)。這些流程通常無法通過 ESB 實(shí)現(xiàn),但可以通過業(yè)務(wù)流程管理系統(tǒng) (BPMS) 實(shí)現(xiàn)。
ESB 藍(lán)圖
由于缺乏標(biāo)準(zhǔn)化,ESB 市場(chǎng)相當(dāng)混亂。很多產(chǎn)品自稱是 ESB,但是提供的解決方案卻大相徑庭,而且基于不同的架構(gòu)。為了更有效地評(píng)估 ESB 產(chǎn)品,我們將分配給 ESB 的各種功能組織成了一個(gè)藍(lán)圖(圖 2)。
圖 2:企業(yè)服務(wù)總線藍(lán)圖
ESB 藍(lán)圖不包括“編排”或“流程編排”組件,因?yàn)檫@被視作 BPMS
類別的一部分。它們?yōu)殚L(zhǎng)期運(yùn)行的、有狀態(tài)的業(yè)務(wù)流程提供專用的運(yùn)行時(shí)環(huán)境,這些流程為此進(jìn)行了優(yōu)化,支持 BPMN 或 BPEL 之類的語言。ESB
應(yīng)該是無狀態(tài)的,并且應(yīng)配置為盡可能高效地處理消息。
操作和管理模塊
該模塊中的以下功能組件支持可靠的企業(yè)服務(wù)總線操作和管理。統(tǒng)計(jì)信息與狀態(tài) 提供服務(wù)的 ESB 統(tǒng)計(jì)信息,如錯(cuò)誤數(shù)量、最小和最大響應(yīng)時(shí)間以及處理的消息數(shù)。警報(bào) 提供一個(gè)發(fā)送警報(bào)消息的機(jī)制,可通過各種通道發(fā)送,因此也可以集成到現(xiàn)有監(jiān)視環(huán)境中。SLA 規(guī)則 是在統(tǒng)計(jì)信息與狀態(tài) 功能組件的信息基礎(chǔ)上定義的規(guī)則。支持度量和監(jiān)視 SLA。可以使用警報(bào) 組件通知任何 SLA 侵權(quán)。
消息跟蹤 可以在 ESB 中輕松跟蹤消息,應(yīng)在需要時(shí)激活,以便將相關(guān)開銷降至最低。消息重新傳遞 確保在預(yù)定義時(shí)間后自動(dòng)重新發(fā)送未及時(shí)處理的消息。可以配置嘗試次數(shù)以及它們之間的時(shí)間間隔。該組件主要適用于僅持續(xù)一段時(shí)間的技術(shù)錯(cuò)誤,如臨時(shí)網(wǎng)絡(luò)中斷。端點(diǎn)故障切換 可以指定一個(gè)備用服務(wù)提供者,在主服務(wù)提供者不可用時(shí)自動(dòng)調(diào)用。
負(fù)載平衡 可以列出一個(gè)邏輯服務(wù)提供者端點(diǎn)的幾個(gè)服務(wù)端點(diǎn)。它使用冗余服務(wù)實(shí)現(xiàn),根據(jù)定義的策略交替調(diào)用每個(gè)請(qǐng)求,可以循環(huán)調(diào)用,也可根據(jù)消息優(yōu)先級(jí)和負(fù)載依賴關(guān)系進(jìn)行調(diào)用。
消息限制 可以定義應(yīng)被發(fā)送到服務(wù)提供者的服務(wù)端點(diǎn)的每單元時(shí)間內(nèi)的最大消息數(shù)。它通過緩沖 ESB 隊(duì)列中超過閾值范圍的消息來防止服務(wù)提供者在高峰時(shí)段重載。消息限制 還支持消息優(yōu)先級(jí),這樣可以確保始終先處理高優(yōu)先級(jí)的消息。記錄與報(bào)告 支持記錄消息,方便以后顯示。它還提供功能審計(jì)。
配置管理 支持在操作系統(tǒng)上安全地調(diào)整 ESB 配置,同時(shí)始終維護(hù)配置的完整性。可在操作過程中調(diào)整和替換構(gòu)件和屬性。還可以保存變更歷史記錄,這樣 ESB 服務(wù)可以隨時(shí)回滾到早期狀態(tài)。服務(wù)注冊(cè)表 可以在 ESB 上注冊(cè)和管理服務(wù)。高可用性 確保 ESB 提供的服務(wù)是故障安全的,與運(yùn)行這些服務(wù)的服務(wù)器的狀態(tài)無關(guān)。
錯(cuò)誤醫(yī)院 是那些經(jīng)過多次重新傳遞嘗試仍無法處理的消息的目的地,可以在這里查看、更正(如果需要的話)以及重新處理這些消息。部署 可在 ESB 上自動(dòng)安裝服務(wù)。特定于環(huán)境的參數(shù)(如端點(diǎn) URI)通常是由該組件重寫的。服務(wù)使用情況 支持記錄服務(wù)使用情況并向用戶收取費(fèi)用。
調(diào)節(jié)模塊
調(diào)節(jié)模塊包含用于實(shí)現(xiàn) ESB 服務(wù)消息流的功能組件。消息路由 支持根據(jù)消息的內(nèi)容將消息其轉(zhuǎn)發(fā)至特定服務(wù)端點(diǎn)。如果使用的協(xié)議或消息格式支持與消息正文無關(guān)的消息頭區(qū)域,轉(zhuǎn)發(fā)標(biāo)準(zhǔn)可能源于消息正文或消息頭。
根據(jù)消息頭進(jìn)行路由可能是一個(gè)極具吸引力的選擇,可提高服務(wù)性能和可擴(kuò)展性,因?yàn)橹苯釉L問消息頭比解析來自消息正文的路由信息更高效。這對(duì)于大型消息來說尤其重要。
消息轉(zhuǎn)換 支持從一種消息格式轉(zhuǎn)換為另一種適用于文本和二進(jìn)制消息的格式以及 XML 格式。此外,還可以從文本(如 CSV
格式)轉(zhuǎn)換為 XML,或者從 XML 轉(zhuǎn)換為文本(如 CSV 格式)。XML 轉(zhuǎn)換使用著名的 XSLT 標(biāo)準(zhǔn),XSLT
支持對(duì)轉(zhuǎn)換進(jìn)行聲明性描述,并且擁有帶拖放功能的圖形資源以實(shí)現(xiàn)創(chuàng)建目的。
XSLT 轉(zhuǎn)換的主要缺點(diǎn)是,如果處理大型文檔,內(nèi)存使用量過高,這可能會(huì)限制解決方案的可擴(kuò)展性。如果 ESB 提供支持 XML 流轉(zhuǎn)換的選項(xiàng)(比如,通過 XQuery),那就更好了。
服務(wù)調(diào)出 可以在 ESB 中訪問消息流中的其他服務(wù),比如增強(qiáng)一條消息。服務(wù)可能是一個(gè) Web 服務(wù),但 ESB 可以如您所愿地支持直接調(diào)用 ESB 中本地安裝的程序代碼(如 Java 類方法)。可靠的消息傳遞 支持使用隊(duì)列或 WS* 標(biāo)準(zhǔn)(如 WS-ReliableMessaging)可靠地傳遞消息。
協(xié)議轉(zhuǎn)換 意味著無需任何編程工作即可從某個(gè)通信協(xié)議切換到另一個(gè)協(xié)議,比如,從 TCP/IP 切換到 HTTP。消息驗(yàn)證 確保消息是有效的。在 XML 中,這意味著消息包含規(guī)范定義的 XML 并對(duì)應(yīng)于特定的 XML 模式或 WSDL。不過,ESB 還提供了其他驗(yàn)證方法,如 Schematron 或規(guī)則引擎。
消息交換模式 (MEP) 支持消息交換模式,如同步和異步請(qǐng)求/應(yīng)答、單向調(diào)用以及發(fā)布/訂閱。結(jié)果緩存 可以在緩存中保存服務(wù)調(diào)用結(jié)果,這樣返回同樣結(jié)果的后續(xù)調(diào)用可從緩存獲得應(yīng)答,無需再次調(diào)用服務(wù)。如果數(shù)據(jù)是靜態(tài)的或者需要零星或少許的改動(dòng),此功能尤為適合。可大大減少像訪問原有系統(tǒng)這樣的開銷可能較大的操作。
事務(wù) 支持 ESB 通過消息處理提供事務(wù)完整性。ESB 用于支持可靠消息傳遞 的持久隊(duì)列通常作為事務(wù)數(shù)據(jù)源,因此可參與異構(gòu)事務(wù)。此外,ESB 還提供了一個(gè)分布式事務(wù)管理器,可使用兩階段提交協(xié)議通過異構(gòu)數(shù)據(jù)源協(xié)調(diào)分布式事務(wù)。
消息重新排序 使屬于一個(gè)整體但順序不對(duì)的消息流可以重新排序。在并行處理消息的面向消息的解決方案中,消息進(jìn)入 ESB 的順序可能會(huì)丟失。如果順序?qū)τ诜?wù)提供者很重要,消息重新排序 可以合并到消息流中。重新排序器包含一個(gè)內(nèi)部緩沖區(qū),緩沖區(qū)對(duì)消息進(jìn)行處理,直至排序完成且可發(fā)送。
直通式消息傳遞 可以令 ESB 高效轉(zhuǎn)發(fā) ESB 消息。如果要將 ESB 用于服務(wù)虛擬化,并且將消息從服務(wù)使用者原樣轉(zhuǎn)發(fā)至服務(wù)提供者,這將非常有用。在這種情況下,如果 ESB 不接觸消息,只是簡(jiǎn)單地按原樣傳遞,該功能非常適用。
安全模塊
該模塊使用大量組件支持傳輸級(jí)和消息級(jí)安全性。當(dāng)服務(wù)使用者訪問 ESB 中的服務(wù)時(shí),身份驗(yàn)證 驗(yàn)證其身份,并驗(yàn)證針對(duì)服務(wù)提供者的 ESB 身份驗(yàn)證。授權(quán) 為服務(wù)提供了一個(gè)授權(quán)系統(tǒng),通常可通過 XACML 對(duì)這些服務(wù)進(jìn)行配置,以便分配給用戶或角色。
安全調(diào)節(jié) 支持交互,通過將一個(gè)域的憑證轉(zhuǎn)換成另一個(gè)域的相應(yīng)憑證在安全域之外進(jìn)行通信。加密/解密 支持消息內(nèi)容的加密和解密。
適配器/傳輸模塊
該模塊包括的適配器可通過服務(wù)托管模塊連接 ESB 提供的服務(wù)。假設(shè) ESB 從無到有提供一組適配器,客戶或第三方開發(fā)人員還可以開發(fā)其他適配器以滿足具體的用戶需求。
服務(wù)托管模塊
該模塊支持在 ESB 上直接安裝和操作服務(wù),如果 ESB 基于應(yīng)用服務(wù)器,該模塊通常是必需的。服務(wù)容器 提供一個(gè)或多個(gè)容器,在其中安裝服務(wù)和管理生命周期。它提供可訪問技術(shù)橫截面功能(如事務(wù)和安全性)的服務(wù)。
組件模型 提供了一個(gè)抽象的組件模型(如 Java EJB、Java Spring Framework 或 Microsoft COM+),在此基礎(chǔ)上創(chuàng)建服務(wù)。
ESB 的實(shí)際應(yīng)用場(chǎng)景
圖 3 所示的符號(hào)用于以圖形化方式描述各種場(chǎng)景,無需參考產(chǎn)品或工具。這些符號(hào)來自于 [1],根據(jù) ESB 功能不斷添加。
圖 3:ESB 符號(hào)
場(chǎng)景 1 — 服務(wù)虛擬化
服務(wù)使用者往往更喜歡硬連接實(shí)際服務(wù)端點(diǎn),特別是在 BPEL
流程中,因?yàn)槭褂锰峁┑墓ぞ呖奢p松執(zhí)行。然而,在運(yùn)行時(shí)對(duì)服務(wù)器地址的改動(dòng)絕對(duì)不能產(chǎn)生需要在服務(wù)客戶端進(jìn)行重新部署的改動(dòng)。這個(gè)問題的一個(gè)非常好的解決
方案是使用 ESB 虛擬化端點(diǎn)。圖 4 展示了這個(gè)場(chǎng)景,服務(wù)提供者提供的 Web 服務(wù)接口不再由服使用者直接使用,而是通過 ESB
來使用。ESB 可以完全按照為潛在的服務(wù)使用者提供接口那樣提供接口。
圖 4:使用額外的監(jiān)視攔截器虛擬化服務(wù)
在 ESB 配置過程中可以輕松實(shí)現(xiàn)需要對(duì)端點(diǎn)地址進(jìn)行的任何改動(dòng),因此服務(wù)使用者可以像以前一樣繼續(xù)運(yùn)行。然而,ESB
需要能夠合并到現(xiàn)有消息流中。服務(wù)虛擬化還支持使用擴(kuò)展到服務(wù)統(tǒng)計(jì)信息的 ESB 監(jiān)視功能,以便檢查 SLA
合規(guī)性,如果不合規(guī)的話,則配置適當(dāng)?shù)牟僮鳌H绻?wù)提供者對(duì)服務(wù)合同進(jìn)行了更改但不想影響服務(wù)使用者,可以執(zhí)行服務(wù)虛擬化。在這種情況下,對(duì)交換的消息
進(jìn)行簡(jiǎn)單的轉(zhuǎn)換即可解決此問題。
場(chǎng)景 2 — 服務(wù)支持
當(dāng)納入具有功能接口的服務(wù)時(shí),通常會(huì)出現(xiàn)的情況是,服務(wù)使用者和服務(wù)提供者在協(xié)議級(jí)別使用不同的語言。圖 5
介紹了兩個(gè)服務(wù)提供者,從技術(shù)上來說它們提供的是相同的服務(wù),一個(gè)提供的是 SQL 接口,另一個(gè)提供的是 FTP
接口。可以將企業(yè)服務(wù)總線用作協(xié)議轉(zhuǎn)換器以保持接口不變,因?yàn)樗峁┑姆椒纱_保使用定義的接口。
圖 5:服務(wù)支持
與場(chǎng)景 1 類似,如果通信協(xié)議將來發(fā)生變化,ESB 可確保服務(wù)使用者或服務(wù)提供者端無需后續(xù)更改。
場(chǎng)景 3 — 安全的消息處理
ESB 還能支持傳統(tǒng)集成場(chǎng)景,主要目的是將消息從一個(gè)系統(tǒng)轉(zhuǎn)發(fā)到另一個(gè)系統(tǒng)。在圖 6 所示的場(chǎng)景中,ESB 使用來自外部隊(duì)列的消息,使用對(duì)一個(gè) Web 服務(wù)的服務(wù)調(diào)出來豐富這些消息,然后通過數(shù)據(jù)庫(kù)適配器將消息發(fā)送到目標(biāo)系統(tǒng)。
圖 6:安全的消息處理
ESB 中的處理是事務(wù)性的,意味著將消息流配置為像其他參與者一樣參與分布式 XA 事務(wù)。使用隊(duì)列中的消息時(shí)將啟動(dòng)事務(wù),事務(wù)還包含數(shù)據(jù)庫(kù)適配器執(zhí)行的數(shù)據(jù)庫(kù)操作。如果消息流成功完成,緊接著會(huì)提交分布式事務(wù)。
場(chǎng)景 4 — 服務(wù)版本控制
服務(wù)往往隨著時(shí)間而改變,通常需要引入一個(gè)新的不兼容版本。在這些情況下,可以使用 ESB 執(zhí)行從“舊”接口到“新”接口的轉(zhuǎn)換。在圖 7
所示的場(chǎng)景中,服務(wù)提供者引入了服務(wù)的 2.0 版本,服務(wù)使用者 B 立即安裝了該版本。服務(wù)使用者 A 一直使用接口 1.0,不想切換到 2.0
版本,因?yàn)椴粫?huì)給業(yè)務(wù)帶來任何附加值。然而,服務(wù)提供者不想讓這兩個(gè)版本并行運(yùn)行。同時(shí)運(yùn)行兩個(gè)接口可能比較困難,甚至在技術(shù)上不可行,而且會(huì)導(dǎo)致不必要
的資源消耗。
圖 7:服務(wù)版本控制
如果 ESB 通過直通式傳遞(類似于場(chǎng)景 1)直接提供 2.0 版本,情況可能比較簡(jiǎn)單。同時(shí),在適應(yīng)現(xiàn)有消息流的同時(shí)必須提供接口 1.0
版本,這樣將不再?gòu)姆?wù)提供者處調(diào)用 1.0 版本。相反,消息是從 1.0 版本轉(zhuǎn)換到
2.0,然后發(fā)送給新服務(wù)。這種轉(zhuǎn)換可能相對(duì)比較復(fù)雜,具體取決于兩個(gè)版本之間的差異有多大。為了提供調(diào)用 2.0
版本所需的所有信息,可能需要額外豐富 1.0 版本消息。
需要維護(hù) ESB 中的轉(zhuǎn)換和接口 1.0,直至沒有服務(wù)使用者使用舊接口。之所以在 ESB 中執(zhí)行這種轉(zhuǎn)換而不是在服務(wù)提供者中從版本 1.0 映射到 2.0,具體原因如下:
映射是技術(shù)問題,與業(yè)務(wù)相關(guān)問題無關(guān)
不會(huì)影響外部服務(wù)提供者。
ESB 使舊接口的使用透明。
當(dāng)所有服務(wù)使用者都改用接口 2.0 后,無需更改服務(wù)提供者。
總結(jié)
ESB 是一個(gè)中間件解決方案,使用面向服務(wù)的模型來促進(jìn)和支持異構(gòu)環(huán)境之間的互操作性。沒有規(guī)范準(zhǔn)確定義了什么是 ESB
或者它應(yīng)該提供什么功能。雖然 ESB 主要與“調(diào)節(jié)”和“集成”這類概念相關(guān),但它還適合作為一個(gè)平臺(tái)以類似于應(yīng)用服務(wù)器的方式提供服務(wù)。ESB
代表被稱作“集成”和“應(yīng)用服務(wù)器”的產(chǎn)品類別的整合。
ESB 的一個(gè)關(guān)鍵特性是服務(wù)虛擬化。本文提出的 ESB 藍(lán)圖提供了各種功能的有序排列,構(gòu)成了評(píng)估 ESB 產(chǎn)品的基礎(chǔ)。
要點(diǎn)
企業(yè)服務(wù)總線應(yīng)被視為一個(gè)架構(gòu)樣式或模式,而不是一款產(chǎn)品。
ESB 沒有定義或規(guī)范,因此也沒有標(biāo)準(zhǔn)。
ESB 可幫助實(shí)現(xiàn)系統(tǒng)間的松散耦合。
ESB 上的服務(wù)是無狀態(tài)的。長(zhǎng)期運(yùn)行的流程不屬于 ESB,但是在使用 BPEL 和 BPMN 之類語言的 BPM 系統(tǒng)中受支持。
“誤用”ESB 來執(zhí)行批處理時(shí)應(yīng)小心謹(jǐn)慎,因?yàn)榭赡軙?huì)對(duì)性能產(chǎn)生負(fù)面影響。
參考資料
[REF-1] http://www.oracle.com/technetwork/cn/articles/soa/ind-soa-esb-1967705-zhs.html
總結(jié)
以上是生活随笔為你收集整理的企业服务总线(ESB)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数字图像处理之位图在计算机中的存储结构
- 下一篇: 【无线电】摩尔斯电码的快速记忆法