1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        DDD興起的原因,以及與微服務(wù)的關(guān)系

        共 3542字,需瀏覽 8分鐘

         ·

        2021-07-27 19:01


        DDD為什么能火起來?


        我們先不討論DDD的定義,先梳理一下DDD火起來的背景,根據(jù)我學(xué)習的套路,永遠是為什么為先,再是解決什么問題,是什么東西,最后如何使用。我們都知道這些年隨著設(shè)備以及技術(shù)的發(fā)展,軟件架構(gòu)發(fā)生了很多變化,從最初的單機(BS/CS)架構(gòu)到后面的集中式架構(gòu),再到如今的微服務(wù)架構(gòu),現(xiàn)在基本可以說是微服務(wù)架構(gòu)盛行的時代,DDD早在2004年就由埃里克·埃文斯提出,但一直處于一個不慍不火的狀態(tài),直到Martin Fowler的《Microservices》引起大家注意,也就是微服務(wù)盛行之后(這兒需要說明的是,微服務(wù)最早的提出者不是Martin Fowler,而是Fred George),DDD再次回到人們視野中間,為什么呢?

        我們先看一下三種技術(shù)架構(gòu)的演進以及主要區(qū)別:


        第一階段是單機架構(gòu),特征是整個開發(fā)圍繞著數(shù)據(jù)庫進行設(shè)計和開發(fā)。

        第二個階段是三層式的集中式架構(gòu),采用面向?qū)ο蟮脑O(shè)計方法,業(yè)務(wù)邏輯分業(yè)務(wù)層、邏輯層、數(shù)據(jù)訪問層,這種架構(gòu)很容易某一層或者幾層變得臃腫,擴展性較差,另外摩爾定律失效,單臺機器性能有限。

        第三層階段是微服務(wù)架構(gòu),在集中式架構(gòu)中,系統(tǒng)分析、設(shè)計和開發(fā)往往是獨立進行的,而且各個階段負責人可能不一樣,那么就涉及到交流信息丟失的問題,另外項目從分析到開發(fā)經(jīng)歷的流程很長,很容易最終開發(fā)設(shè)計與需求實現(xiàn)的不一樣,微服務(wù)主要就是解決第二階段的這些痛點,實現(xiàn)應(yīng)用之間的解耦,解決單體應(yīng)用擴展性的問題。


        微服務(wù)存在的問題


        進入微服務(wù)之后,解決了集中式架構(gòu)的單體應(yīng)用很多問題,但是新的問題應(yīng)運而生,微服務(wù)的粒度應(yīng)該多大?微服務(wù)如何設(shè)計呢?微服務(wù)如何拆分?微服務(wù)邊界在哪里?

        很長時間人們都沒有解決這一問題,就連Martin Fowler在提出微服務(wù)架構(gòu)的時候也沒有告訴我們這該如何拆分微服務(wù)。

        甚至在很長的時間里人們對微服務(wù)拆分產(chǎn)生了一些誤解,有人認為:“微服務(wù)很簡單,就是將之前的單體應(yīng)用拆分成多個部署包,或者將原來的單體應(yīng)用架構(gòu)替換為一套支持微服務(wù)的技術(shù)架構(gòu),就算是微服務(wù)了?!边€有人認為微服務(wù)應(yīng)該拆分得越小越好。

        鑒于上述情形,很多項目因為前期拆分過度,導(dǎo)致復(fù)雜度過高,導(dǎo)致后期難以運維甚至難以上線。

        可以得出一個結(jié)論:微服務(wù)拆分困境產(chǎn)生的根本原因就是不知道業(yè)務(wù)或者微服務(wù)的邊界到底在什么地方。換句話說,確定了業(yè)務(wù)邊界和應(yīng)用邊界,這個困境也就迎刃而解了。

        而DDD就是解決了這個確定業(yè)務(wù)邊界的問題,可見DDD并不是一種技術(shù)架構(gòu),而是一種劃分業(yè)務(wù)領(lǐng)域范圍的方法論。DDD的興起是由于很多熟悉領(lǐng)域驅(qū)動建模(DDD)的工程師在進行微服務(wù)設(shè)計時,發(fā)現(xiàn)用DDD的思路進行業(yè)務(wù)梳理可以很好規(guī)劃服務(wù)邊界,可以很好實現(xiàn)微服務(wù)內(nèi)部和外部的“高內(nèi)聚、低耦合”。于是越來越多的人將DDD作為業(yè)務(wù)劃分的指導(dǎo)思想。

        那么,什么是DDD呢?


        DDD概述


        通過上文的學(xué)習就可以知道DDD是一種拆解業(yè)務(wù)、劃分業(yè)務(wù)、確定業(yè)務(wù)邊界的方法,是一種高度復(fù)雜的領(lǐng)域設(shè)計思想,將我們的問題拆分成一個個的域,試圖分離技術(shù)實現(xiàn)的復(fù)雜性,主要解決的是軟件難以理解難以演進的問題,DDD不是一種架構(gòu),而是一種架構(gòu)方法論,目的就是將復(fù)雜問題領(lǐng)域簡單化,幫助我們設(shè)計出清晰的領(lǐng)域和邊界,可以很好的實現(xiàn)技術(shù)架構(gòu)的演進。DDD包括兩部分,戰(zhàn)略設(shè)計部分和戰(zhàn)術(shù)設(shè)計部分。

        戰(zhàn)略設(shè)計主要從業(yè)務(wù)視角出發(fā),建立業(yè)務(wù)領(lǐng)域模型,劃分領(lǐng)域邊界,建立通用語言的限界上下文,限界上下文可以作為微服務(wù)設(shè)計的參考邊界。

        戰(zhàn)術(shù)設(shè)計則從技術(shù)視角出發(fā),側(cè)重于領(lǐng)域模型的技術(shù)實現(xiàn),完成軟件開發(fā)和落地,包括:聚合根、實體、值對象、領(lǐng)域服務(wù)、應(yīng)用服務(wù)和資源庫等代碼邏輯的設(shè)計和實現(xiàn)。

        DDD戰(zhàn)略設(shè)計會建立領(lǐng)域模型,這四個字放一起會讓人覺得很高深,其實是紙老虎,通俗來說就是模擬某個領(lǐng)域的的一種模型,這個模型比較抽象,但便于人們交流,舉個例子:公園有一棵桃樹,如果我們想好好研究桃樹該怎么研究?

        桃子好吃嗎?貴不貴?品種?怎么種植?種在什么地方?做成桃木劍?桃子樹葉藥用價值?

        你看,這樣研究每一個問題都很有道理,但是又很混亂,再回憶一下初中生物書上是這么研究的?

        先將植物根據(jù)大家的理解分成多個器官組成,像桃子、桃葉、桃花等等,然后將每一個器官再根據(jù)功能細分成組織,再根據(jù)這個組織中各個細胞的形態(tài)等作用分成不同的細胞,你看看這是不是一種很有條理的分析方法。


        DDD也是如此,當我們面對桃樹這種復(fù)雜的業(yè)務(wù)的時候,先根據(jù)固有的認識分成多個器官(領(lǐng)域),然后再在每一個領(lǐng)域中根據(jù)某些維度(這兒是功能)分為多個組織(聚合),而每一個組織中由很多細胞(實體)組成,這就是一種戰(zhàn)略,有哪些好處呢?可以確保我們討論的邊界,也就是討論的東西是一個領(lǐng)域一個維度的,對于桃樹來說,桃子、桃花、桃葉、樹干都是不同的領(lǐng)域,劃分不同領(lǐng)域的就是邊界,我們這兒叫領(lǐng)域邊界,當我們確定好這些領(lǐng)域之后,就可以確保我們討論的是同一個領(lǐng)域部分的東西,這樣的好處就是我們可以規(guī)定好一些概念,或者說術(shù)語,以后大家討論的時候就盡可能少的信息丟失。

        DDD戰(zhàn)略設(shè)計會建立領(lǐng)域模型,領(lǐng)域模型用來指導(dǎo)微服務(wù)的設(shè)計和拆分,DDD第一步要做的就是來一個頭腦風暴,可以理解成一起討論對業(yè)務(wù)的理解,主要目的就是盡可能前面不遺漏的分解我們的業(yè)務(wù)領(lǐng)域,就好比剛剛的桃樹,最先要做的就是盡可能多的分析,確保每一個領(lǐng)域都可以被關(guān)注到,在實踐中,往往會采用用例分析、場景分析和用戶旅程分析,這是一個發(fā)散的過程,頭腦風暴階段會產(chǎn)生很多實體、命令、事件等領(lǐng)域?qū)ο?,我們從不同的維度對進行聚類形成聚合、限界上下文等邊界,建立領(lǐng)域模型,這是一個收斂的過程。


        具體來說,我們可以通過三步來確定領(lǐng)域模型和微服務(wù)邊界。

        第一步:在事件風暴中梳理業(yè)務(wù)過程中的用戶操作、事件以及外部依賴關(guān)系等,根據(jù)這些要素梳理出領(lǐng)域?qū)嶓w等領(lǐng)域?qū)ο蟆?/section>

        第二步:根據(jù)領(lǐng)域?qū)嶓w之間的業(yè)務(wù)關(guān)聯(lián)性,將業(yè)務(wù)緊密相關(guān)的實體進行組合形成聚合,同時確定聚合中的聚合根、值對象和實體。在這個圖里,聚合之間的邊界是第一層邊界,它們在同一個微服務(wù)實例中運行,這個邊界是邏輯邊界,所以用虛線表示。

        第三步:根據(jù)業(yè)務(wù)及語義邊界等因素,將一個或者多個聚合劃定在一個限界上下文內(nèi),形成領(lǐng)域模型。在這個圖里,限界上下文之間的邊界是第二層邊界,這一層邊界可能就是未來微服務(wù)的邊界,不同限界上下文內(nèi)的領(lǐng)域邏輯被隔離在不同的微服務(wù)實例中運行,物理上相互隔離,所以是物理邊界,邊界之間用實線來表示。

        上面除了領(lǐng)域、聚合、實體外還出現(xiàn)了聚合根、值對象等詞語,除此之外還有統(tǒng)一建模語言、子域、核心域、通用域、支撐域等,其實都是紙老虎,前面說過了為了方便對于某個領(lǐng)域的討論往往會形成一些概念,這些概念會有一些名詞概括,上面的名詞就是這么來的,這就叫統(tǒng)一建模語言,哈哈哈,好了,不扯淡,我后面的文章會解釋下這些詞語的意思,這兒主要討論DDD解決什么了問題。

        梳理一下DDD與微服務(wù)的關(guān)系,DDD是一種架構(gòu)設(shè)計方法,微服務(wù)是一種架構(gòu)風格,兩者從本質(zhì)上都是為了追求高響應(yīng)力,而從業(yè)務(wù)視角去分離應(yīng)用系統(tǒng)建設(shè)復(fù)雜度的手段。兩者都強調(diào)從業(yè)務(wù)出發(fā),其核心要義是強調(diào)根據(jù)業(yè)務(wù)發(fā)展,合理劃分領(lǐng)域邊界,持續(xù)調(diào)整現(xiàn)有架構(gòu),優(yōu)化現(xiàn)有代碼,以保持架構(gòu)和代碼的生命力,也就是我們常說的演進式架構(gòu)。DDD主要關(guān)注:從業(yè)務(wù)領(lǐng)域視角劃分領(lǐng)域邊界,構(gòu)建通用語言進行高效溝通,通過業(yè)務(wù)抽象,建立領(lǐng)域模型,維持業(yè)務(wù)和代碼的邏輯一致性。

        注:運行時的進程間通信、容錯和故障隔離,實現(xiàn)去中心化數(shù)據(jù)管理和去中心化服務(wù)治理,關(guān)注微服務(wù)的獨立開發(fā)、測試、構(gòu)建和部署。


        總結(jié)


        這篇文章主要研討了DDD火起來的原因,解決了什么業(yè)界難題,知道DDD主要思路,以及DDD大概的實現(xiàn)步驟等。

        留個小問題:單體應(yīng)用適合DDD嗎?

        原文鏈接:https://www.cnblogs.com/Courage129/p/14839544.html



        —————END—————



        推薦閱讀

        干貨|如何步入Service Mesh微服務(wù)架構(gòu)時代

        實戰(zhàn)|Service Mesh微服務(wù)架構(gòu)實現(xiàn)服務(wù)間gRPC通信

        再見Nacos,我要玩Service Mesh了!

        玩轉(zhuǎn)Service Mesh微服務(wù)熔斷、限流騷操作

        Kubernetes微服務(wù)自動化發(fā)布系統(tǒng)

        Kubernetes微服務(wù)監(jiān)控體系

        Kubernetes集群搭建超詳細總結(jié)(CentOS版)

        Kubernetes學(xué)習環(huán)境難搭建?Mac筆記本上安裝一個!

        瀏覽 53
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            天天艹| 一级黄色大片一 | 亚洲欧美久久久 | bdsm乳铐bdsm折磨bdsm | a一级黄色 | 抽插骚逼| 国产午睡沙发乱子伦 | 黄色AV一级片 | heyzo精品少妇 | 他扯开我的奶罩一摸就流水 |