使用Axon框架實現一個CQRS示例應用
命令查詢職責分離 (CQRS)是構建軟件系統的一種方式,它的思想是將對狀態的查詢部分與改變狀態的部分進行分離。 Axon框架 是一個基于Java實現的CQRS框架,提供了對大多數重要構建塊的實現,例如聚合、命令與事件總線、以及repository,以幫助開發者在構建應用程序時使用CQRS架構模式。 Dadepo Aderemi 最近撰寫了一系列博客文章,講解了CQRS的概念,并通過一個小型的CQRS演示應用, 探索Axon框架所提供的各種構建塊 。
Aderemi是來位于阿姆斯特丹的 Trifork 公司的一位軟件開發者,對于他來說,CQRS中的命令這方面最重要的部分包括:
- 命令 (Command),它負責捕獲用戶的意圖,即接下來應該發生什么事。在Axon中,命令被實現為 POJO 對象,因而無需實現任何接口。
- 命令處理器 (Command Handler),它負責執行所發送的命令。在Axon中,可以選擇通過實現某個接口的方式創建它,也可以通過注解符實現。
- 命令總線 (Command Bus),負責將命令傳遞給對應的命令處理器。Axon總共提供了四種實現方式,Aderemi選擇了一種簡單的同步總線用于傳遞命令。另一種實現方式是通過異步總線以異步的方式處理命令。
Aderemi指出,在CQRS的相關討論中經常會出現源于 領域驅動設計 (DDD)的一些概念,他相信對于DDD的基本了解有助于CQRS的學習。這其中有兩個重要的概念,一是 聚合 (Aggregate),這是一種邏輯性的概念,它定義了一個領域對象的集合,處于該集合中的對象具有原子性,表現為一個內聚的總體。另一個概念是 聚合根 (Aggregate Root),它指的是聚合中的某個實體,它內含其它實體對象,并負責確保整個聚合始終處于一致的、內聚的狀態。在Axon中提供了一個 AbstractAggregateRoot 類型,可以通過擴展它實現一個聚合根。
在查詢這一方面,最重要的部分包括:
- 領域事件 (Domain Event),它表示發生于過去的某事,由領域中的狀態變化、命令及命令處理器中所初始化的變化所創建。
- 事件總線 (Event Bus),它負責將事件傳遞給查詢方。Axon中提供了多種實現方式,Aderemi選擇了一種較簡單的實現。
- 事件處理器 (Event Handler),它負責偵聽事件,通過事件中所包含的信息,在查詢方反應出應用程序的狀態。在Axon中,可通過注解符定義事件處理器。
通過 事件溯源 (Event Sourcing),所有對狀態造成變化的事件都被保存下來,而不是保存應用當前的狀態。可以通過對于原始狀態重演所有已發生事件的方式獲取當前狀態。Axon對于EventStore接口提供了多種實現方式,包括NoSQL和關系型數據庫的實現。在Aderemi的演示應用的后期版本中,他實現了一個事件溯源策略,能夠將事件持久化至文件中。
Axon還提供了一個測試的基礎設施,它的實現方式遵循 行為驅動開發 (BDD)的思想。Aderemi在他的演示應用中包含了測試代碼。他特別指出,該測試基礎設施所關注的是作為對所發送的命令的回應而發布的事件,這樣可以避免產生對某個API實現的依賴。
Aderemi已將他的演示應用 exploringCQRSwithAxon 發布在GitHub上。他正準備在一篇總結性的文章中表達他對于CQRS這種架構,以及Axon如何幫助使用者實現這一架構的觀點。
Axon框架是由同樣任職于Trifork的 Allard Buijze 所開發的一套開源產品,計劃在2016年第一季度推出第三個版本。
來自: http://www.infoq.com/cn/news/2016/02/cqrs-axon-example