1. Spring Integration概述
1.1 背景
Spring框架的一個重要主題是控制反轉。從廣義上來說,Spring處理其上下文中管理的組件的職責。只要組件減輕了職責,它們同時也被簡化了。例如,依賴注入降低了定位和創建組件間依賴的耦合性。同樣地,面向方面編程通過模塊化可重復利用方面,將業務組件和通用的橫切面關注點解耦。在這樣的情況下,最終的結果是系統更容易測試,理解,維護和擴展。
此外,Spring框架和相關工具集提供一個優秀的構建企業級應用的編程模型。這個模型的一致性對開發者非常有益,特別是其基於公認的最佳實踐,比如基於接口的編程,盡量使用聚合而不是繼承。Spring簡化的抽象和功能強大的類庫,在增加了系統可測試性和可移植性的同事,有力地促進了開發者的生產力。
Spring Integration是Spring項目中秉承其相同目標和原則的新成員。它擴展了Spring的編程模型到消息領域,在Spring已經存在的企業集成支持的基礎上,提供了更高級別的抽象。它將控制反轉添加到關注點,支持消息驅動架構,例如當特定業務邏輯應該執行時,響應也應該被發送。它支持路由和消息轉換,所以不同的傳輸協議和不同的數據格式能在不影響易測試性的前提下被集成。換句話說,消息和集成關注點都被框架處理,所以業務組件能更好地與基礎設施隔離,從而降低開發者所要面對的復雜的集成職責。
作為Spring編程模型的擴展,Spring Integration提供了各種的配置選項,包括注解,支持命名空間的XML,通用bean元素的XML,當然也包括直接使用底層API。這些API基於定義好的策略接口和非侵略性的代理適配器。Spring Integration的設計是受在Spring中的通用模式和知名的企業集成模式中的密切聯系啟發的。企業集成模式是2004年Gregor Hohpe 和Bobby Woolf在Addison Wesley出版社出版的《企業集成模式》一書中描述的。讀過這本書的開發者應該能直接地適應Spring Integration的概念和術語。
1.2 目標和原則
Spring Integration主要有如下兩個目標:
l 提供一個簡單的模型來實現復雜的企業集成解決方案
l 為基於Spring的應用添加異步的、消息驅動的行為
l 讓Spring用戶可以直觀的、增量的采用
Spring Integration基於兩個原則:
l 組件應該松耦合,方便模型化和易測試
l 框架應該強制業務邏輯和集成邏輯的關注點分離
l 擴展點本質上應該是抽象的,而且限定在一個清晰的邊界內,來促進可重用性和可移植性。
1.3 主要組件
縱向地看,一個分層的架構利於關注點的分離,各層間基於接口的契約實現了松耦合。典型地,基於Spring的應用就是這樣設計的,Spring框架和工具集提供了一個遵從最佳實踐、全棧式開發企業級應用的強大基礎。橫向地看,消息驅動架構添加了橫向視圖,雖然這些目標還是相關的。分層架構是一個非常通用和抽象的范式,消息系統非常符合同樣抽象的“管道和過濾器”模型。“過濾器”代表任何能夠生產和(或)消費消息的組件,“管道”在過濾器間傳輸消息,所以組件間保持松耦合。值得指出的是,這兩個高級范式不是互斥的。其中的消息基礎設施支持包裝“管道”到契約被定義為接口的層。同樣地,“過濾器”一般被管理在邏輯上位於應用系統的服務層之上的層中,其與那些服務在相同的方式下通過接口交互。
消息
在Spring Integration中,消息是任何Java對象連同框架處理對象時使用的元數據的一個通用包裝。它由負載和頭部組成。負載可以是任何類型,頭部保存一般的請求信息,例如id,時間戳,過期時間和返回地址。頭部也被用來在各種傳輸協議間傳值。比如,從接收到的一個文件創建一個消息時,可以把文件名存儲在頭部,這些下游的組件就可以使用它。同樣地,如果一個消息的內容最終被一個對外接出的Mail適配器發送,各種屬性(收件人,發送人,抄送人,主題等)可以被上游組件配置為消息頭部值。開發者也可以在頭部存儲任意的鍵值對。
消息通道
一個消息通道代表“管道和過濾器”架構中的一個“管道”。消息生產者發送消息到通道,消息消費者從通道接收消息。消息通道因此解耦了消息組件,同時也提供了消息攔截和監控的切入點。
一個消息通道可能符合點對點模式或者發布-訂閱模式。如果是點對點模式
的通道,發布到通道中的每個消息,最多只有一個消費者可以接收。如果是發布-訂閱模式的通道,則會嘗試廣播每個消息給其所有的訂閱者。Spring Integration支持這兩種模式。
鑒於“點對點模式”和“發布訂閱模式”定義了每個消息最終有多少消息消費者接收的兩種方式,這裡有一個重要的考慮:通道是否應該緩沖消息?Spring Integration中,輪詢通道(Pollable Channels)具有在一個隊列中緩沖消息的能力。緩沖的優勢在於它能夠調節接入消息流量,從而防止系統負荷過載。然而,正如其名稱所示,這也增加了一些復雜性,只有配置了輪詢器後,一個消息消費者才能從這個通道中接收消息。另外來說,訂閱通道(Subscribable Channel)要求連接它的消費者依從簡單的消息驅動模式。Spring Integration中還有多種通道的可用實現,將在第3.2章節“消息通道實現”中詳細討論。