微服務(wù)筆記(二):邊界

上篇簡單介紹了微服務(wù)啸箫,列舉了單塊應(yīng)用和微服務(wù)的一些區(qū)別,之后又在網(wǎng)上閱讀了別人寫的一些微服務(wù)文章伞芹,對比之下感覺自己的歸納和文筆還是差的太遠(yuǎn)忘苛,以后還需多練。

既然要使用微服務(wù)唱较,那就必須要考慮如何對整個(gè)系統(tǒng)進(jìn)行分解扎唾,哪些功能應(yīng)該放到一個(gè)服務(wù)中,哪些不應(yīng)該南缓,即確定微服務(wù)的邊界胸遇。有人會覺得這個(gè)問題很頭疼,無從下手汉形,也有人會覺得這個(gè)很簡單纸镊,但是分解后的服務(wù)不斷出現(xiàn)各種問題,讓后續(xù)的開發(fā)變得十分痛苦概疆。

我認(rèn)為找到邊界是采用微服務(wù)架構(gòu)的最基本前提逗威,也是最有挑戰(zhàn)的部分,在沒有認(rèn)清服務(wù)邊界的情況下岔冀,不要輕易使用微服務(wù)凯旭,否則可能帶來很多意想不到的問題和麻煩。

什么樣的微服務(wù)邊界是合適的使套?

了解面向?qū)ο笤O(shè)計(jì)的朋友應(yīng)該對“單一職責(zé)原則”罐呼、“開閉原則”等基本原則都不陌生,這些原則在架構(gòu)方面同樣十分受用侦高。架構(gòu)的核心價(jià)值不在于使用多么先進(jìn)或者NB的技術(shù)嫉柴,而在于使系統(tǒng)具有高度可擴(kuò)展性,從而靈活應(yīng)對業(yè)務(wù)的不斷變化奉呛,持續(xù)演進(jìn)差凹。有句話說的好,“架構(gòu)不是設(shè)計(jì)出來的侧馅,而是演進(jìn)出來的”危尿。而擴(kuò)展性的基礎(chǔ)就是松耦合、高內(nèi)聚馁痴,這是我們應(yīng)該多花一些心思思考的地方谊娇。

松耦合

微服務(wù)之間應(yīng)該是高度松耦合的,從而避免一個(gè)微服務(wù)中的問題擴(kuò)散到整個(gè)系統(tǒng)。如何判斷是不是松耦合济欢,最直接的一點(diǎn)就是可以獨(dú)立修改和部署一個(gè)服務(wù)而不影響系統(tǒng)其他部分赠堵,如果修改一個(gè)功能時(shí)不得不對系統(tǒng)其他部分也同時(shí)做出修改,那么就要反思服務(wù)的邊界是不是有問題了法褥。

松耦合的服務(wù)應(yīng)盡可能避免暴露內(nèi)部實(shí)現(xiàn)細(xì)節(jié)茫叭,因?yàn)楸┞秲?nèi)部實(shí)現(xiàn)細(xì)節(jié)意味著服務(wù)的修改,可能會需要服務(wù)的消費(fèi)方也要跟著修改半等。此外也應(yīng)該避免存在多種服務(wù)間的調(diào)用方式揍愁,這樣也會增加服務(wù)的耦合度。

高內(nèi)聚

既然要避免修改一個(gè)服務(wù)的時(shí)候帶來系統(tǒng)其它部分的修改杀饵,就要保證相關(guān)行為都放在一個(gè)服務(wù)內(nèi)莽囤,這就是高內(nèi)聚的核心,也即我們思考如何找到服務(wù)邊界要考慮的核心問題切距。

前篇有說過朽缎,“一個(gè)微服務(wù)只專注于一種業(yè)務(wù),遵循單一職責(zé)原則”谜悟,即微服務(wù)的專注话肖,要確保專注,就不能有其他無關(guān)行為夾雜進(jìn)來葡幸,也不能有自身相關(guān)行為偷溜到其他系統(tǒng)中狼牺,要準(zhǔn)確的把握所有相關(guān)行為并牢牢地把它們拴在一起。

什么方法能找到微服務(wù)邊界礼患?

分層

很多應(yīng)用都會采用分層架構(gòu)是钥,所以會有種劃分微服務(wù)方案,就是直接將原來的分層作為系統(tǒng)分解的邊界缅叠,分解出來的微服務(wù)各自負(fù)責(zé)一個(gè)層的工作悄泥。比如一個(gè)可能很多人見過的例子,就是把數(shù)據(jù)持久化層單獨(dú)做成一個(gè)服務(wù)肤粱,它負(fù)責(zé)所有的數(shù)據(jù)庫操作弹囚,帶來的好處是業(yè)務(wù)開發(fā)只需關(guān)注業(yè)務(wù)模型,而不用考慮底層存儲领曼,有專門的團(tuán)隊(duì)對持久化服務(wù)進(jìn)行迭代和優(yōu)化鸥鹉,對業(yè)務(wù)模型和數(shù)據(jù)存儲做適配,但是隨之而來的問題是大部分業(yè)務(wù)的修改都需要該服務(wù)同時(shí)也跟著修改庶骄,新的業(yè)務(wù)需求需要業(yè)務(wù)開發(fā)團(tuán)隊(duì)和持久化服務(wù)開發(fā)團(tuán)隊(duì)進(jìn)行大量溝通才能進(jìn)行毁渗,服務(wù)針對某個(gè)業(yè)務(wù)作出修改后導(dǎo)致其他業(yè)務(wù)出現(xiàn)問題等等,所以系統(tǒng)雖然做了分解单刁,但仍然是高耦合的灸异,無法獨(dú)立對一個(gè)服務(wù)隨時(shí)進(jìn)行修改和部署。

分割

如果說水平的分層作為服務(wù)邊界不是一個(gè)好的選擇,那么垂直分割又如何肺樟?通常一個(gè)良好的系統(tǒng)在開發(fā)時(shí)都會考慮用模塊來組織代碼檐春,將不同的行為放在不同的模塊中,比如訂單模塊么伯、支付模塊疟暖,如果設(shè)計(jì)得當(dāng),各個(gè)模塊之間的耦合會相對較低田柔,業(yè)務(wù)邏輯基本都是高內(nèi)聚的俐巴,只是共用了一些非業(yè)務(wù)邏輯的代碼,所以按照模塊的邊界來分割系統(tǒng)應(yīng)該是不錯(cuò)的切入點(diǎn)凯楔。

領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)(DDD)

在QCon倫敦2016大會上,《領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)》一書的作者Eric Evans提出锦募,使用領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)(DDD)概念減少微服務(wù)環(huán)境中通用語言的復(fù)雜性摆屯。Evans建議,將每個(gè)微服務(wù)設(shè)計(jì)成一個(gè)DDD限界上下文糠亩,這為系統(tǒng)內(nèi)的微服務(wù)提供了一個(gè)邏輯邊界虐骑,無論是功能,還是通用語言赎线。

限界上下文(Bounded Context)為高內(nèi)聚提供了很好的理論指導(dǎo)廷没,它的核心就是將特定職責(zé)的相關(guān)行為控制在一個(gè)有顯示邊界的范圍內(nèi),Evans的一個(gè)比喻非常形象:“細(xì)胞之所以會存在垂寥,是因?yàn)榧?xì)胞膜定義了什么在細(xì)胞內(nèi)颠黎,什么在細(xì)胞外,并且確定了什么物質(zhì)可以通過細(xì)胞膜”滞项。近年來微服務(wù)的興起又為DDD提供了很好的應(yīng)用場景狭归,只要深入挖掘領(lǐng)域知識,識別出合理的上下文文判,就能合理拆分微服務(wù)过椎。

不過我覺得領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)是一門需要長時(shí)間積累的學(xué)問,你需要和領(lǐng)域?qū)<页浞譁贤ㄏ凡郑餐页鐾ㄓ谜Z言疚宇,逐步深入挖掘領(lǐng)域知識來對領(lǐng)域模型進(jìn)行迭代,這是一個(gè)持續(xù)的過程赏殃,因此在初期對領(lǐng)域知識掌握有限的情況下敷待,不應(yīng)急著過早劃分細(xì)粒度的上下文。比較好的方式是先找出粗粒度的上下文仁热,循序漸進(jìn)讼撒,隨著領(lǐng)域知識的深入再逐步分解,這個(gè)過程可能是長期的,頗具挑戰(zhàn)的根盒,而且往往會走一些彎路钳幅、遠(yuǎn)路,但是隨著領(lǐng)域知識的沉淀和經(jīng)驗(yàn)的積累炎滞,最終總是能得出更加準(zhǔn)確的上下文邊界和模型的敢艰。

總結(jié)

微服務(wù)要求有低耦合、高內(nèi)聚的邊界册赛,使用 DDD 的限界上下文作為微服務(wù)邊界是一種很合理的方式钠导,但是服務(wù)的拆分應(yīng)隨著領(lǐng)域知識的深入逐步迭代進(jìn)行,不可操之過急森瘪。所以重點(diǎn)又落在了 DDD 上牡属,這也是我一直以來最感興趣的架構(gòu)思想,待以后對 DDD 的精髓有了更深的理解再和大家進(jìn)一步分享和交流扼睬。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末逮栅,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子窗宇,更是在濱河造成了極大的恐慌措伐,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件军俊,死亡現(xiàn)場離奇詭異侥加,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)粪躬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門担败,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人镰官,你說我怎么就攤上這事氢架。” “怎么了朋魔?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵岖研,是天一觀的道長。 經(jīng)常有香客問我警检,道長孙援,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任扇雕,我火速辦了婚禮拓售,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘镶奉。我一直安慰自己础淤,他們只是感情好崭放,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鸽凶,像睡著了一般币砂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上玻侥,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天决摧,我揣著相機(jī)與錄音,去河邊找鬼凑兰。 笑死掌桩,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的姑食。 我是一名探鬼主播波岛,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼音半!你這毒婦竟也來了则拷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤祟剔,失蹤者是張志新(化名)和其女友劉穎隔躲,沒想到半個(gè)月后摩梧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體物延,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年仅父,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了叛薯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,696評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡笙纤,死狀恐怖耗溜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情省容,我是刑警寧澤抖拴,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站腥椒,受9級特大地震影響阿宅,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜笼蛛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一洒放、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧滨砍,春花似錦往湿、人聲如沸妖异。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽他膳。三九已至,卻和暖如春蔓腐,著一層夾襖步出監(jiān)牢的瞬間矩乐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工回论, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留散罕,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓傀蓉,卻偏偏與公主長得像欧漱,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子葬燎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評論 2 353

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