文章很長,且持續更新,建議收藏起來,慢慢讀!瘋狂創客圈總目錄 博客園版 爲您奉上珍貴的學習資源 :
免費贈送 :《尼恩Java面試寶典》 持續更新+ 史上最全 + 面試必備 2000頁+ 面試必備 + 大廠必備 +漲薪必備
免費贈送 :《尼恩技術聖經+高併發系列PDF》 ,幫你 實現技術自由,完成職業升級, 薪酬猛漲!加尼恩免費領
免費贈送 經典圖書:《Java高併發核心編程(卷1)加強版》 面試必備 + 大廠必備 +漲薪必備 加尼恩免費領
免費贈送 經典圖書:《Java高併發核心編程(卷2)加強版》 面試必備 + 大廠必備 +漲薪必備 加尼恩免費領
免費贈送 經典圖書:《Java高併發核心編程(卷3)加強版》 面試必備 + 大廠必備 +漲薪必備 加尼恩免費領
免費贈送 資源寶庫: Java 必備 百度網盤資源大合集 價值>10000元 加尼恩領取
螞蟻面試:DDD外部接口調用,應該放在哪一層?
尼恩特別說明: 尼恩的文章,都會在 《技術自由圈》 公號 發佈, 並且維護最新版本。 如果發現圖片 不可見, 請去 《技術自由圈》 公號 查找
尼恩說在前面:
在40歲老架構師 尼恩的讀者交流羣(50+)中,最近有小夥伴拿到了一線互聯網企業如字節、阿里、滴滴、極兔、有贊、希音、百度、網易、美團的面試資格,遇到很多很重要的面試題:
DDD 的外部接口調用,應該放在哪一層?
DDD架構,如何落地?
談談你的DDD落地經驗?
談談你對DDD的理解?
如何保證RPC代碼不會腐爛,升級能力強?
微服務如何拆分?
微服務爆炸,如何解決?
你們的項目,DDD是怎麼落地實操的?
所以,這裏尼恩給大家做一下系統化、體系化的梳理,使得大家可以充分展示一下大家雄厚的 “技術肌肉”,讓面試官愛到 “不能自已、口水直流”。
也一併把這個題目以及參考答案,收入咱們的 《尼恩Java面試寶典PDF》V155版本,供後面的小夥伴參考,提升大家的 3高 架構、設計、開發水平。
除了本文,尼恩輸出了一個 《DDD學習聖經》系列,幫助大家徹底掌握DDD。
同時,尼恩持續輸出最新的《尼恩 架構筆記》《尼恩高併發三部曲》《尼恩Java面試寶典》的PDF,請關注本公衆號【技術自由圈】獲取,後臺回覆:領電子書
問題1:DDD的外部接口調用,應該放在哪一層?(螞蟻面試)
無論是RPC (如Feign),還是HTTPClient調用Rest API,具體的外部接口調用實現放在infrastructure 基礎設施層。
在領域驅動設計(DDD)中,基礎設施層負責處理與外部資源的交互,包括數據庫、文件系統、消息隊列、外部服務等。
來看看 cola的 DDD 架構, 具體如下圖
COLA(Clean Object-oriented Architecture)框架是一種基於領域驅動設計(DDD)和麪向對象設計原則的架構風格,旨在幫助開發人員構建清晰、可維護和可擴展的應用程序。
1)適配層(AdapterLayer):負責對前端展示(web,wireless,wap)的路由和適配,對於傳統B/S系統而言,adapter就相當於MVC中的controller;
2)應用層(ApplicationLayer):主要負責獲取輸入,組裝上下文,參數校驗,調用領域層做業務處理,如果需要的話,發送消息通知等。層次是開放的,應用層也可以繞過領域層,直接訪問基礎實施層;
3)領域層(Domain Layer):主要是封裝了核心業務邏輯,並通過領域服務(Domain Service)和領域對象(DomainEntity)的方法對App層提供業務實體和業務邏輯計算。領域是應用的核心,不依賴任何其他層次;
4)基礎實施層(InfrastructureLayer):主要負責技術細節問題的處理,比如數據庫的CRUD、搜索引擎、文件系統、分佈式服務的RPC等。此外,領域防腐的重任也落在這裏,外部依賴需要通過gateway的轉義處理或者代理處理,才能被上面的App層和Domain層使用。
gateway 代理的架構,也非常類似與適配器的架構。 gateway 代理架構分爲兩個部分:
-
gateway 接口處於 領域層,
-
gateway 的實現處於 基礎實施層(InfrastructureLayer)。
具體如下:
在COLA框架中,Gateway通常指的領域層的網關,是一種隔離在應用程序領域層內部和系統外部之間進行通信和交互的接口或者組件。COLA框架中的Gateway通常被用於以下幾個方面:
- 數據交互:Gateway可以用於在領域層和基礎設施層之間進行數據交互。例如,領域層的服務可以通過Gateway將數據傳遞給基礎設施層進行持久化,或者基礎設施層可以通過Gateway將數據加載到領域層中進行處理。
- 外部接口調用:Gateway也可以用於與外部系統進行通信。例如,Gateway可以封裝與外部服務的交互邏輯,使得領域層不直接依賴於外部服務的細節。
- 跨邊界通信:在複雜的應用程序中,可能存在多個邊界或子系統。Gateway可以用於在這些邊界之間進行通信,幫助將系統拆分爲更小的模塊並保持模塊之間的松耦合性。
總之,COLA框架中的Gateway扮演着連接不同層和組件之間的橋樑角色,有助於實現應用程序的模塊化、可維護和可擴展性。
問題2:什麼是聚合?
“聚合”即“高內聚,低耦合”中的“內聚”之意;
聚合是業務和邏輯緊密關聯的實體和值對象組合而成,聚合是數據修改和持久化的基本單元,一個聚合對應一個數據的持久化;
聚合在DDD分層架構中屬於領域層,領域層包含了多個聚合,共同實現核心業務邏輯,聚合內的實體以充血模型實現個體業務能力,以及業務邏輯的高內聚; 跨多個實體的業務邏輯通過領域服務來實現,跨多個聚合的業務邏輯通過應用服務來實現;
首先我們來看下聚合模式的定義:
將實體和值對象劃分爲聚合並圍繞着聚合定義邊界。
選擇一個實體作爲每個聚合的根,並僅允許外部對象持有對聚合根的引用。作爲一個整體來定義聚合的屬性和不變量,並把其執行責任賦予聚合根或指定的框架機制。
一個聚合包含一個聚合根(aggregation root)和一些相關的其他領域對象。
問題3:什麼是聚合根?
在《DDD學習聖經》中,我們講到了“什麼是聚合根”,這裏再重複一下。
聚合根中的“聚合”即“高內聚,低耦合”中的“內聚”之意;
而“根”則是“根部”的意思,也即聚合根是一種統領式的存在。
事實上,並不存在一個教科書式的對聚合根的理論定義,你可以將聚合根理解爲一個系統中最重要最顯著的那些名詞,這些名詞是其所在的軟件系統之所以存在的原因。
爲了給你一個直觀的理解,以下是幾個聚合根的例子:
- 在一個電商系統中,一個訂單(Order)對象表示一個聚合根
- 在一個CRM系統中,一個客戶(Customer)對象表示一個聚合根
- 在一個銀行系統中,一次交易(Transaction)對象表示一個聚合根
你可能會問,軟件中的概念已經很多了,爲什麼還要搞出個聚合根的概念?
我們認爲這裏至少有2點原因:
- 聚合根遵循了軟件中“高內聚,低耦合”的基本原則
- 聚合根體現了一種模塊化的原則,模塊化思想是被各個行業所證明的可以降低系統複雜度的一種思想。所謂的DDD是“軟件核心複雜性應對之道”,也即這個意思,它將軟件系統在人腦中所呈現地更加有序和簡單,讓人可以更好地理解和管控軟件系統。
在實際項目中識別聚合根時,我們需要對業務有深入的瞭解,因爲只有這樣你才知道到底哪些業務邏輯是內聚在一起的。
這也是我們一直建議程序員和架構師們不要一味地埋頭於技術而要多關注業務的原因。
事實上,如果讓一個從來沒有接觸過DDD的人來建模,十有八九也能設計出上面的訂單、客戶和交易對象出來。
沒錯,DDD絕非什麼顛覆式的發明,依然只是在前人基礎上的一種進步而已,這種進步更多的體現在一些設計原則上,對此我們將在下文進行詳細闡述。
問題4:聚合和MYSQL 表的對應關係是什麼 ?
技術自由圈,明天發佈此題答案
也可以參考 最新版 《尼恩Java面試寶典》 PDF
問題5:什麼是領域驅動設計(DDD)?
技術自由圈,明天發佈此題答案
也可以參考 最新版 《尼恩Java面試寶典》 PDF
問題6:DDD建模與微服務架構設計的關係?
技術自由圈,明天發佈此題答案
也可以參考 最新版 《尼恩Java面試寶典》 PDF
問題7:微服務一定要DDD,爲什麼?TDD和DDD 有何關係?
具體答案,請參見此文: https://mp.weixin.qq.com/s/80Gza3-9pO8bYlSJoEDVWg
問題8:DDD架構,如何落地?
具體答案,請參見此文: https://mp.weixin.qq.com/s/_NAHYDIvmT7EbffXkIpqYw
問題9:DDD 領域層,該如何設計?
具體答案,請參見此文:https://mp.weixin.qq.com/s/njBl791vFCd94UplPJEFKw
問題10:微服務如何拆分?原則是什麼?
具體答案,請參見此文: https://mp.weixin.qq.com/s/bExjRkVbDLTV2Wf9G6dzrg
問題11:給一個需求,請用DDD設計出來
具體答案,請參見此文: https://mp.weixin.qq.com/s/izzUXIpVmURq6hTCEN0ARQ
參考文獻
尼恩特別編著 《DDD學習聖經》
《阿里大佬:DDD 落地兩大步驟,以及Repository核心模式》
《極兔面試:微服務爆炸,如何解決?Uber 是怎麼解決2200個微服務爆炸的?》
《阿里大佬:DDD中Interface層、Application層的設計規範》
《大廠癡迷DDD:從高德portal重構,看DDD的巨大價值》
《大廠癡迷DDD:從高德portal重構,看DDD的巨大價值》
說在最後:有問題找老架構取經
DDD 相關的面試題,是非常常見的面試題。也是核心面試題。
以上的內容,如果大家能對答如流,如數家珍,基本上 面試官會被你 震驚到、吸引到。
最終,讓面試官愛到 “不能自已、口水直流”。offer, 也就來了。
在面試之前,建議大家系統化的刷一波 5000頁《尼恩Java面試寶典》V174,在刷題過程中,如果有啥問題,大家可以來 找 40歲老架構師尼恩交流。
另外,如果沒有面試機會,可以找尼恩來幫扶、領路。
- 大齡男的最佳出路是 架構+ 管理
- 大齡女的最佳出路是 DPM,
女程序員如何成爲DPM,請參見:
DPM (雙棲)陪跑,助力小白一步登天,升格 產品經理+研發經理
領跑模式,尼恩已經指導了大量的就業困難的小夥伴上岸。
前段時間,領跑一個40歲+就業困難小夥伴拿到了一個年薪100W的offer,小夥伴實現了 逆天改命 。
技術自由的實現路徑:
實現你的 架構自由:
《阿里二面:千萬級、億級數據,如何性能優化? 教科書級 答案來了》
《峯值21WQps、億級DAU,小遊戲《羊了個羊》是怎麼架構的?》
… 更多架構文章,正在添加中
實現你的 響應式 自由:
這是老版本 《Flux、Mono、Reactor 實戰(史上最全)》
實現你的 spring cloud 自由:
《Spring cloud Alibaba 學習聖經》 PDF
《分庫分表 Sharding-JDBC 底層原理、核心實戰(史上最全)》
《一文搞定:SpringBoot、SLF4j、Log4j、Logback、Netty之間混亂關係(史上最全)》
實現你的 linux 自由:
實現你的 網絡 自由:
《網絡三張表:ARP表, MAC表, 路由表,實現你的網絡自由!!》
實現你的 分佈式鎖 自由:
實現你的 王者組件 自由:
《隊列之王: Disruptor 原理、架構、源碼 一文穿透》
《緩存之王:Caffeine 源碼、架構、原理(史上最全,10W字 超級長文)》
《Java Agent 探針、字節碼增強 ByteBuddy(史上最全)》