Axon框架之架構(gòu)預(yù)覽

CQRS本身就是一個非常簡單的模式。他只是規(guī)定了應(yīng)用程序的命令處理的組件(增,刪,改)應(yīng)該和查詢的組件進行分離。盡管這種分離模式本身非常簡單,但是當(dāng)與其他模式結(jié)合在一起時,它就提供了許多非常強大的功能。Axon提供了可以配合CQRS使用且很輕松地實現(xiàn)各種模式的構(gòu)建塊。

下圖顯示了基于CQRS的事件驅(qū)動架構(gòu)的擴展布局示例。顯示在左側(cè)的UI組件以兩種方式與應(yīng)用程序的其余部分進行交互:向應(yīng)用程序發(fā)送命令(如頂部分所示),并向應(yīng)用程序查詢信息(如底部分所示)。

888.png

命令(Command)通常由比較簡單的對象來表示,這些對象包含了command handler(處理command的程序)要處理該命令所需的所有數(shù)據(jù)。一個命令通常用它的名字來表達它的意圖。用Java語言來說,這意味著類名是用來表明需要做什么的,而類里的字段則提供所需的數(shù)據(jù)。

當(dāng)Command Bus(命令總線)收到command的時候會把他路由到對應(yīng)的Command Handlers。每個Command Handler只會接收他指定類型的command并根據(jù)command里的內(nèi)容來執(zhí)行相應(yīng)的業(yè)務(wù)邏輯。然而,在某些情況下,無論命令的實際類型(如驗證,日志記錄或授權(quán))是什么,他還是要執(zhí)行對應(yīng)的邏輯。

Command Handler從repository (倉儲,在DDD中他們將持久化數(shù)據(jù)的地方抽象出的一個概念)獲取到領(lǐng)域?qū)ο螅ˋggregates,聚合),然后在領(lǐng)域?qū)ο髨?zhí)行對應(yīng)的方法(method)從而來改變它們的狀態(tài)。這些聚合通常包括具體的實際業(yè)務(wù)邏輯,因此他們須要維護自己內(nèi)部的數(shù)據(jù)一致性。聚合的狀態(tài)變化會導(dǎo)致產(chǎn)生領(lǐng)域事件。領(lǐng)域模型由領(lǐng)域事件和聚合組成。

倉儲(repository)負(fù)責(zé)提供對聚合根的訪問。通常情況下,這些倉儲庫只會針對通過其唯一標(biāo)識符來查找聚合進行優(yōu)化。一種方式是,倉儲存儲的是聚合本身的狀態(tài)(例如使用對象關(guān)系映射),而另一種是,倉儲通過Event Store存儲聚合在各種行為中產(chǎn)生的真實事件。倉儲還負(fù)責(zé)持久化聚合產(chǎn)生的事件。

Axon提供了對直接持久化聚合(例如使用對象關(guān)系映射方式)和事件溯源 (event sourcing)的支持。

事件總線(Event bus)會將事件分發(fā)給所有感興趣的事件監(jiān)聽者。他可以是同步方式也可以是異步方式。異步方式允許事件發(fā)送出去后就直接返回并將控制權(quán)交給用戶,而此時的后臺應(yīng)用程序也會對事件進行處理。這樣好處就是用戶無需等待事件處理完成后才能做其他的事,所以應(yīng)用程序的響應(yīng)速度就會更快。另一方面,同步事件處理更簡單且符合常理。默認(rèn)情況下,同步處理方式會將command的處理和event的處理放進同一個事務(wù)中。

Event listeners接收事件并處理它們。-些hanndler的操作是更新數(shù)據(jù)源的數(shù)據(jù),而另一些是將消息發(fā)送到其他外部系統(tǒng)。您可能會注意到,command handlers完全不知道接下來會發(fā)生什么事。這意味著對擴展應(yīng)用程序新功能是非入侵式的。所以你需要做的是添加另一個事件監(jiān)聽器(event listener)。事件將應(yīng)用程序中的所有組件很松散地耦合在一起。

在某些情況下,事件處理需要將新命令發(fā)送給應(yīng)用程序。例如,當(dāng)我們收到一個訂單,這可能意味著客戶的賬戶應(yīng)該扣掉買商品的錢,并且必須告知運送方準(zhǔn)備運送所購買的商品。在許多應(yīng)用中,邏輯將變得比這更復(fù)雜:如果客戶沒有及時付款呢?您會立即寄出貨物,還是先等待付款?saga是CQRS的概念,它負(fù)責(zé)管理這些復(fù)雜的業(yè)務(wù)事務(wù)。

Axon 框架從3.1版本開始提供了組件來處理查詢(query)。查詢總線(Query Bus)收query并將其路由到查詢處理Handler(Query Handlers)。query handler會到查詢總線上注冊,同時會帶上他能處理的query類型及響應(yīng)類型。查詢和結(jié)果類型通常都是簡單的只讀DTO對象。這些DTO的內(nèi)容通常由用戶界面的決定。在大多數(shù)情況下,它們直接映射到UI中的特定視圖(也稱為“按視圖”)。

可以為相同類型的查詢和響應(yīng)類型注冊多個Query handler。當(dāng)分發(fā)query的時候,客戶端可以指定他是想要一個結(jié)果還是來自所有可用的query handlers的結(jié)果。

Axon模塊結(jié)構(gòu)

Axon Framework包含了很多模塊來應(yīng)對CQRS的特定問題領(lǐng)域。根據(jù)你項目的使用情況,可以自己選擇一個或者多個模塊。

從Axon2.1起,所有模塊兼容OSGi。這意味著它們在manifest文件包含所需的頭文件,并聲明它們導(dǎo)入和導(dǎo)出的包。目前,只有Slf4J bundle(1.7.0 <= 版本< 2.0.0)是必需的。所有其他導(dǎo)入的都被標(biāo)記為可選的。

主要模塊

Axon的主要模塊是經(jīng)過全面測試的模塊,足夠堅固,可用于苛刻的生產(chǎn)環(huán)境。所有這些模塊的maven groupId是org.axonframework。

Core模塊正如其名一樣,他是Axon的核心模塊。如果您使用單節(jié)點設(shè)置,則該模塊可能會提供您需要的所有組件。所有其他的Axon模塊都依賴于這個模塊,所以它必須始終在classpath可用。

Test模塊包含測試功能,可用于測試基于Axon的組件,如Command Handlers, Aggregates and Sagas。您通常在運行時不需要此模塊,只需在測試期間將其添加到classpaths中即可。

分布式CommandBus模塊包含可用于在多個節(jié)點上分發(fā)命令的實現(xiàn)。它使用JGroups和Spring Cloud Connectors來連接其他節(jié)點。

AMQP模塊提供的組件允許您使用基于AMQP的消息中間件作為分發(fā)機制來構(gòu)建EventBus。即使Event Handler暫時不可用,也可以保證傳送。

Spring模塊允許在Spring應(yīng)用程序上下文中配置Axon組件。它還提供了許多特定于Spring Framework的構(gòu)建塊實現(xiàn),例如用于在Spring消息通道上發(fā)布和檢索Axon事件的適配器。

MongoDB是一個基于文檔的NoSQL數(shù)據(jù)庫。 Mongo模塊提供了Event和Saga Store實現(xiàn),它們將事件流和saga存儲在MongoDB數(shù)據(jù)庫中。

幾個AxonFramework組件提供監(jiān)視信息。Metrics模塊提供了基于Codehale的基本實現(xiàn)來收集監(jiān)控信息。

使用Axon API

CQRS是一種架構(gòu)模式,因此無法提供適合所有項目的單一解決方案。很明顯,Axon框架并不試圖提供這種解決方案。取而代之的是,Axon提供了遵循最佳實踐的實現(xiàn)方法,以及根據(jù)您的具體要求調(diào)整每個實現(xiàn)的方法。

幾乎所有的基礎(chǔ)設(shè)施構(gòu)建塊都會提供鉤子點(例如攔截器,解析器等),允許您將特定于應(yīng)用程序的行為添加到這些構(gòu)建塊。在很多情況下,Axon將為那些適合大多數(shù)用例的鉤子點提供實現(xiàn)。如果需要的話,你可以簡單地實現(xiàn)你自己的。

非基礎(chǔ)設(shè)施對象,如消息,通常是不可變的。這確保了這些對象可以安全地在多線程環(huán)境中使用,沒有副作用。

為確保定制最大化,所有的Axon組件都使用接口進行定義。抽象和具體的實現(xiàn)類你可以根據(jù)你自己的情況選擇使用,不會影響到框架的依賴。你甚至可以使用該接口來構(gòu)建你自己想要的實現(xiàn)。

Spring支持

Axon框架為Spring提供了廣泛的支持,但強制您使用Axon的時候也必須要用Spring。所有組件都可以以編程方式進行配置,并且不需要把Spring放在classpath路徑中。但是,如果你使用Spring,使用Spring的注解支持,許多配置變得更加容易。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,695評論 19 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,288評論 6 342
  • 遙望美人醉,欲流淚,風(fēng)雨飄搖蟲花睡 霓虹燈亦碎,人憔悴,水火不定萬物飛 千年古城催,情難追,緣分即盡盼輪回 倩人影...
    浪者天宇閱讀 190評論 0 0
  • 文摘: 1. 那些沒有找到他們真正的財富,也就是本體的喜悅以及與它緊密聯(lián)系在一起的、深刻而不可動搖的寧靜的人,就是...
    擺擺song閱讀 337評論 0 1
  • 離開你的時候,你說,一定要做一個快樂的人,不管生活有多么的乏味和無奈,你都要保持自己要快樂的初衷,因為不快樂的你,...
    Tina嬤嬤閱讀 494評論 0 2

友情鏈接更多精彩內(nèi)容