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

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

摘要

在前面一篇介紹瞭如何通過DDD的思想,來調整單體服務內的工程結構,為微服務的拆分做準備。同時介紹了我們在進行微服務拆分的時候踩過的一些坑。
這篇介紹下我們最終的方案,不一定對,歡迎留言討論。

微服務劃分

問題分析

上篇介紹過我們一開始的服務劃分標準

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

實踐後有些典型的問題也比較突出

  • 服務熱點問題
    我們是一個新的業務,在業務迭代的過程中,大部分新需求都是領域不清晰,不知道能不能迭代下去的。所以按照之前的標準,都往growth服務裡面去寫程式碼,這樣導致幾乎團隊裡面的所有的人都在開發這一個專案,失去了拆分微服務的意義。
  • 服務依賴太嚴重
    無論寫什麼需求,都需要寫多個應用,領域服務1個,前臺如果有pc,需要在pc服務上開發,移動端要展示,要在mobile服務開發。服務之間的呼叫需要寫rpc client介面,需要發版本,因為同時開發的人多,經常發生版本混亂,依賴問題。服務上線也很頭疼,改一個小需求,需要部署多個服務。微服務一個很重要的點是去耦合,可獨立部署。多了一層UI層作為微服務顯然不是很合適。
  • 領域劃分問題
    一個領域一個服務,粒度太小,有些東西不知道放在哪個服務裡面,比如使用者收藏部落格,是放在使用者服務裡面,還是放在部落格領域呢。

三個比較突出的問題,反應出的共性問題就是

  • 服務邊界不清晰

    微服務的邊界不清晰,起因肯定是標準定義的不夠準確

  • 服務之間依賴多了

    微服務的一個重要特徵就是自治性,如果依賴的服務多了,那麼我們就享受不到微服務帶來的好處,而只能感受到微服務的壞處。

解決手法

為了解決以上問題,我們反思了下我們的劃分標準,組內進行了深入的討論。一致覺得是因為我們為了推行DDD,在沒有深入思考的情況下,過早的進行了大面積的微服務拆分。導致了諸多的問題。雖然這麼做在當時的情況下,是最優的解決方案,但是帶來的問題也很突出。那什麼時候才是進行微服務拆分的最好時機呢?

因為理論學習、認知始終都沒有盡頭,只有實踐才能出真知。我們沒有糾結在過去的錯誤之中,而是重新讀取了DDD的理論。這一次有了不一樣的思考。

DDD中有戰略設計,劃分領域,找出限界上下文,識別出核心域。然後有戰術設計,對領域進行建模,
聚合根、實體、值物件、領域服務、領域事件等。戰略設計通常就是指導思想,戰術設計是具體打法。我們一開始認定要
先有指導思想,然後再有具體打法。現在發現我們錯了,指導思想不是一蹴而就的,也不是不成不變的。在一開始沒有標準時,它必須要來源於實際打法中。
同時需要在實踐過程中不斷總結,修正、完善指導思想。

於是我們又重新梳理了一遍我們的整體業務

前臺功能

把我們所有端的前臺功能都梳理一遍,畫成圖

業務架構全景

根據前臺功能,進一步整理,抽象出業務架構全景

劃分出上下文

根據業務架構全景,在核心域中建立出限界上下文,拆分微服務

非常抱歉了,涉及敏感資訊,這裡不能貼圖,如果覺得太抽象不好理解,請參考DDD落地:業務分析師和架構師的完美結對

新的微服務劃分標準

我們提出了一種新的微服務劃分標準

  • 確定以限界上下文為微服務劃分的標準

    限界上下文的劃分很難,但是必須要做。限界上下文不是憑空造出來的,而是從一個實體關聯關係、與業務人員溝通出來的。

  • 服務的演進是以限界上下文作為單元進行演進的

    之前我們拿一個微服務作為領域孵化器,其實就是放棄了對業務的整體認知,和對新需求的業務思考。
    我們的新業務不是一個新產品,全部推倒重來的。大多時候它還是解決某類業務上的問題。只是採取的手段不一樣罷了。
    所以我們需要挖掘其本質,將它放到現有的上下文中。每個上下文一個微服務,對應一個開發owner,他負責這個領域內的事情。
    這樣每個服務都有新的領域孵化。

舉例

以電商舉例,如果只是一個創業公司,不可能都跟阿里巴巴一樣的架構,上百個服務。但是解決的問題電商領域可以抽象出來。

限界上下文

分為人、貨、場、交易幾個上下文。然後不斷的孵化,哪一部分是你業務的核心域,然後不斷的服務拆分,比如你也是一家做垂直電商的公司,這些基本的東西肯定不應該是你的核心域,只能是支撐域,要不然你的業務肯定發展不起來。

微服務的劃分

從限界上下文中抽出微服務,一個微服務中包含了多個領域。

另外我們遺棄了之前的UI服務,所有微服務可以直接和前臺互動,這樣可以有效的減少服務的依賴。
只有當需要多個領域進行組合時,我們才寫在一個新的【組合ui】服務裡面

另外限界上下文不是一層不變的,比如商品營銷,是一個領域,業務簡單時和商品的關聯性比較大,放在商品域。當你需要同時對店鋪做營銷,對使用者做營銷,顯然他不應該在商品上下文了,那麼可以剝離出來,作為一個獨立的限界上下文:營銷上下文。

相關閱讀

可落地的DDD(1)-目標討論

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

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

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

相關推薦

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

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

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

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

資料基礎---《利用Python進行資料分析·第2版》第4章 NumPy基礎:陣列和向量計算

之前自己對於numpy和pandas是要用的時候東學一點西一點,直到看到《利用Python進行資料分析·第2版》,覺得只看這一篇就夠了。非常感謝原博主的翻譯和分享。 NumPy(Numerical Python的簡稱)是Python數值計算最重要的基礎包。大多數提供科學計算的包都是用Nu

使用laravel5.4結合easywechat進行信開發--基本配置

基本配置 facade chat aca detail alias http vid class 配置Laravel: 1:config/app.php中 ‘providers‘ => [ // ... Overtrue\LaravelWeChat\Serv

通過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

資料基礎---《利用Python進行資料分析·第2版》第12章 pandas高階應用

之前自己對於numpy和pandas是要用的時候東學一點西一點,直到看到《利用Python進行資料分析·第2版》,覺得只看這一篇就夠了。非常感謝原博主的翻譯和分享。 前面的章節關注於不同型別的資料規整流程和NumPy、pandas與其它庫的特點。隨著時間的發展,pandas發展出了更多適

資料基礎---《利用Python進行資料分析·第2版》第6章 資料載入、儲存與檔案格式

之前自己對於numpy和pandas是要用的時候東學一點西一點,直到看到《利用Python進行資料分析·第2版》,覺得只看這一篇就夠了。非常感謝原博主的翻譯和分享。 訪問資料是使用本書所介紹的這些工具的第一步。我會著重介紹pandas的資料輸入與輸出,雖然別的庫中也有不少以此為目的的工具

資料基礎---《利用Python進行資料分析·第2版》第11章 時間序列

之前自己對於numpy和pandas是要用的時候東學一點西一點,直到看到《利用Python進行資料分析·第2版》,覺得只看這一篇就夠了。非常感謝原博主的翻譯和分享。 時間序列(time series)資料是一種重要的結構化資料形式,應用於多個領域,包括金融學、經濟學、生態學、神經科學、物

資料基礎---《利用Python進行資料分析·第2版》第10章 資料聚合與分組運算

之前自己對於numpy和pandas是要用的時候東學一點西一點,直到看到《利用Python進行資料分析·第2版》,覺得只看這一篇就夠了。非常感謝原博主的翻譯和分享。 對資料集進行分組並對各組應用一個函式(無論是聚合還是轉換),通常是資料分析工作中的重要環節。在將資料集載入、融合、準備好之

資料基礎---《利用Python進行資料分析·第2版》第8章 資料規整:聚合、合併和重塑

之前自己對於numpy和pandas是要用的時候東學一點西一點,直到看到《利用Python進行資料分析·第2版》,覺得只看這一篇就夠了。非常感謝原博主的翻譯和分享。 在許多應用中,資料可能分散在許多檔案或資料庫中,儲存的形式也不利於分析。本章關注可以聚合、合併、重塑資料的方法。 首先

資料基礎---《利用Python進行資料分析·第2版》第7章 資料清洗和準備

之前自己對於numpy和pandas是要用的時候東學一點西一點,直到看到《利用Python進行資料分析·第2版》,覺得只看這一篇就夠了。非常感謝原博主的翻譯和分享。 在資料分析和建模的過程中,相當多的時間要用在資料準備上:載入、清理、轉換以及重塑。這些工作會佔到分析師時間的80%或更多。

資料基礎---《利用Python進行資料分析·第2版》第5章 pandas入門

之前自己對於numpy和pandas是要用的時候東學一點西一點,直到看到《利用Python進行資料分析·第2版》,覺得只看這一篇就夠了。非常感謝原博主的翻譯和分享。 pandas是本書後續內容的首選庫。它含有使資料清洗和分析工作變得更快更簡單的資料結構和操作工具。pandas經常和其它工

4個實用的服務測試策略

微服務架構並不是一種新的架構模式,但它的不斷髮展為那些尋求企業級私有云解決方案的公司,帶來了諸多好處,將大型一體化架構應用拆分為可組合的微服務,賦予企業獨立擴充套件和維護每個元件的能力以及DevOps能力。 當然,微服務架構的分散式和獨立性也帶了許多挑戰,而本文講談

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

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

初入資料分析2(《利用Python進行資料分析·第2版》筆記)

初入資料分析2 遍歷 seq=[(1,2,3),(4,5,6),(7,8,9)] for a,b,c in seq: print("a==",a,"b==",b,"c==",c) a== 1 b== 2 c== 3 a== 4 b== 5 c== 6 a==

在Kubernetes上進行服務部署

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

利用Java上手服務架構

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

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

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

利用Python進行資料分析——筆記2

用純Python程式碼對時區進行計數 (注:原來使用pylab輸入程式碼,不太方便,就換成了Pycharm編輯器) 假設我們想要知道該資料集中最常出現的是哪個時區(即tz欄位),得到答案的辦法有很多。 import json path ='G:/python/pydata-

利用Python進行資料分析·第2版》第7章 資料清洗和準備

在資料分析和建模的過程中,相當多的時間要用在資料準備上:載入、清理、轉換以及重塑。這些工作會佔到分析師時間的 80% 或更多。有時,儲存在檔案和資料庫中的資料的格式不適合某個特定的任務。許多研究者都選擇使用通用程式語言(如 Python、Perl、R 或 Java)或 UNI