Axon是一個輕量級框架震束,能夠幫助開發(fā)者通過在架構層面構建可擴展和可伸縮的應用。(注:以DDD面向領域驅動設計為基礎的CQRS框架)
Axon Framework背景当犯、發(fā)展簡史
隨著時間的發(fā)展垢村,軟件的需求也在不斷增長。公司都希望自己的(web)應用程序和自身業(yè)務共同發(fā)展嚎卫。這就意味著不僅僅是工程和代碼變得更復雜嘉栓,也意味著功能不斷地新增、更改和移除。它令人沮喪的是,一個看似易于實現(xiàn)的功能侵佃,卻要求開發(fā)團隊改動整個應用程 序麻昼。此外,如今的web程序的目標是針對潛在的數(shù)十億用戶趣钱,這便使可伸縮性成了必要的條件涌献。
雖然有很多的應用和框架圍繞著可擴展性問題進行處理,例如GigaSpaces(類似Microsoft Azure) 和 Terracotta(分布式緩存線性擴展平臺),它們都存在著一個根本的缺陷首有。他們通過要求開發(fā)人員在開發(fā)應用時燕垃,使用分層體系架構,來試圖解決可擴展性問題井联。在某些情況下卜壕,他們甚至會阻止或嚴格限制使用一個真正的領域模型,強迫所有領域邏輯都放到服務中烙常。雖然可以很快地構建一個應用程序轴捎,最終,這種做法將導致復雜性的增加和開發(fā)速度減慢蚕脏。
命令查詢職責分離(CQRS)模式解決了這些問題侦副,大幅改變了應用程序的架構。CQRS不是將分離的邏輯分到不同的層 ,邏輯的分離是以改變應用程序的狀態(tài)或查詢?yōu)橐罁?jù)驼鞭。這意味著秦驯,執(zhí)行命令(行為有可能更改應用程序的狀態(tài))和查詢應用程序數(shù)據(jù)是由不同的組件執(zhí)行。這種分離事實上最重要的原因是挣棕,他們各自有不同的技術和非技術的要求译隘。當命令執(zhí)行后,查詢組件利用事件同步或異步地進行更新洛心。該更新機制通過事件來完成固耘,正是這種架構如此的可擴展,可伸縮词身,最終會更易于維護厅目。
注意
一個完整的CQRS解釋不在本文的范圍之內。如果你想了解更多關于CQRS的信息, 請訪問 Axon Framework的網(wǎng)站: www.axonframework.org法严。它包含了背景知識的鏈接璧瞬。
由于CQRS與主導當今軟件局面的分層架構有著根本上的不同,開發(fā)人員試圖找到自己實現(xiàn)這個架構的方式渐夸,但往往會掉入各種陷阱嗤锉。這就是了Axon Framework 產(chǎn)生的原因:幫助開發(fā)人員實現(xiàn)CQRS,并讓他們只專注于業(yè)務邏輯墓塌。
Axon是什么?
Axon Framework 通過支持開發(fā)者應用命令查詢職責分離(CQRS)架構模式,來幫助構建可伸縮瘟忱、可擴展和可維護的應用程序奥额。它通過提供最重要的構建塊的實現(xiàn)來實現(xiàn),如:聚合访诱、倉儲以及事件總線(事件的調度機制)垫挨。此外,Axon提供了對注解(annotation)的支持,它允許你構建聚合和事件監(jiān)聽器而不用將你的代碼捆綁到Axon特有的邏輯触菜。這使你能夠專注于業(yè)務邏輯, 而不是數(shù)據(jù)傳輸(the plumbing)九榔,并幫助你使代碼更容易隔離測試。
Axon不會試圖以任何方式隱藏CQRS架構或任何組件涡相。因此哲泊,根據(jù)團隊規(guī)模,明智的選擇是催蝗,每 個團隊中有一個或多個對CQRS有著透徹了解的開發(fā)人員切威。不管怎么樣,Axon幫助保證把事件交付給正確的事件監(jiān)聽器,并按正確的順序并發(fā)處理它們丙号。這些多線程問題通常很難處理,導致難以跟蹤Bug先朦、應用程序完全失去響應。當你的時間緊迫,你可能甚至不想去關心這些問 題犬缨。Axon的代碼是經(jīng)過完全測試的,以防止這些類型錯誤的出現(xiàn)喳魏。
Axon Framework由多個模塊(jar)組成,這些模塊提供工具和組件來構建可伸縮的基礎設施怀薛。Axon核心模塊為不同的組件提供了基本的API刺彩,并為單JVM的應用程序解決方案提供了簡單實現(xiàn)。其他模塊提供專業(yè)的組件乾戏,來解決可伸縮性和高性能的問題。
何時使用Axon?
并不是每一個應用程序都會從Axon中獲益三热。簡單的CRUD (Create, Read, Update, Delete) 應用程序鼓择、沒有橫向擴展預期的應用程序,可能無法從CQRS或Axon中受益就漾。
具有以下一個或多個特點的應用程序可能會從CQRS和Axon中受益:
在相當長的一段時間內可能會擴展新的功能呐能。例如,一個網(wǎng)上商店可能初期僅僅是一 個訂單進度跟蹤系統(tǒng)抑堡。后期摆出,可能會擴展到對庫存信息的管理,確保物品售出后及時的更新 庫存首妖。隨后偎漫,財務人員可能需要銷售的財務統(tǒng)計數(shù)據(jù)等等。雖然很難預測軟件項目未來會如何發(fā)展有缆,但是大多數(shù)類型的應用程序都清楚地呈現(xiàn)為這樣象踊。
應用程序有一個比較高的讀寫比温亲,這意味著數(shù)據(jù)只寫幾次,但卻要讀很多次杯矩。由于查 詢的數(shù)據(jù)源與用于命令驗證的數(shù)據(jù)源不同栈虚,因此才有可能對數(shù)據(jù)源的快速查詢提供優(yōu) 化。重復數(shù)據(jù)不再是一個問題史隆,因為當數(shù)據(jù)改變時魂务,事件也會被發(fā)布。
應用程序需要不同格式的展示數(shù)據(jù)泌射,許多應用程序目前不僅僅只停留在顯示數(shù)據(jù)到網(wǎng) 頁上粘姜。 某些應用程序,例如,每月郵件通知所發(fā)生的與用戶有關的變化,搜索引擎也是一個例子魄幕。他們使用相同的應用程序數(shù)據(jù),但在某種意義上這是優(yōu)化的快速搜索相艇。 報表工具隨著時間的變化匯總信息,這同樣是同一數(shù)據(jù)的不同格式纯陨。使用Axon坛芽,每個數(shù)據(jù)源都可以彼此獨立地實時或定時更新。
當應用程序面對不同的受眾翼抠,清晰地隔離組件時咙轩,它也能從Axon中獲益。例如網(wǎng)上商 店阴颖。員工會在網(wǎng)站上更新產(chǎn)品信息和可用性活喊,同時客戶可以下單和查詢他們的訂單狀 態(tài)。通過Axon量愧,這些組件可以部署在不同的服務器上钾菊,并使用不同的策略進行擴展。 通過事件機制偎肃,Axon將分發(fā)事件到部署在不同服務器上的訂閱組件煞烫,使其保持最新的 數(shù)據(jù)狀態(tài)。
與其他應用程序集成可能是繁瑣的工作累颂。嚴格使用命令和事件定義應用程序的API滞详, 會使它更容易與外部應用程序集成。任何應用程序都可以發(fā)送命令或監(jiān)聽應用程序生 成的事件紊馏。