微服務架構(gòu):如何用十步解耦你的系統(tǒng)?

導言

耦合性晦毙,是對模塊間關(guān)聯(lián)程度的度量生巡。耦合的強弱取決于模塊間接口的復雜性、調(diào)用模塊的方式以及通過界面?zhèn)魉蛿?shù)據(jù)的多少见妒。模塊間的耦合度是指模塊之間的依賴關(guān)系孤荣,包括控制關(guān)系、調(diào)用關(guān)系须揣、數(shù)據(jù)傳遞關(guān)系盐股。模塊間聯(lián)系越多,其耦合性越強耻卡,同時表明其獨立性越差疯汁。軟件設(shè)計中通常用耦合度和內(nèi)聚度作為衡量模塊獨立程度的標準。高內(nèi)聚低耦合卵酪,是軟件工程中的概念幌蚊,是判斷設(shè)計好壞的標準,主要是面向?qū)ο蟮脑O(shè)計凛澎,主要是看類的內(nèi)聚性是否高霹肝,耦合度是否低估蹄。

首先獻上微服務的技術(shù)點思維導圖:

現(xiàn)在加群即可獲取高清大圖塑煎,?群號:923116658? ?還有Java工程化、高性能及分布式臭蚁、高性能最铁、高架構(gòu)、性能調(diào)優(yōu)垮兑、Spring冷尉、MyBatis、Netty源碼分析等多個知識點高級進階干貨的直播免費學習權(quán)限及相關(guān)視頻資料系枪,還有spring和虛擬機等書籍掃描版,也有Java面試題及答案

SpringCloud和Dubbo都是現(xiàn)在比較成熟的微服務框架雀哨,如何使用兩者構(gòu)建搭建你的微服務系統(tǒng)呢?他們是如何將你的系統(tǒng)解耦的私爷?又是怎么解耦的呢雾棺?請聽我慢慢道來:

第一步,解耦現(xiàn)有模塊

將現(xiàn)有耦合在一起的模塊進行重新的設(shè)計衬浑,設(shè)計成可以獨立部署的多個模塊捌浩,使用微服務框架很容易做到,成熟的示例代碼都特別多工秩,這里不再多講尸饺。下面是我的微服務實現(xiàn)的一個架構(gòu)設(shè)計圖进统。

第二步,抽取公共模塊

架構(gòu)設(shè)計原則之一就是反向依賴浪听,只從上往下依賴螟碎,所以,我們將公共的重復功能的模塊抽取出來迹栓。必須強調(diào)一點的是抚芦,公共模塊必須足夠的功能單一,不能有其他業(yè)務的邏輯判斷在里面迈螟。在整個模塊依賴關(guān)系里叉抡,應該是一棵樹狀結(jié)構(gòu)的關(guān)系圖,而不是一個網(wǎng)狀的關(guān)系圖答毫。

1)做好代碼控制

筆者之前就碰到過這種問題褥民,模塊劃分完了,當需求變更的時候洗搂,研發(fā)人員根本不管是不是公共模塊消返,只要能快速完成任務,哪里改的快就在哪里改耘拇。因此撵颊,這個需要內(nèi)部要做好代碼的權(quán)限管理,不應該開放所有的提交代碼的權(quán)限給所有的人惫叛。后來我就將公共模塊的合并代碼的權(quán)限收回了倡勇,合并代碼需要先提交申請,代碼review過才能合并代碼嘉涌。這就保證了公共模塊代碼的功能單一妻熊。

2)做好版本管理

公共模塊被多個模塊模塊使用,任何代碼的修改都可能會導致到正在使用的模塊無法使用仑最。這個就需要做好各個模塊的版本管理扔役,我是使用maven進行版本管理的,定義一個總的父pom項目來進行各個模塊的版本管理警医,任何被其他模塊使用的開發(fā)包都要在父pom里進行版本管理亿胸。當新的需求來了以后,需要對公共模塊進行修改時预皇,要更新模塊的版本號侈玄,同時更新父pom的版本號,需要使用公共模塊新功能的模塊就修改父pom的版本號深啤,不需要使用公共模塊新功能的模塊就不用修改父pom的版本號拗馒,這樣公共模塊的新老版本都能使用,即使出現(xiàn)問題溯街,也只會影響到使用新版本的模塊诱桂。

第三步洋丐,解耦迭代需求

現(xiàn)在的代碼迭代速度快,同時會面對多個需求挥等,有的需求緊急友绝,有的需求不緊急,而且緊急程度可能隨時會調(diào)整肝劲,如果將所有的需求都放在一個分支迁客,當只想上線其中幾個需求的時候發(fā)現(xiàn)無法將不上線需求的代碼拆分出來,是不是很尷尬辞槐,即使能拆分出來掷漱,代碼修改過以后又要重新進行部署測試,很費時費力榄檬,所以要針對不同的需求重新建立研發(fā)分支卜范,這樣就將不同需求的分支解耦,保證想上哪個就上哪個鹿榜,需要上多個需求的就將分支合并上線海雪。

第四步,配置解耦

為每個模塊每個環(huán)境配置一個配置文件舱殿,這樣就可以把不同的環(huán)境的配置解耦奥裸,不用每次上線都更新一次。但是如果需要修改數(shù)據(jù)庫配置沪袭,還是需要重新部署重啟應用才能解決湾宙。使用微服務的配置中心就能解決這個問題了,比如使用ZooKeeper作為SpringCloud的配置中心枝恋,修改ZooKeeper中的節(jié)點數(shù)據(jù)就可以實時更新配置并生效创倔。

第五步嗡害,權(quán)限解耦

當采用微服務架構(gòu)把原來的系統(tǒng)拆分成多個系統(tǒng)以后焚碌,你會發(fā)現(xiàn)原來簡單的問題,現(xiàn)在變的復雜了霸妹,比如功能的權(quán)限控制十电,原來是跟業(yè)務代碼放到一起,現(xiàn)在如果每個業(yè)務模塊都有功能權(quán)限的代碼叹螟,將是一件非常麻煩的事情鹃骂。那么解決辦法就是將權(quán)限功能遷移出來,恰巧使用SpringCloudGateway就能完成這件事情罢绽,SpringCloudGateway能夠進行負載均衡畏线,各種路由攔截,只要將原來的權(quán)限控制代碼遷移到Gateway里實現(xiàn)以下就可以了良价,權(quán)限配置管理界面和代碼邏輯都不用變寝殴。如果是API接口呢蒿叠,就需要將安全驗證等功能放在Gateway里實現(xiàn)就好了。

第六步蚣常,流量解耦

當你的系統(tǒng)訪問量越來越大的時候市咽,你會發(fā)現(xiàn)每次升級都是一件非常麻煩的事情,領(lǐng)導會跟你說這個功能忙時不能停機影響用戶使用呀抵蚊,只能半夜升級呀施绎,多么痛快的事情啊。有的時候運營人員也會發(fā)現(xiàn)贞绳,怎么我的后臺訪問怎么這么慢谷醉?問題出在哪里呢?問題就出在冈闭,所有的模塊都用了一個Gateway孤紧,多端同時使用了相同的流量入口,當在舉行大促時拒秘,并發(fā)量非常高号显,帶寬占用非常大,那么其他的功能也會跟著慢下來躺酒。

不能在舉行大促時發(fā)券時押蚤,我線下支付一直支付不了,這是非常嚴重的事故了羹应,客服電話會被打爆了揽碘。所以,必須要對流量進行拆分园匹,各個端的流量不能相互影響雳刺,比如APP端、微信端裸违、運營后臺和商戶后臺等都要分配獨立的Gateway掖桦,并接入獨立的帶寬,對于流量大的端可以使用彈性帶寬供汛,對于運營后臺和商戶后臺就比較小的固定的帶寬即可枪汪。這樣就大大降低了升級時的難度,是不是再上線時就沒那么緊張了怔昨?

第七步雀久,數(shù)據(jù)解耦

系統(tǒng)剛上線的時候,數(shù)據(jù)量不大趁舀,所有的模塊感覺都挺好的赖捌,當時間一長,系統(tǒng)訪問量非常大的時候會發(fā)現(xiàn)功能怎么都變慢了矮烹,怎么mysql的cpu經(jīng)常100%越庇。那么恭喜你奋隶,你中招了,你的數(shù)據(jù)需要解耦了悦荒。

首先要模塊間數(shù)據(jù)解耦唯欣,將不同模塊使用獨立的數(shù)據(jù)庫,保證各模塊之間的數(shù)據(jù)不相互影響搬味。

其次就是冷熱數(shù)據(jù)解耦境氢,同一個模塊運行時間長了以后也會積累大量的數(shù)據(jù),為了保證系統(tǒng)的性能的穩(wěn)定碰纬,要減少因為數(shù)據(jù)量太大造成的性能降低萍聊,需要對歷史數(shù)據(jù)進行定期的遷移,對于完整數(shù)據(jù)分析匯總就在其他的庫中實現(xiàn)悦析。

第八步寿桨,擴容解耦

一個好的架構(gòu)設(shè)計是要有好的橫向擴展的能力,在不需要修改代碼只通過增加硬件的方式就能提高系統(tǒng)的性能强戴。SpringCloud和Dubbo的注冊中心天生就能夠?qū)崿F(xiàn)動態(tài)添加模塊的節(jié)點亭螟,其他模塊調(diào)用能夠?qū)崟r發(fā)現(xiàn)并請求到新的模塊節(jié)點上。

第九步骑歹,部署解耦

互聯(lián)網(wǎng)開發(fā)在于能夠快速的試錯预烙,當一個新的版本上線時,經(jīng)常是需要先讓一部分用戶進行測試一下道媚,這就是傳說中的灰度發(fā)布扁掸,同一個模塊先部署升級幾臺服務器到新版本,重啟完成后流量進來以后最域,就可以驗證當前部署的這幾臺服務器有沒有問題谴分,就繼續(xù)部署其他的節(jié)點,如果有問題馬上回滾到上一個版本镀脂。使用SpringCloudGateway的WeighRouterFilter就能實現(xiàn)這個功能牺蹄。

第十步,動靜解耦

當同一個模塊的瞬間有非常高并發(fā)的時候狗热,對钞馁,就是說的秒殺,純粹的流量解耦還是不夠匿刮,因為不能讓前面的流量沖擊后面真正的下單的功能,這個時候就需要更細的流量解耦探颈,要將靜態(tài)文件的訪問通通拋給CDN來解決熟丸,動態(tài)和靜態(tài)之間是通過定時器來出發(fā)的,時間未到之前一直刷新的是靜態(tài)的文件伪节,當時間到了之后光羞,生成新的js文件绩鸣,告訴靜態(tài)頁面可以訪問下單功能了。

總結(jié)

在模塊劃分時纱兑,要遵循“一個模塊呀闻,一個功能”的原則,盡可能使模塊達到功能內(nèi)聚潜慎。

事實上捡多,微服務架構(gòu)短期來看,并沒有很明顯的好處铐炫,甚至短期內(nèi)會影響系統(tǒng)的開發(fā)進度垒手,因為高內(nèi)聚,低耦合的系統(tǒng)對開發(fā)設(shè)計人員提出了更高的要求倒信。高內(nèi)聚科贬,低耦合的好處體現(xiàn)在系統(tǒng)持續(xù)發(fā)展的過程中,高內(nèi)聚鳖悠,低耦合的系統(tǒng)具有更好的重用性榜掌,維護性,擴展性乘综,可以更高效的完成系統(tǒng)的維護開發(fā)唐责,持續(xù)的支持業(yè)務的發(fā)展,而不會成為業(yè)務發(fā)展的障礙瘾带。

最后送福利了

現(xiàn)在加群即可獲取高清大圖鼠哥,群號:923116658? ?還有Java工程化、高性能及分布式看政、高性能朴恳、高架構(gòu)、性能調(diào)優(yōu)允蚣、Spring于颖、MyBatis、Netty源碼分析等多個知識點高級進階干貨的直播免費學習權(quán)限及相關(guān)視頻資料嚷兔,還有spring和虛擬機等書籍掃描版,也有Java面試題及答案

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末森渐,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子冒晰,更是在濱河造成了極大的恐慌同衣,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件壶运,死亡現(xiàn)場離奇詭異耐齐,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門埠况,熙熙樓的掌柜王于貴愁眉苦臉地迎上來耸携,“玉大人,你說我怎么就攤上這事辕翰《嵫埽” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵喜命,是天一觀的道長沟沙。 經(jīng)常有香客問我,道長渊抄,這世上最難降的妖魔是什么尝胆? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮护桦,結(jié)果婚禮上含衔,老公的妹妹穿的比我還像新娘。我一直安慰自己二庵,他們只是感情好贪染,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著催享,像睡著了一般杭隙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上因妙,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天痰憎,我揣著相機與錄音,去河邊找鬼攀涵。 笑死铣耘,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的以故。 我是一名探鬼主播蜗细,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼怒详!你這毒婦竟也來了炉媒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤昆烁,失蹤者是張志新(化名)和其女友劉穎吊骤,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體善玫,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡水援,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年密强,在試婚紗的時候發(fā)現(xiàn)自己被綠了茅郎。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蜗元。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖系冗,靈堂內(nèi)的尸體忽然破棺而出奕扣,到底是詐尸還是另有隱情,我是刑警寧澤掌敬,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布惯豆,位于F島的核電站,受9級特大地震影響奔害,放射性物質(zhì)發(fā)生泄漏楷兽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一华临、第九天 我趴在偏房一處隱蔽的房頂上張望芯杀。 院中可真熱鬧,春花似錦雅潭、人聲如沸揭厚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽筛圆。三九已至,卻和暖如春椿浓,著一層夾襖步出監(jiān)牢的瞬間太援,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工扳碍, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留提岔,地道東北人。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓左腔,卻偏偏與公主長得像唧垦,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子液样,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354

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