如何定義系統(tǒng)的微服務(wù)架構(gòu)谦纱?

微服務(wù)基本特性

如何去定義微服務(wù)架構(gòu)呢沉颂?首先從MartinFowler微服務(wù)這篇博客中就能看出一些端倪个初。MartinFowler將微服務(wù)的特性總結(jié)為9條沈堡。

  • “組件化”與“多服務(wù)”
  • 圍繞“業(yè)務(wù)功能”組織團隊
  • “做產(chǎn)品”而不是“做項目”
  • “智能端點”與“傻瓜管道”
  • “去中心化”地治理技術(shù)
  • “去中心化”地管理數(shù)據(jù)
  • “基礎(chǔ)設(shè)施”自動化
  • “容錯”設(shè)計
  • “演進式”設(shè)計

簡單來解釋下每個特性所表達的含義, 詳細可閱讀原文浪听。
“組件化”與“多服務(wù)”主要是對于組件以及服務(wù)做了定義螟碎,簡單可理解為組件例如一個libraries,能被鏈接到一段程序馋辈。服務(wù)的定義為需要通過web請求或遠程調(diào)用來進行通信。

圍繞“業(yè)務(wù)功能”組織團隊倍谜,想要表現(xiàn)的特性源于公司在做大型系統(tǒng)的架構(gòu)時候往往會聚焦在技術(shù)層面上迈螟,比如有專門的網(wǎng)關(guān)開發(fā)、業(yè)務(wù)開發(fā)尔崔、數(shù)據(jù)庫運維等等(本司也是)答毫。但是根據(jù)康威定律的指導(dǎo)原則

任何設(shè)計(廣義上的)系統(tǒng)的組織,都會產(chǎn)生這樣一個設(shè)計季春,即該設(shè)計的結(jié)構(gòu)與該組織的溝通結(jié)構(gòu)相一致洗搂。——梅爾文?康威(Melvyn Conway), 1967年

微服務(wù)使用不同的方法來分解系統(tǒng),即根據(jù)業(yè)務(wù)功能(business capability)來將系統(tǒng)分解為若干服務(wù)耘拇。這些服務(wù)針對該業(yè)務(wù)領(lǐng)域提供多層次撵颊、廣泛的軟件實現(xiàn),包括用戶界面惫叛、持久性存儲以及任何對外的協(xié)作性操作倡勇。因此,團隊是跨職能的嘉涌。

“做產(chǎn)品”而不是“做項目”主要是源自亞馬遜的“誰構(gòu)建妻熊,誰運行”的理念,開發(fā)工作也可以遵循上述“產(chǎn)品”理念仑最。

“智能端點”與“傻瓜管道”扔役,主要是體現(xiàn)微服務(wù)使用一些簡單的REST風(fēng)格的協(xié)議,而不使用服務(wù)的協(xié)議編排通信警医。

“去中心化”地治理技術(shù)“去中心化”地管理數(shù)據(jù) 顧名思義想要表明微服務(wù)的特性是服務(wù)是單獨存在亿胸,單獨建模的。對于該特性在業(yè)務(wù)落地建模時候法严,常常使用DDD去實現(xiàn)损敷,關(guān)于DDD的學(xué)習(xí),我非常推薦徐昊老師的《如何落地業(yè)務(wù)建纳钇。》課程拗馒。

“基礎(chǔ)設(shè)施”自動化的想要表達的理念也非常明顯,需要構(gòu)建自動化的CI/CD pipeline溯街,常常需要我們建立完善的DevOps體系诱桂。

- “容錯”設(shè)計“演進式”設(shè)計 主要是表明微服務(wù)的設(shè)計要需要有技術(shù)手段來保證當(dāng)其中一個服務(wù)故障時候,通過如重試呈昔、降級等技術(shù)實現(xiàn)容錯挥等,另外整個業(yè)務(wù)的迭代在范圍內(nèi)要可控變化,實現(xiàn)演進堤尾。

微服務(wù)定義架構(gòu)

本文將限定于定義架構(gòu)肝劲,而非技術(shù)實現(xiàn),也就是說本文內(nèi)容是講解一種定義問題的方法郭宝,而非解決問題的方法辞槐。從微服務(wù)落地的現(xiàn)狀來看,往往在對架構(gòu)的定義和業(yè)務(wù)的分解上就出現(xiàn)了偏差粘室,在之后的技術(shù)實現(xiàn)上榄檬,用上了分布式技術(shù)的屠龍之術(shù),如鏈路追蹤衔统、限流鹿榜、熔斷等海雪,反倒導(dǎo)致了整個開發(fā)流程和維護流程熵值急劇升高。

在上節(jié)簡單介紹了微服務(wù)的基本特性舱殿,從以上的特性我們能看出來奥裸,我們要定義一個系統(tǒng)的微服務(wù)架構(gòu),關(guān)鍵有兩點怀薛,即

  • 定義微服務(wù)的方式圍繞業(yè)務(wù)概念而非技術(shù)概念
  • 服務(wù)的業(yè)務(wù)拆分有詳細的限界來保證變化可控

這里我們需要引入DDD來解決這兩個問題刺彩。通過子域進行分解;通過每個領(lǐng)域單獨的領(lǐng)域模型來消除依賴項枝恋。也就是上帝類创倔。通常來講DDD的建模沒有一個標(biāo)準(zhǔn)化的流程可以遵循,我們只能介紹一個大概的方法焚碌。以下我們將通過三個步驟畦攘,領(lǐng)域建模 -> 服務(wù)拆分 -> 定義服務(wù)API 來定義一個微服務(wù)項目的架構(gòu)流程。

領(lǐng)域建模

進行領(lǐng)域建模需要三個步驟:

  • 確定領(lǐng)域事件
  • 定義聚合
  • 定義限界上下文

這里我們簡單用一段用戶故事來做整個流程串聯(lián)

我打算做一個外賣平臺叫“餓了團”十电,主要的功能有知押,用戶從我的平臺下單,然后我平臺接單之后鹃骂,分配給餐館商家台盯,商家接單進行制作,然后再由平臺分配騎手去進行配送給用戶畏线。騎手的位置會實時更新静盅,用戶可用通過平臺查詢到騎手的位置。

確定領(lǐng)域事件

在項目開始的起點寝殴,我們先需要根據(jù)用戶故事用戶場景來識別和定義項目的基本操作蒿叠。
定義系統(tǒng)的操作主要是根據(jù)用戶故事中的動詞,我們也可以用事件風(fēng)暴(Event Storming)來定義領(lǐng)域驅(qū)動模型蚣常。

事件風(fēng)暴

從上述的簡單用戶故事中市咽,我們能得到收斂出一些領(lǐng)域事件:用戶、商家抵蚊、訂單施绎、外賣配送、騎手位置贞绳。
好了谷醉, 同時我們也能總結(jié)出一些系統(tǒng)操作:下單、接單熔酷、更新騎手的位置孤紧、騎手已取餐豺裆、騎手正在配送拒秘、騎手配送完成号显。

定義聚合

接下來我們就需要根據(jù)這些領(lǐng)域事件找出聚合根,然后為每個聚合根關(guān)聯(lián)這些重要的系統(tǒng)操作躺酒。
確定聚合根押蚤,具體來講是屬于業(yè)務(wù)的一種sence,在復(fù)雜的業(yè)務(wù)場景中有不同的定義方式羹应,這里我們給出一種聚合根的定義揽碘,即把 商家、用戶园匹、騎手作為聚合根雳刺。

聚合根 系統(tǒng)操作 依賴的實體
用戶 創(chuàng)建訂單、查詢訂單 訂單
商家 接受訂單裸违、準(zhǔn)備訂單掖桦、查詢訂單 訂單
騎手 更新位置、取餐供汛、配送枪汪、接受配送訂單 外賣配送 、位置怔昨、訂單

我們可以看到雀久,創(chuàng)建訂單操作被聚合用戶子域,接受訂單被聚合到了商家子域趁舀,但是考慮到訂單的查詢赖捌、以及訂單的狀態(tài)更新記錄等操作,如果聚合到上述的三個聚合根中明顯是不恰當(dāng)?shù)暮毡啵赃@里我們增加訂單子域來承擔(dān)訂單的查詢與狀態(tài)更新這些操作巡蘸。


外賣DDD建模

定義限界上下文

可以看到,我們把訂單所承擔(dān)的功能都拆分為“多個”訂單實體擂送,放在不同的子域內(nèi)悦荒。所以這里的限界上下文對應(yīng)每個子域,通常而言嘹吨,限界上下文對應(yīng)為一個或者一組服務(wù)搬味。一個子域?qū)?yīng)為每一個服務(wù)。

服務(wù)拆分

對于服務(wù)的拆分我們很難給出標(biāo)準(zhǔn)性的答案蟀拷,這里可以給出一些指導(dǎo)原則碰纬。來源于Bob Martin的《面向?qū)ο笤O(shè)計的原則》 中的其中兩項。其余九個原則问芬,在設(shè)計類和包時非常有用悦析。

指導(dǎo)原則

  • 單一職責(zé)原則

改變一個類只改有一個理由。

我們設(shè)計微服務(wù)架構(gòu)的時候也應(yīng)該遵循SRP原則此衅,設(shè)計小的强戴、內(nèi)聚的亭螟、僅包含一個職責(zé)的服務(wù)。

  • 閉包原則

在包中包含的所有類應(yīng)該是對同類的變化的一個集合骑歹,也就是說预烙,對包做出的修改,需要調(diào)整的類都應(yīng)該在這個包內(nèi)道媚。

這個原則的目標(biāo)是扁掸,當(dāng)業(yè)務(wù)規(guī)則發(fā)生變化時候,開發(fā)者只需要對一個交付包做修改最域,而不是大規(guī)模的修改谴分。這樣可以極大的改善應(yīng)用程序的可維護性。

根據(jù)我們之上建模的例子镀脂,服務(wù)很容易拆分為四項

拆分服務(wù) 對應(yīng)子域
Consumer Service 用戶子域
Order Service 訂單子域
Restaurant Service 商家子域
Delivery Service 送餐子域

定義服務(wù)API

在這一步需要定義服務(wù)協(xié)作所需要的API狸剃,我們需要考慮到服務(wù)的前置條件和后置條件是否成立,比如
Consumer Service中我們需要驗證用戶的信息狗热,確認其是否支付即獲取付款信息钞馁。Restaurant Service中,需要驗證送貨地址和時間是否在餐廳的服務(wù)區(qū)域內(nèi)匿刮。所以我們部分API的定義如下所示:

服務(wù) API
Consumer Service verifyConsumerDetails()
Order Service findOrderDetailByConsumerId()
Restaurant Service verifyOrderDetails()僧凰、acceptOrder()、noteOrderReadyForPickup()
Delivery Service scheduleDelivery()熟丸、 notifyCourier()训措、updateLocation()

這里只列出來很少一部分API的設(shè)計,更多的設(shè)計需要在真正的實踐中探索光羞。

總結(jié)

定義微服務(wù)架構(gòu)的整體內(nèi)容基本流程到這就介紹完畢了绩鸣,我通過舉了建立一個外賣平臺的示例,從領(lǐng)域建模 -> 服務(wù)拆分 -> 定義服務(wù)API來說明了微服務(wù)架構(gòu)將如何被定義纱兑,當(dāng)然我的示例中只是包含了非常有限的場景呀闻,如果要擴展開,其中可能還需要定義的有消費者的賬戶潜慎、餐廳的優(yōu)惠券捡多、餐館的關(guān)系、舉報投訴催單等等更加服務(wù)的業(yè)務(wù)關(guān)系铐炫±菔郑可以看到,這個過程是需要很強的業(yè)務(wù)sence倒信,勾勒出的架構(gòu)也是非常抽象的科贬。在微服務(wù)拆分階段,除了一些指導(dǎo)原則之外鳖悠,我們還會遇到很多難點榜掌。比如網(wǎng)絡(luò)延遲鸭丛、可用性、數(shù)據(jù)一致性等各類問題唐责,這時候就需要具體的分布式技術(shù)來解決這些問題。在后續(xù)的文章的瘾带,我將繼續(xù)展開鼠哥。

最后,關(guān)于微服務(wù)架構(gòu)看政,我還想說的是朴恳,架構(gòu)決定了軟件的各種非功能性因素,比如微服務(wù)架構(gòu)提高了可維護性允蚣、可測試性于颖、可部署性和可擴展性。但同樣嚷兔,在一些場景的性能方面有所妥協(xié)森渐。同時微服務(wù)架構(gòu)也增加了很多復(fù)雜性,比如在可觀測性冒晰、鏈路追蹤同衣、安全性等方面我們需要更多的第三方組件去協(xié)助解決。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末壶运,一起剝皮案震驚了整個濱河市耐齐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蒋情,老刑警劉巖埠况,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異棵癣,居然都是意外死亡辕翰,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門狈谊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來金蜀,“玉大人,你說我怎么就攤上這事的畴≡ǔ” “怎么了?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵丧裁,是天一觀的道長护桦。 經(jīng)常有香客問我,道長煎娇,這世上最難降的妖魔是什么二庵? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任贪染,我火速辦了婚禮,結(jié)果婚禮上催享,老公的妹妹穿的比我還像新娘杭隙。我一直安慰自己,他們只是感情好因妙,可當(dāng)我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布痰憎。 她就那樣靜靜地躺著,像睡著了一般攀涵。 火紅的嫁衣襯著肌膚如雪铣耘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天以故,我揣著相機與錄音蜗细,去河邊找鬼。 笑死怒详,一個胖子當(dāng)著我的面吹牛炉媒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播昆烁,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼橱野,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了善玫?” 一聲冷哼從身側(cè)響起水援,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎茅郎,沒想到半個月后蜗元,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡系冗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年奕扣,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掌敬。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡惯豆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出奔害,到底是詐尸還是另有隱情楷兽,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布华临,位于F島的核電站芯杀,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜揭厚,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一却特、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧筛圆,春花似錦裂明、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至粉寞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間左腔,已是汗流浹背唧垦。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留液样,地道東北人振亮。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像鞭莽,于是被迫代替她去往敵國和親坊秸。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容