微服務與無服務器知識大放送(二)
- 作者:新網(wǎng)
- 來源:新網(wǎng)
- 瀏覽:100
- 2018-05-03 13:24:03
本示例中的命令端提供了REST API,可接受通過HTTP發(fā)送的請求。請求采取命令的形式,可以驅動對微服務所擁有的領域數(shù)據(jù)的狀態(tài)更改。簡單來說,對領域數(shù)據(jù)的任何寫入都將以命令形式從API請求流出,處理導致數(shù)據(jù)庫發(fā)生更改的操作。
我們將一個微服務分為命令端、查詢端和事件處理器,這三個部分可以相互獨立地部署。
<
div>
命令端
本示例中的命令端提供了REST API,可接受通過HTTP發(fā)送的請求。請求采取命令的形式,可以驅動對微服務所擁有的領域數(shù)據(jù)的狀態(tài)更改。簡單來說,對領域數(shù)據(jù)的任何寫入都將以命令形式從API請求流出,處理導致
數(shù)據(jù)庫發(fā)生更改的操作。
命令觸發(fā)操作,操作觸發(fā)領域事件。領域事件保存在事件存儲中,也就是“一個將數(shù)據(jù)庫與消息代理相結合的系統(tǒng)。”最合適入門使用的事件存儲是Eventuate,是由Chris Richardson創(chuàng)建的項目,旨在幫助將CQRS和Event Sourcing應用到微服務。
領域事件存儲為按時間順序排列的一系列事件,附加在日志上。由于每個命令都生成一個事件,我們能夠根據(jù)收集的事件歷史記錄重新構建當前系統(tǒng)的總體狀態(tài)。
事件處理器
我們要探討的下一個組件是事件處理器。這個CQRS組件采用Worker應用的形式,負責攝取領域事件。事件處理器是無狀態(tài)的,并偵聽來自事件存儲的消息,對傳入的事件消息采取操作。
事件處理器可通過很多有用的方式對新的領域事件作出響應。一個領域事件可以生成多個事件,這些事件可以發(fā)送到其他微服務。這就是為什么大多數(shù)微服務開發(fā)人員都被CQRS吸引,因為通過這種方法可以發(fā)布和訂閱來自限界環(huán)境之外的應用的領域事件。
這種方法為我們提供了一種機制,可確保領域數(shù)據(jù)的引用完整性。來自其他微服務的消息可用來處理領域事件,從而讓我們能夠維護分布式系統(tǒng)中與其他記錄的領域數(shù)據(jù)相關的惱人的外鍵關系。
查詢端
事件處理器首要負責應用可改變領域整合狀態(tài)的領域事件。每個領域事件都可用來更新數(shù)據(jù)庫記錄,形成描述整合的增量實體化視圖。反過來,查詢端將提供一個REST API,允許HTTP客戶端讀取從已處理事件生成的實體化視圖。
查詢端組件中的限制是領域數(shù)據(jù)是只讀的。此系統(tǒng)中的所有狀態(tài)更改都會從命令端流入,然后形成可在查詢端讀取的實體化視圖。