為什麼要使用MVC+REST+CQRS架構

banq發表於2013-07-20
具體來說,前端瀏覽器:angular.js等MVC框架;後端: REST+ CQRS

angular.js等MVC框架是指前端瀏覽器的MVC框架,而不是類似Struts 或SpringMVC之類的伺服器端後端MVC框架。

關於後端MVC框架的問題可見《MVC模式已死 》http://www.jdon.com/38448

基於任務的UI(Task-Based UI)

伺服器端的MVC框架主要問題是粒度太粗,只能適合傳統的CRUD簡單粗放的應用,當我們的軟體系統轉向以使用者體驗為主,而不是以企業自身資源管理為主的模式時,響應式設計必然擁有良好的使用者感受,而傳統後端MVC固定的框架針對大量客戶端併發事件處理無疑是力不從心,想象一下,使用者滑鼠一移動就可能發出一個事件,這麼多事件如果每個都走Model-View-Controller這樣一個流程,僅Controller就要編制多少?程式設計成本極高,維護擴充起來很不方便。

將MVC框架移植到瀏覽器前端(Rich Client),則可以巧妙迴避以上問題,javascript的函式風格使得其處理事件來得更簡單,對於圍繞模型的操作則可以使用MVC實現。見:JavaScript大型可擴充套件的設計模式,而模型則是從後端領域層以JSON方式推送過來。

後端架構是:REST+CQRS,將REST和CQRS組合在一起成為CQREST架構。

REST的好處是針對資源進行簡單輕量的操作,REST核心兩個概念是資源和狀態,而我們可以認為這個資源實際就是領域模型,通常是DDD領域驅動設計中的聚合根Aggregate,而狀態是則是聚合根的狀態,驅動狀態變化的是REST的POST/PUT/GET/DELETE四個方法。這樣REST和DDD無縫吻合在一起了。

再看看REST的四個方法實際也分兩種型別:讀和寫。其中POST/PUT/DELETE屬於對領域模型資源進行寫操作的命令,屬於CQRS的Command路線;而GET屬於客戶端發出Query查詢,屬於CQRS的Query讀路線。
這樣REST又和CQRS無縫吻合在一起。

我曾經在《沒有人真正理解REST or HTTP》http://www.jdon.com/41716中說:
將來是否有一種技術思想,將DDD REST以及面向函式三者完美捆綁一起,透過URL代表領域模型類圖的結構關係,比如/forum/thread,代表Forum類的子類Thread,領域模型被顯式地用URL表達出來,使用者訪問形式和我們分析設計的模型合二為一,大道至簡。

而時隔兩年的今天已經實現了:《使用Yoga靈活實現REST》http://www.jdon.com/45544

如果說DDD的領域模型是核心,那麼REST就是核心外的輕量殼,而CQRS則是殼和核心之間的組織,三者如有機體一樣天然組合在一起,簡單,易用,靈活,可伸縮,易於維護。

從緩慢的歷史變化中我們應該發現一個主脈方向:MVC + REST + CQRS,如此堅定一路走來,無疑他們代表未來一種即將普及的主流架構風格。

參考:
J2EE死了 javacript + 後端JSON服務方式勝出 :http://www.jdon.com/44690
CQREST英文: http://prezi.com/svfmvrx9dq_x/cqrs-and-rest/
使用 Angular.js, Node.js 和 MongoDB開發簡單案例:http://www.jdon.com/45599

[該貼被admin於2013-07-20 19:21修改過]

相關文章