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