微服務(wù)設(shè)計(jì)的十條參考指南
?微服務(wù),是一種新型的應(yīng)用架構(gòu)術(shù)語(yǔ),而最準(zhǔn)確的定義來(lái)自于兩位大神(James Lewis和Martin Fowler)。
原文翻譯后,簡(jiǎn)單來(lái)說(shuō)就是:將軟件應(yīng)用程序設(shè)計(jì)為可獨(dú)立部署運(yùn)行的一種方式。這些服務(wù)主要圍繞業(yè)務(wù)能力進(jìn)行構(gòu)建,可以采用不同的編程語(yǔ)言和不同的數(shù)據(jù)存儲(chǔ)技術(shù),并且在組織架構(gòu)上存在一些共同的特征。
當(dāng)下,越來(lái)越多的組織在應(yīng)用架構(gòu)上逐步從單體架構(gòu)再向微服務(wù)架構(gòu)進(jìn)行演進(jìn),殊不知,盲目的跟風(fēng),只會(huì)讓軟件開發(fā)及運(yùn)維成本日益劇增,我們應(yīng)該始終堅(jiān)持以“拆是手段,合是目的”為原則,從而提升應(yīng)用交付效能,實(shí)現(xiàn)可持續(xù)演進(jìn)的架構(gòu)體系。
今天就跟大家來(lái)講一講,我在日常工作中常用的一些微服務(wù)設(shè)計(jì)參考,但我想說(shuō),它并不是萬(wàn)能的,也不是絕對(duì)的,所以不要指望它,能解決你所有的微服務(wù)設(shè)計(jì)問(wèn)題,而且,有時(shí)候還需要考慮一些客觀因素的存在,特別是歷史遺留系統(tǒng)。
指南一:服務(wù)無(wú)狀態(tài)
微服務(wù)內(nèi)部應(yīng)確保為無(wú)狀態(tài),即:將有狀態(tài)信息從微服務(wù)中進(jìn)行剝離,從而單純的成為一個(gè)無(wú)狀態(tài)的計(jì)算節(jié)點(diǎn),以便可快速實(shí)現(xiàn)動(dòng)態(tài)伸縮的橫向擴(kuò)展能力,同時(shí)對(duì)應(yīng)用系統(tǒng)不產(chǎn)生額外的成本投入或代碼侵入。例如:將會(huì)話信息剝離出來(lái),放入分布式緩存中托管。
指南二:前后端分離
傳統(tǒng)的應(yīng)用通常會(huì)將前端代碼與后端代碼融合在一起,導(dǎo)致前后端代碼強(qiáng)耦合,不便于后續(xù)的管理維護(hù),建議進(jìn)行前后端分離,前端更強(qiáng)調(diào)的是交互體驗(yàn)和靈活性,而后端更強(qiáng)調(diào)的是能力抽象和穩(wěn)定性,而微服務(wù)僅承接后端服務(wù)或者接口,不承接前端展現(xiàn)或渲染。
指南三:業(yè)務(wù)抽象化
通常設(shè)計(jì)人員會(huì)站在技術(shù)視角,采用數(shù)據(jù)驅(qū)動(dòng)這種自下而上的設(shè)計(jì)模式,強(qiáng)調(diào)的是數(shù)據(jù)結(jié)構(gòu),即:優(yōu)先確定數(shù)據(jù)結(jié)構(gòu),然后再根據(jù)數(shù)據(jù)結(jié)構(gòu)的關(guān)系進(jìn)行微服務(wù)拆分,但微服務(wù)一般適用于解決業(yè)務(wù)復(fù)雜度較高的場(chǎng)景,建議從業(yè)務(wù)視角,采用領(lǐng)域驅(qū)動(dòng)這種自上而下的設(shè)計(jì)模式,更強(qiáng)調(diào)的是業(yè)務(wù)能力,即:優(yōu)先明確業(yè)務(wù)場(chǎng)景,然后再根據(jù)業(yè)務(wù)場(chǎng)景建立統(tǒng)一語(yǔ)言,并對(duì)業(yè)務(wù)概念進(jìn)行邊界定義。
指南四:用例收斂性
根據(jù)業(yè)務(wù)場(chǎng)景流程需要識(shí)別微服務(wù)間的調(diào)用關(guān)系,并對(duì)其進(jìn)一步進(jìn)行合理性的驗(yàn)證,在通常情況下我們建議用例跨越的服務(wù)越少越好,一方面能夠降低系統(tǒng)的響應(yīng)延遲,另一方面能夠減少服務(wù)之間的依賴程度,若依賴鏈路過(guò)長(zhǎng),那么依賴鏈條上的任何一個(gè)微服務(wù)發(fā)生變更,其鏈條后的任何微服務(wù)均可能需要改變。
指南五:實(shí)體收斂性
在某些業(yè)務(wù)場(chǎng)景下,需要兩個(gè)或多個(gè)微服務(wù)間針對(duì)某個(gè)實(shí)體信息進(jìn)行單向或雙向同步,即:某個(gè)實(shí)體由多個(gè)微服務(wù)來(lái)管理,從而降低微服務(wù)間的依賴程度,但可能會(huì)引發(fā)數(shù)據(jù)一致性的問(wèn)題,建議相同的實(shí)體所跨越的微服務(wù)不能太多,實(shí)體參與同步的微服務(wù)越多,其數(shù)據(jù)一致性問(wèn)題就越容易暴露。
指南六:高內(nèi)聚特性
微服務(wù)的內(nèi)聚性越高,設(shè)計(jì)模型的可理解性就越強(qiáng),根據(jù)業(yè)務(wù)流程和場(chǎng)景識(shí)別所有實(shí)體后,需對(duì)實(shí)體間進(jìn)行關(guān)系分析,優(yōu)先識(shí)別出生命周期一致的實(shí)體進(jìn)行歸類,然后根據(jù)實(shí)體與聚合根的區(qū)別,明確每個(gè)聚合根的邊界,微服務(wù)的最小單元通常是一個(gè)聚合根,可根據(jù)技術(shù)成本來(lái)評(píng)估并確定一個(gè)微服務(wù)中包括幾個(gè)聚合根,但不建議對(duì)一個(gè)聚合根進(jìn)行割裂。
類型 | 唯一標(biāo)識(shí) | 生命周期 | 是否只讀 | 判斷相等 |
聚合根 | 全局唯一 | 獨(dú)立生命周期 | 否 | 標(biāo)識(shí) |
實(shí)體 | 聚合內(nèi)唯一 | 從屬對(duì)應(yīng)的聚合根 | 否 | 標(biāo)識(shí) |
值對(duì)象 | 無(wú)唯一標(biāo)識(shí) | 無(wú)生命周期 | 是 | 屬性 |
指南七:低耦合特性
微服務(wù)的耦合性越低,設(shè)計(jì)模型就能更快適應(yīng)系統(tǒng)需求的變化,若微服務(wù)間聯(lián)系越緊密,其獨(dú)立性就會(huì)變得越差,微服務(wù)的管控治理也會(huì)變得十分困難,例如:某個(gè)微服務(wù)契約發(fā)生變化后,那么依賴的微服務(wù)將都會(huì)受到影響,因此需要深度分析微服務(wù)間的調(diào)用關(guān)系強(qiáng)弱,并根據(jù)依賴的強(qiáng)弱梳理上下游關(guān)系,從而將此影響減少到最低。
指南八:先垂直劃分
以業(yè)務(wù)領(lǐng)域視角對(duì)服務(wù)進(jìn)行垂直拆分,在屏蔽任何技術(shù)實(shí)現(xiàn)細(xì)節(jié)的情況下,先對(duì)業(yè)務(wù)能力進(jìn)行服務(wù)分類,然后再根據(jù)服務(wù)間的關(guān)聯(lián)程度將其劃分到一個(gè)微服務(wù)中,其滿足每個(gè)微服務(wù)僅承擔(dān)一類業(yè)務(wù)能力,且后續(xù)僅因這類業(yè)務(wù)發(fā)生變化而變化,以及這些變化盡可能在一個(gè)微服務(wù)中閉環(huán)完成,不需要影響其他服務(wù),最后再根據(jù)拆分后所引入的技術(shù)債務(wù)進(jìn)行權(quán)衡決定是否合并。
指南九:后水平劃分
以非功能性視角對(duì)微服務(wù)進(jìn)行水平拆分,通常會(huì)從服務(wù)的隔離性、可靠性、擴(kuò)展性等幾個(gè)方面進(jìn)行綜合評(píng)估考慮??筛鶕?jù)迭代的變化速率進(jìn)行拆分,避免敏態(tài)服務(wù)的改動(dòng)升級(jí)影響穩(wěn)態(tài)服務(wù),根據(jù)業(yè)務(wù)的服務(wù)水平進(jìn)行拆分,在出現(xiàn)故障時(shí)優(yōu)先確保關(guān)鍵核心服務(wù)的正常運(yùn)作,根據(jù)服務(wù)的性能要求進(jìn)行拆分,避免因性能隔離性問(wèn)題導(dǎo)致服務(wù)整體癱瘓,最后再根據(jù)拆分后所引入的技術(shù)債務(wù)進(jìn)行權(quán)衡決定是否合并。
指南十:自組織能力
自組織能力是實(shí)施微服務(wù)的關(guān)鍵所在,每一個(gè)團(tuán)隊(duì)需要對(duì)微服務(wù)的整個(gè)生命周期負(fù)責(zé),所有團(tuán)隊(duì)成員的工作能夠在獨(dú)立的微服務(wù)上下文中,即:微服務(wù)應(yīng)用架構(gòu)需要盡可能的適配團(tuán)隊(duì)間的組織架構(gòu),從而能夠獨(dú)立決策獨(dú)立治理,而團(tuán)隊(duì)和團(tuán)隊(duì)之間也是以一種松耦合性的方式進(jìn)行交互連接。
綜上所列,是我常用的一些招數(shù),希望它能夠?qū)δ阌兴鶐椭?qǐng)永遠(yuǎn)記住,「拆」永遠(yuǎn)不是目的,它是一種手段,通過(guò)「拆」,是讓微服務(wù)間能夠更好的協(xié)同工作,最終達(dá)到「合」的效果。?






