1. 程式人生 > >可落地的DDD(3)-如何利用DDD進行微服務的劃分

可落地的DDD(3)-如何利用DDD進行微服務的劃分

摘要

前面兩篇介紹了DDD的目標管理、DDD的工程結構調整。這篇討論微服務的劃分。微服務是目前後端比較流行的架構體系了,那麼如何做好一個微服務的劃分?一個微服務的粒度應該是多大呢?這篇主要介紹如何結合DDD進行領域劃分。

工程結構程式碼

上篇介紹了可落地的DDD的(2)-為什麼說MVC工程架構已經過時
很多朋友留言說,有沒有sample code,要不然太溼了,不是很明白。這裡寫了個sample。

就以一個部落格網站為例
page1:部落格列表頁: 展示所有使用者發表的部落格

page2: 個人介紹頁:有個人簡介和部落格列表

page3:部落格詳情頁.

不同的業務展示的使用者/部落格的欄位不一致

建模


後期應該會有使用者和部落格互動的需求。這期只有使用者建立部落格這層關聯關係。

MVC架構

使用mvc模式寫出來的程式碼,就是一路到底。
具體程式碼見mvc-structure

DDD

使用DDD寫出來的工程結構就是,blog和user的互動只有一個地方,OpenXXXService
具體程式碼見DDD structure

MVC VS DDD

從兩張依賴圖可以看出,DDD的依賴圖清晰了,user和blog這兩個領域之間的互動變的清晰了,user這個領域不用管blog領域發生了什麼變更。只依賴OpenBlogService,而MVC模式呢,user和blog之間的互動太多了,如果再增加其他功能,這些模組之間就是夠籌交錯,理不清楚。

不同領域之間的互動多了,意味著一旦發生變更,需要修改邏輯了,那麼需要修改的地方就是幾何倍數的相關類。

比如業務發生了變更,統計【個人中心】的部落格計數是使用者已發表的文章。而這個已發表的可能隨著業務的發展,包含多重含義

  1. 使用者寫完了,對外開放了,
  2. 運營稽核通過
  3. 部落格未被軟刪除的。
    這些邏輯都會影響相關的查詢,而這些邏輯的實現可能在資料庫層面做,可能在redis中做,或者其他的方式。以MVC的寫法,需要的需要修改的地方很多,以DDD的方式,不管這個邏輯怎麼變,其他領域不需要知道,只有blog領域知道,只用更改blog領域的程式碼。

微服務劃分

初版

確定了以DDD作為我們領域劃分的指導原則後,我們首先按照領域對我們的業務進行了全面的分析,區分出哪些領域。然後按照如下標準進行了微服務的拆分

  1. 一個領域一個服務的規則去拆分,
  2. 同時為了保證領域的純潔性,我們區分了領域服務,和前臺服務。領域服務就是領域邏輯,不直接對前端暴露。前臺服務組裝各個領域服務,暴露給前端。
  3. 同時為了保持擴充套件,我們預留了一個微服務作為服務孵化器。對於領域不清晰的(比如大部分的新的業務),放在這個服務裡面孵化,然後等領域足夠大的時候再拆分出去。

如下圖

前臺應用:
pc: pc端的頁面展示
mobile: 移動端的頁面展示
mini:小程式的頁面展示

領域服務:
blog: 部落格領域
user: 使用者領域
growth: 領域孵化器

按照這樣的標準去拆分後,一段時間後,很多問題暴露了。

  • 服務熱點問題
    我們是一個新的業務,在業務迭代的過程中,大部分新需求都是領域不清晰,不知道能不能迭代下去的。所以按照之前的標準,都往growth服務裡面去寫程式碼,這樣導致幾乎團隊裡面的所有的人都在開發這一個專案,失去了拆分微服務的意義。

  • 服務依賴太嚴重
    無論寫什麼需求,都需要寫多個應用,領域服務1個,前臺如果有pc,需要在pc服務上開發,移動端要展示,要在mobile服務開發。服務之間的呼叫需要寫rpc client介面,需要發版本,因為同時開發的人多,經常發生版本混亂,依賴問題。服務上線也很頭疼,改一個小需求,需要部署多個服務。微服務一個很重要的點是去耦合,可獨立部署。多了一層UI層作為微服務顯然不是很合適。

  • 領域劃分有問題
    一個領域一個服務,粒度太小,有些東西不知道放在哪個服務裡面,比如使用者收藏部落格,是放在使用者服務裡面,還是放在部落格領域呢。

如何解決

不拆分單體應用不知道,一拆分問題一大堆。那麼我們是怎麼解決的呢?下期再見。

相關閱讀
可落地的DDD(1)-目標討論
可落地的DDD的(2)-為什麼說MVC工程架構已經過時

關注【方丈的寺院】,第一時間收到文章的更新,與方丈一起開始技術修行之路

相關推薦

落地DDD(3)-如何利用DDD進行服務劃分

摘要 前面兩篇介紹了DDD的目標管理、DDD的工程結構調整。這篇討論微服務的劃分。微服務是目前後端比較流行的架構體系了,那麼如何做好一個微服務的劃分?一個微服務的粒度應該是多大呢?這篇主要介紹如何結合DDD進行領域劃分。 工程結構程式碼 上篇介紹了可落地的DDD的(2)-為什麼說MVC工程架構已經過時 很多朋

落地DDD(4)-如何利用DDD進行服務劃分(2)

摘要 在前面一篇介紹瞭如何通過DDD的思想,來調整單體服務內的工程結構,為微服務的拆分做準備。同時介紹了我們在進行微服務拆分的時候踩過的一些坑。 這篇介紹下我們最終的方案,不一定對,歡迎留言討論。 微服務劃分 問題分析 上篇介紹過我們一開始的服務劃分標準 一個領域一個服務的規則去拆分, 同時為了保證領域的

通過Python利用saltstack進行生成服務器資產清單

Pythonsaltstac(以下代碼Linux測試成功)linux-node0.oldboyedu.com 192.168.1.30 安裝salt-master,salt-minionlinux-node1.oldboyedu.com 192.168.1.31 安裝salt-minion這裏主要用到sa

DevOps架構下如何進行服務效能測試?

一. 微服務架構下的效能測試挑戰 微服務與DevOps 微服務是實現DevOps的重要架構 微服務3S原則 DevOps核心點   微服務架構下的業務特點 億級使用者的平臺 單服務業務隨時擴容 服務之間存在相互呼叫關係 版本更新快,上線週期短

在Kubernetes上進行服務部署

大多數人在生產環境中執行Docker,是把它作為構建和移動部署配置的一種方式。然而,他們的部署模型要麼非常整體化,要麼有幾個大的服務模組組成。使用真實的容器化微服務最大的障礙在於,很多人不太清楚如何管理和協調容器大規模負載。今天我們將探討如何基於微服務部署來構建

利用Java上手服務架構

作者: Alexsandro Souza​ 幾乎每個人都在關注微服務架構,我們也不例外。作為一個與時俱進的程式設計師,我一直在努力瞭解這一架構,希望尋找一種通過Spring在Java中實現微服務架構的方法。 我們公司雖然很棒,但技術堆疊略顯過時,至今還沒有使

使用jMeter構造大量併發HTTP請求進行服務效能測試

比如我開發好了一個微服務,想測試其在大併發請求下的效能表現如何。 比較方便的一個做法是使用工具jMeter來構造這些請求。 建立一個新的工程: 建立一個新的Thread Group,下圖意思是這個工程會使用3個執行緒同時發請求,每個請求執行一次。

docker服務部署之:七、Rancher進行服務擴容和縮容

href url http 部署 logs doc .html htm 服務 docker微服務部署之:六、Rancher管理部署微服務 docker微服務部署之:七、Rancher進行微服務擴容和

使用Hystrix進行服務降級管理

微服務架構 分享圖片 關於 出現 嚴重 group 簡單的 入門 註釋 前言:目前我們的項目是微服務架構,基於dubbo框架,服務之間的調用是通過rpc調用的。剛開始沒有任何問題,項目運行健康、良好。可是過了一段時間,線上總有人反應查詢訂單失敗,等過了一段時間才能查到。這是

如何用Pact進行服務整合測試

原文連結 https://codefresh.io/docker-tutorial/how-to-test-microservice-integration-with-pact/ 挑戰:微服務整合測試 遷移到微服務對測試我們的系統產生了新的挑戰。理論上每個微服務都應該是隔離的並可以獨立操作。但在實踐中一個服務

服務劃分,服務之間通信到程序員能力提高的一些思考

程序 問題 播放 外部 實現 數據庫的操作 有一個 對數 設計   這個問題是由工作中的一次需求的變動引起的。 1:為什麽會有這個思考   我們當前做的是一個視頻門戶系統,這個系統分為四個子系統:cms(內容系統),bms(訂購系統),tms(終端管理系統),ims(用戶系

服務劃分的姿勢

我們知道微服務是一種理念,沒有確切的定義和邊界,好比設計原則,是屬於抽象的概念。在定義不明確的情況下談劃分也是一種各說各話,具體問題需要具體分析,所以這篇文章談到的劃分也不是絕對標準,僅供參考。   有人說微幅不難,難的是服務的劃分,雖然我持保留意見。但是從側面也反應了劃分具有一定的困難。這裡的矛盾

關於服務劃分的一些思考

我們公司落地微服務架構已多年,而我也接觸開發了一段時間了。恰好,最近又抽空把《微服務設計》一書隨手翻了一遍,便有了抒寫此文的念頭,雖然文中所述並非具有很強的普適性,倒也權當自己近來的總結和思考罷了。 我想對於許多初始接觸微服務開發的人員來說,都會或多或少有這樣的疑問 微服務應該如何劃分? 我的服務粒度應該如

落地DDD的(2)-為什麼說MVC工程架構已經過時

摘要 mvc是一種軟體設計模式,最早由Trygve Reenskaug在1978年提出,他有效的解決了表示層,控制器層,邏輯層的程式碼混合在一起的問題,很好的做到了職責分離。但是在實際的編碼實踐過程中,你會發現這個模式隨著業務的擴充套件,變的邏輯混亂,程式碼重合度很高。這裡提出借鑑DDD思想的一種新的工程結構

信公眾平臺網頁開發實戰--3.利用JSSDK在網頁中獲取地理位置(HTML5+jQuery)

fff .html 1.4 style minimum log fill rdquo 位置 復制一份JSSDK環境,創建一份index.html文件,結構如圖7.1所示。 圖7.1 7.1節文件結構 在location.js中,封裝“getLoc

信小程序如何利用關鍵詞進行占位?

微信小程序 微信小程序排名 微信小程序從一開始的精準搜索,到模糊搜索,再到關鍵字搜索,完成了質的飛躍。開發者們不再是單純開發出一款小程序上線就大功告成了,現在還要考慮如何利用關鍵詞讓自己的小程序得到更多的曝光。那麽微信小程序的關鍵詞應該如何占位呢? 小程序多了自然就需要

3-3利用生成器實現叠代對象

start info com cal prim 生成 rime shell div 包含yield語句的函數就是生成器函數。函數裏有yield關鍵字,則是生成器,生成器內置有__iter__方法,只不過調用__iter__返回的是生成器本身,利用這一特性,可以創建一個可叠

3利用GDB進行程序調試

card shell 編號 設置 語法 處的 lan 進行 接受 本文將用一個實際例子講解如何通過GDB進行程序調試。 首先,我們需要理解的是GDB是GNU開源組織發布的一個強大的UNIX下的程序調試工具,其產生和調試的目的是讓調試者知道,程序在執行時內部發生了什麽,或者運

開發者測試(3)-采用精準測試工具對springcloud服務應用進行穿透測試

art windows 說明 出發 並且 rgs 依次 reg web目錄 1、微服務簡介   微服務英文名稱Microservice,Microservice架構模式就是將整個Web應用組織為一系列小的Web服務。這些小的Web服務可以獨立地編譯及部署,並通過各自暴露的A

從壹開始服務 [ DDD ] 之六 ║聚合 與 聚合根 (下)

前言 哈嘍大家週二好,上次咱們說到了實體與值物件的簡單知識,相信大家也是稍微有些瞭解,其實實體咱們平時用的很多了,基本可以和資料庫表進行聯絡,只不過值物件可能不是很熟悉,值物件簡單來說就是在DDD領域驅動設計中,為了更好的展示領域模型之間的關係,制定的一個物件,它沒有狀態和標識,目的就是為了表示一個值。今天