文章很長,且持續更新,建議收藏起來,慢慢讀!瘋狂創客圈總目錄 博客園版 爲您奉上珍貴的學習資源 :
免費贈送 :《尼恩Java面試寶典》 持續更新+ 史上最全 + 面試必備 2000頁+ 面試必備 + 大廠必備 +漲薪必備
免費贈送 :《尼恩技術聖經+高併發系列PDF》 ,幫你 實現技術自由,完成職業升級, 薪酬猛漲!加尼恩免費領
免費贈送 經典圖書:《Java高併發核心編程(卷1)加強版》 面試必備 + 大廠必備 +漲薪必備 加尼恩免費領
免費贈送 經典圖書:《Java高併發核心編程(卷2)加強版》 面試必備 + 大廠必備 +漲薪必備 加尼恩免費領
免費贈送 經典圖書:《Java高併發核心編程(卷3)加強版》 面試必備 + 大廠必備 +漲薪必備 加尼恩免費領
免費贈送 資源寶庫: Java 必備 百度網盤資源大合集 價值>10000元 加尼恩領取
字節面試:微服務一定要DDD,爲什麼?TDD和DDD 有何關係?
尼恩說在前面
在40歲老架構師 尼恩的讀者交流羣(50+)中,最近有小夥伴拿到了一線互聯網企業如阿里、滴滴、極兔、有贊、希音、百度、網易、美團的面試資格,遇到很多很重要的面試題:
微服務一定要用DDD,爲什麼?
TDD也很流行,什麼是TDD? TDD和DDD 有何關係?
小夥伴沒有回答好,導致大廠機會沒了, 多麼可惜。
所以,這裏尼恩給大家做一下系統化、體系化的梳理,使得大家可以充分展示一下大家雄厚的 “技術肌肉”,讓面試官愛到 “不能自已、口水直流”。
也一併把這個題目以及參考答案,收入咱們的 《尼恩Java面試寶典PDF》V164版本,供後面的小夥伴參考,提升大家的 3高 架構、設計、開發水平。
《尼恩 架構筆記》《尼恩高併發三部曲》《尼恩Java面試寶典》的PDF,請到公號【技術自由圈】獲取
本文目錄
字節面試:微服務一定要用DDD,爲什麼?
首先,說說微服務設計和拆分的困境
微服務解決大單體架構的的很多問題,比如擴展性、彈性伸縮能力、小規模團隊的敏捷開發等等。
好是好,但是微服務實踐過程中,大部分架構師遇到很多難題:
-
微服務的粒度應該多大呀?
-
微服務到底應該如何拆分和設計呢?
-
微服務的邊界應該在哪裏?
拆分微服務的時候,兩種情況:
- 有的顆粒度過大, 還是大單體
- 有的顆粒度過小,導致上線和運維工作量巨大。
很多“水貨架構師”,在拆分微服務的時候憑藉感覺:簡單的把微服務理解爲小單體,粗暴的把原來一個大單體包拆分爲多個部署包,導致後期工程風險嚴重失控。從而陷入了微服務設計和拆分的困境。
其次,說說解決困境的兩個方面
微服務設計和拆分的困境,分成兩個方面:
- 理論面,缺乏一套系統的理論和方法指導。
- 落地面,缺乏一套可以參考的代碼骨架。
最後,說說DDD的理論指導價值和落地指導價值。
DDD 就是這種不可多得的微服務設計和拆分的理論和方法指導。
DDD 指導了兩個層面的設計和建模:
-
宏觀層面: 指導了微服務外部的建模,包括系統和系統之間, 微服務和微服務之間依賴關係的建模。
-
微觀層面:指導微服務內部的建模,包括 領域對象建模, 微服服務落地的各層關係的建模。
正因爲如此,DDD現在非常火爆,有其巨大生產價值、經濟價值的, 絕不僅僅是一套概念那麼簡單。
各個大廠的大致情況是:
- 新項目都儘可能結合DDD進行設計建模、工程落地
- 老項目也在使用DDD進行從點到面的改造,以榨取軟件的最佳性能。
下面是尼恩在網上梳理到的案例, 實際上這僅僅就是冰山一角:
《阿里大佬:DDD 落地兩大步驟,以及Repository核心模式》
《極兔面試:微服務爆炸,如何解決?Uber 是怎麼解決2200個微服務爆炸的?》
《阿里大佬:DDD中Interface層、Application層的設計規範》
《大廠癡迷DDD:從高德portal重構,看DDD的巨大價值》
字節面試:TDD也很流行,什麼是TDD?
測試驅動開發是一種開發方法,其核心理念是在編寫實際代碼之前先編寫測試用例。
這些測試用例描述了所期望的代碼行爲。
開發者根據這些測試用例來編寫代碼,以確保代碼通過所有測試並符合預期。
TDD的步驟通常是:
編寫測試用例 -> 運行測試(測試應該失敗) -> 編寫代碼 -> 再次運行測試(測試應該通過)。
常見的TDD框架包括JUnit(Java)、RSpec(Ruby)和unittest(Python)。
適合TDD這種模式的項目具備以下特點:
- 項目的需求必須足夠清晰,而且程序員對整個需求有足夠的瞭解。
- 項目的複雜度和依賴性要低。對於一個業務模型及其複雜、內部模塊之間的相互依賴性非常強的項目,採用TDD反而會得不嘗失,這會導致程序員在拆分接口和寫測試代碼的時候工作量非常大。另外,由於模塊之間的依賴性太強,我們在寫測試代碼的時候可能不採取一些橋接模式來實現,這樣勢必加大了程序員的工作量。
字節面試:TDD和DDD有何關係?
DDD如此之香,那麼多大廠對DDD如此癡迷, 背後 有深層次、根本性的原因
具體參見尼恩在《DDD學習聖經》爲大家深度總結的、下面的6點:
DDD 的一個根本能力,提升了 可測試性
DDD 爲 TDD 的落地,提供很好的 基礎支撐 和 前置條件。
在問題DDD的前置問題
面試官在問DDD之前,先會問下 微服務。
這裏把這些前置問題,也給大家簡歷梳理一下。
附1:說說,你對微服務是怎麼理解的?
微服務是由Martin Fowler大師提出的。微服務是一種架構風格,通過將大型的單體應用劃分爲比較小的服務單元,從而降低整個系統的複雜度。
微服務,是一種架構風格,它將應用構建爲一個小型自治服務的集合,。通俗地說,就像蜜蜂通過對蠟制的等邊六角形單元來構建它們的蜂巢。他們最初從使用各種材料的小單元開始,一點點的搭建出一個大型蜂巢。
微服務優點:
優勢 | 說明 |
---|---|
獨立開發 | 所有微服務都可以根據各自的功能輕鬆開發 |
獨立部署 | 根據他們所提供的服務,可以在任何應用中單獨部署 |
故障隔離 | 即使應用中的一個服務不起作用,系統仍然繼續運行 |
混合技術棧 | 可以用不同的語言和技術來構建同一應用程序的不同服務 |
粒度縮放 | 各個組件可根據需要進行擴展,無需將所有組件融合到一起 |
微服務缺點:
1、服務調用的複雜性提高了: 網絡問題、容錯問題、負載問題、高併發問題。
2、分佈式事務: 儘量不要使用微服務事務。
3、測試的難度提升了:
4、運維難度提升:單體架構只要維護一個環境,而到了微服務是很多個環境,並且運維方式還都不一樣。所以對部署、監控、告警等要求就會變得非常困難。
5、微服務拆分, 缺乏統一的標準,拆分不合理會導致後面 出現 內部混亂,從 "大泥球" 演變成 更多的 ”小泥球“
附2:說說,微服務架構中的DRY是什麼?
DRY(Don’t Repeat Yourself) , 代表:不要重複自己。
DRY促進了重用代碼/代碼複用。
這意味着在多個地方不要重複同樣的代碼,而應該將它們封裝爲庫或服務,以便在其他地方調用。
這種思想可以促進代碼的模塊化和可重用性,提高開發效率和質量。
所以,從微服務出發, 就演進出來了 技術中臺、數據中臺、業務中臺的架構
具體請參見尼恩 《DDD 學習聖經》
但是
DRY反過來導致緊耦合。
附3:說說,設計微服務的最佳實踐是什麼?
具體答案,請參見尼恩之前寫過的一個面試題答案:
注意其中的核心點:領域驅動原則,不數據驅動原則,也不是界面驅動原則
尼恩說在後面
DDD 面試題,是非常常見的面試題。大家面試的時候, 可以參考以上的內容去答,基本上 面試官會被你 震驚到、吸引到。
另外, 如果大家在實操DDD的過程中,遇到困難,也可以找尼恩求助:
- 尼恩結合一個工業級的DDD實操項目,在第34章視頻《DDD的學習聖經》中,從理論面、落地面一起,給大家做了徹底的介紹。
- 另外,在尼恩的一對一簡歷指導時,也指導DDD如何織入項目、應用到實操, 幫助大家徹底穿透DDD。
此題目收入了最新的尼恩面試寶典,在面試之前,建議大家系統化的刷一波 5000頁《尼恩Java面試寶典PDF》,並且在刷題過程中,如果有啥問題,大家可以來 找 40歲老架構師尼恩交流。
最終,讓面試官愛到 “不能自已、口水直流”。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(史上最全)》