美團面試:微服務如何拆分?原則是什麼?

文章很長,且持續更新,建議收藏起來,慢慢讀!瘋狂創客圈總目錄 博客園版 爲您奉上珍貴的學習資源 :

免費贈送 :《尼恩Java面試寶典》 持續更新+ 史上最全 + 面試必備 2000頁+ 面試必備 + 大廠必備 +漲薪必備
免費贈送 :《尼恩技術聖經+高併發系列PDF》 ,幫你 實現技術自由,完成職業升級, 薪酬猛漲!加尼恩免費領
免費贈送 經典圖書:《Java高併發核心編程(卷1)加強版》 面試必備 + 大廠必備 +漲薪必備 加尼恩免費領
免費贈送 經典圖書:《Java高併發核心編程(卷2)加強版》 面試必備 + 大廠必備 +漲薪必備 加尼恩免費領
免費贈送 經典圖書:《Java高併發核心編程(卷3)加強版》 面試必備 + 大廠必備 +漲薪必備 加尼恩免費領

免費贈送 資源寶庫: Java 必備 百度網盤資源大合集 價值>10000元 加尼恩領取


美團面試:微服務如何拆分?原則是什麼?

尼恩說在前面

在40歲老架構師 尼恩的讀者交流羣(50+)中,最近有小夥伴拿到了一線互聯網企業如美團、字節、如阿里、滴滴、極兔、有贊、希音、百度、網易的面試資格,遇到很多很重要的面試題:

微服務如何拆分?

微服務拆分的規範和原則是什麼?

談談你的DDD落地經驗?

談談你對DDD的理解?

最近有小夥伴在美團,又遇到了相關的面試題。小夥伴懵了, 當然,面試也就掛了

這裏尼恩給大家做一下系統化、體系化的 DDD、微服務拆分的 梳理,使得大家可以充分展示一下大家雄厚的 “技術肌肉”,讓面試官愛到 “不能自已、口水直流”

也一併把這個題目以及參考答案,收入咱們的 《尼恩Java面試寶典PDF》V128版本,供後面的小夥伴參考,提升大家的 3高 架構、設計、開發水平。

最新《尼恩 架構筆記》《尼恩高併發三部曲》《尼恩Java面試寶典》的PDF,請關注本公衆號【技術自由圈】獲取,後臺回覆:領電子書

除了本文,尼恩輸出了一個 《從0到1,帶大家精通DDD》系列,幫助大家徹底掌握DDD,鏈接地址是:

阿里DDD大佬:從0到1,帶大家精通DDD

阿里大佬:DDD 落地兩大步驟,以及Repository核心模式

阿里大佬:DDD 領域層,該如何設計?

極兔面試:微服務爆炸,如何解決?Uber 是怎麼解決2200個微服務爆炸的?

阿里大佬:DDD中Interface層、Application層的設計規範

字節面試:請說一下DDD的流程,用電商系統爲場景

DDD如何落地:去哪兒的DDD架構實操之路

DDD落地:從騰訊視頻DDD重構之路,看DDD極大價值

DDD落地:從美團抽獎平臺,看DDD在大廠如何落地?

大家可以先看前面的文章,再來看本篇,效果更佳。

另外,尼恩會結合一個工業級的DDD實操項目,在第34章視頻《DDD的頂奢面經》中,給大家徹底介紹一下DDD的實操、COLA 框架、DDD的面試題。

本文目錄

微服務設計的規範和原則

單體架構往往以煙筒式方式發展,往往存在兩個主要問題:中心化高耦合

所謂中心化,就是數據集中存儲在單個數據庫中,業務系統集中部署在單臺服務器上,通過集羣部署方式提供服務能力,然而中心化的問題,也就是單點問題。

所謂高耦合,主要是指其中一個功能模塊升級,其它的模塊都得一起升級。模塊依賴度高的本質是架構腐爛。因爲本來架構可能就沒有設計好,但是,在實際場景中,隨着快速迭代開發,研發換了一波又一波,產品走了一茬又一茬,難免系統架構腐化嚴重。

如何解決單體架構的問題呢? 方案很多,主要有: SOA、微服務架構。

SOA(Service-Oriented Architecture,面向服務的架構)是一種高層級的架構設計理念,可通過在網絡上使用基於通用通信語言的服務接口,讓軟件組件可重複使用。SOA 集成了獨立部署和維護的服務,並允許它們相互通信和協同工作,以構建一個跨不同系統的軟件應用。

微服務(Microservices)是一種軟件架構風格,它是以專注於單一責任與功能的小型功能區塊 (Small Building Blocks) 爲基礎,利用模塊化的方式組合出複雜的大型應用程序,各功能區塊使用與語言無關 (Language-Independent/Language agnostic)的API集相互通信。

2014年,Martin Fowler 與 James Lewis 共同提出了微服務的概念,定義了微服務是由以單一應用程序構成的小服務,自己擁有自己的進程與輕量化處理,服務依業務功能設計,以全自動的方式部署,與其他服務使用HTTP API通信。同時服務會使用最小的規模的集中管理 (例如 Docker) 能力,服務可以用不同的編程語言與數據庫等組件實現。

如何 做單體架構 到微服務架構的升級呢?

1.準備好微服務治理基礎設施

微服務首先需要有微服務基礎設施,沒有微服務基礎設施,實踐微服務就是一場災難。

注意:請點擊圖像以查看清晰的視圖!

2.單一責任原則(SRP)

SRP是微服務架構重要的原則。

每個微服務都應該負責一個單一的業務,並確保做好這個業務,這個業務粒度的大小取決於你對業務和架構綜合考慮。

SRP能夠確保微服務職責單一性、功能完整性拆分, 這樣,就便於維護、測試和部署。

注意:請點擊圖像以查看清晰的視圖!

3.松耦合原則

什麼事松耦合:松耦合是指每個微服務都應該是獨立的,並通過API與其他服務進行通信。

松耦合的優勢:可以降低 級聯故障 的風險,也可以提高服務可擴展性,提高微服務的可複用性。

儘量做徹底解耦,包含數據庫層的解耦:

  • 數據庫層的解耦,就是避免一個微服務與其他微服務共享數據庫,因爲這可能會導致數據不一致,並且會使故障排查變得非常困難。
  • 每個微服務也都應該只管理自己的數據,每個微服務都有自己的數據庫來存儲數據,以確保可擴展性和可靠性。

在設計微服務時,應該專注於創建小型、鬆散耦合和高度內聚的服務。

注意:請點擊圖像以查看清晰的視圖!

4.領域驅動原則,不數據驅動原則,也不是界面驅動原則

DDD是一種軟件設計方法,它專注於特定業務領域的軟件設計。

微服務架構、微服務設計非常適合採用DDD,爲啥呢?

因爲每個服務都可以設計爲特定業務領域的具體實現。

注意:請點擊圖像以查看清晰的視圖!

領域驅動設計,首先應建立領域模型,確定領域限界上下文,然後才進行微服務拆分,

如果是 數據驅動原則/界面驅動原則 ,那麼,是一上來就定義數據庫表結構,就去調整領域邏輯代碼。

領域模型和領域服務應具有高度通用性、穩定性,通過接口層和應用層屏蔽外部變化對業務邏輯的影響,保證核心業務功能的穩定性。

基於領域模型進行拆分,圍繞業務領域按職責單一性、功能完整性拆分。

5.架構分層職責明確,嚴守調用規範,規避 “微服務小泥球”

老的單體架構, 常常被成爲大泥球。

“大泥球”單體,主要的問題

  • 代碼腐化:業務代碼經過長時間的迭代,有很多重複代碼。比如一個功能可能有 3,4 種實現。
  • 業務邏輯交織:業務應用經過長時間發展,功能變多,業務功能裏的邏輯代碼可能相互引用,交織不清。
  • 代碼複雜:功能多,業務邏輯複雜,只有少數員工能理解。這也是代碼腐化一種。
  • 維護性變差:修改 bug 或增加新功能時,牽一髮而動全身。一個 bug 沒修好可能導致整個軟件不可用。
  • 擴展性變差:增加新功能時,牽一髮而動全身。
  • 編譯發佈變長:軟件代碼量大,編譯時長變長,導致發佈時長也變長。

化解“大泥球”單體的措施,是微服務架構。微服務架構最基本的一個點:分而治之,由大化小。

  • 松耦合:劃分爲一個一個小的微服務,代碼之間邏輯交織降低。
  • 獨立部署:每個劃分的微服務都是一個獨立的項目,可以獨立部署。
  • 編譯發佈改善:劃分爲獨立的小項目,編譯時長變短,發佈時長相應變短。
  • 故障隔離:由於劃分爲一個一個微服務,故障僅發生在獨立的微服內。
  • 可擴展性:每個服務可以獨立橫向擴展,也可以從應用程序中提出獨立功能變成服務,擴展變強。
  • 職責單一團隊:每個小的微服務都由一個小型的高度專注的團隊負責。
  • 技術異構:每個團隊可以選擇適合該業務的技術。

微服務架構目的就是把一個大單體劃分爲各種微服務,松耦合,獨立自治。

微服務架構把一個大泥球,變成了很多個小而美的顆粒。

每個小顆粒職責單一,邊界明確,可以通過簡單組裝完成大的功能,自然就比之前的大泥球好處理得多

但是,迭代過程中,出現了一種奇怪現象,微服務內部沒有進行內部的模塊劃分,代碼耦合嚴重,調用關係混亂,就像一個小泥球。

在騰訊視頻的DDD重構案例中,在老的微服務架構中,存在分層不明確,下層服務過於理解業務邏輯,存在下層調用上層的問題,出現了代碼耦合嚴重,調用關係混亂的 “微服務小泥球”。

具體請參考《DDD落地:從騰訊視頻DDD重構之路,看DDD極大價值

在騰訊視頻的DDD重構的過程中,明確架構分層,降低模塊間不必要的耦合;

嚴格遵守分層架構原則,上層服務可調用下層服務,下層服務不涉及業務邏輯。如上下層服務需交互,可通過邏輯解耦方式實現,如消息隊列或中轉。

如果規避 “微服務小泥球”? 各層職能定位清晰,只能上層調用下層,也就是說只能從外層調用內層服務,下層服務通過封裝、組合或編排對上層暴露,服務粒度由細到粗。

微服中,各層職能定位清晰:

  • 基礎層爲各層提供資源服務

  • 領域層負責領域業務邏輯的實現

  • 應用層負責服務的編排和組合

  • 接口層對外進行服務暴露

注意:請點擊圖像以查看清晰的視圖!

6.進行全方位的監控、記錄

監控和日誌記錄對於微服務架構的安全、維護和調優都至關重要。

在擁有數百個微服務的項目中開發的主要困難之一是調試非常困難,因爲服務分散、日誌分散,很難找到失敗的原因。

因此,每個服務都應該有日誌記錄和監控措施,以跟蹤其性能並檢測錯誤。

注意:請點擊圖像以查看清晰的視圖!

7.通過CI/CD實現devops (開發運維一體化),提升工程效能

CI/CD是一種軟件開發運維過程實踐,打通開發和運維環節,實現應用程序的構建、測試和部署自動化。

任何微服務都應該是可持續部署的,實現微服務的快速高效部署,縮短了微服務上線時間。

注意:請點擊圖像以查看清晰的視圖!

總之,採用微服務架構開發有許多優勢,但要確保爲微服務系統成功實施就需要遵循一些設計原則。

包括但不限於上面介紹的幾個基礎原則,在此基礎上還需要有與所在領域或者行業的做定製化優化實踐。

8.基於業務需求變化頻率進行微服務拆分

這是一條擴展原則,是一條針對特定場景的的微服務拆分原則。

分離變和不變, 是 設計領域遵守的一條 核心的原則。

識別變動頻繁的業務需求和領域模型,考慮業務變更頻率與相關度,將業務需求變動較高和功能相對穩定的業務進行分離。

經常性變動必然會導致代碼的頻繁修改和版本發佈,分離變和不變,可以有效降低頻繁變動業務對穩態業務的影響。

9.基於吞吐量進行微服務拆分

這是一條擴展原則,是一條針對特定場景的的微服務拆分原則。

識別領域模型中性能壓力較大、高吞吐量的功能,並且進行解耦,解除獨立的微服務。

兩個好處:

  • 避免高吞吐服務,拖累整個系統的性能, 由於局部的性能拖累整體性能。
  • 解耦之後,可以對高吞吐量服務定製個性化的 擴容縮容策略、熔斷保護策略、限流策略。

10.基於技術異構因素進行微服務拆分

這是一條擴展原則,是一條針對特定場景的的微服務拆分原則。

領域模型中有些功能雖然在同一個業務域內,但在技術實現時可能會存在較大的差異,也就是說領域模型內部不同的功能存在技術異構的問題。

比如,在尼恩的go+java 雙語言云原生架構實操中, 有的可能用go,有的則是 Java,當然,還有的微服務用大數據架構。

所以,對於這些存在技術異構的功能,可以考慮按照技術邊界進行拆分。

參考文獻:

https://www.51cto.com/article/769421.html

https://blog.csdn.net/inaoen/article/details/121107764

https://www.jianshu.com/p/1c16195e9a1b

未完待續,尼恩說在最後

微服務拆分、DDD 面試題,是非常常見的面試題。

大家面試的時候, 可以參考以上的內容去組織答案,如果大家能做到對答如流,如數家珍,基本上 面試官會被你 震驚到、吸引到。

另外在面試之前,建議大家系統化的刷一波 5000頁《尼恩Java面試寶典PDF》,並且在刷題過程中,如果有啥問題,大家可以來 找 40歲老架構師尼恩交流。

最終,讓面試官愛到 “不能自已、口水直流”。offer, 也就來了。

當然,如果面試過程中,項目low,簡歷low,表達low,也可以找尼恩進行簡歷再造、項目再造,

再造之後,很容易獲得面試官的青睞。

然後,依靠降維攻擊, 實現快速 升級,快速上岸。

技術自由的實現路徑:

實現你的 架構自由:

喫透8圖1模板,人人可以做架構

10Wqps評論中臺,如何架構?B站是這麼做的!!!

阿里二面:千萬級、億級數據,如何性能優化? 教科書級 答案來了

峯值21WQps、億級DAU,小遊戲《羊了個羊》是怎麼架構的?

100億級訂單怎麼調度,來一個大廠的極品方案

2個大廠 100億級 超大流量 紅包 架構方案

… 更多架構文章,正在添加中

實現你的 響應式 自由:

響應式聖經:10W字,實現Spring響應式編程自由

這是老版本 《Flux、Mono、Reactor 實戰(史上最全)

實現你的 spring cloud 自由:

Spring cloud Alibaba 學習聖經》 PDF

分庫分表 Sharding-JDBC 底層原理、核心實戰(史上最全)

一文搞定:SpringBoot、SLF4j、Log4j、Logback、Netty之間混亂關係(史上最全)

實現你的 linux 自由:

Linux命令大全:2W多字,一次實現Linux自由

實現你的 網絡 自由:

TCP協議詳解 (史上最全)

網絡三張表:ARP表, MAC表, 路由表,實現你的網絡自由!!

實現你的 分佈式鎖 自由:

Redis分佈式鎖(圖解 - 秒懂 - 史上最全)

Zookeeper 分佈式鎖 - 圖解 - 秒懂

實現你的 王者組件 自由:

隊列之王: Disruptor 原理、架構、源碼 一文穿透

緩存之王:Caffeine 源碼、架構、原理(史上最全,10W字 超級長文)

緩存之王:Caffeine 的使用(史上最全)

Java Agent 探針、字節碼增強 ByteBuddy(史上最全)

實現你的 面試題 自由:

4800頁《尼恩Java面試寶典 》 40個專題

免費獲取11個技術聖經PDF:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章