作者:58沈劍 以前的文章討論過《互聯(lián)網(wǎng)架構(gòu),究竟為啥要做服務(wù)化?》,,隨著數(shù)據(jù)量,、并發(fā)量、業(yè)務(wù)復(fù)雜度的增長,,互聯(lián)網(wǎng)架構(gòu)會(huì)出現(xiàn)以下問題:
“服務(wù)化”是一個(gè)很好的解決上述痛點(diǎn)的方案。 那么問題來了,,微服務(wù)架構(gòu)多“微”才合適? 行業(yè)內(nèi)有這樣四類常見實(shí)踐,。 實(shí)踐一:統(tǒng)一服務(wù)層 這是最粗獷的玩法,所有基礎(chǔ)數(shù)據(jù),,都通過一個(gè)統(tǒng)一的服務(wù)來進(jìn)行訪問,。 在業(yè)務(wù)不是特別復(fù)雜的時(shí)候,這不失為一個(gè)快速分層的方案,,一旦業(yè)務(wù)變得復(fù)雜,,服務(wù)層會(huì)變得非常重,成為耦合焦點(diǎn),。 以微信場景為例,,假設(shè)通過一個(gè)通用的服務(wù)層來訪問基礎(chǔ)數(shù)據(jù)。 則只有一個(gè)統(tǒng)一的服務(wù)層,,用戶信息,,好友信息,群組信息,,消息信息都通過這個(gè)服務(wù)層來訪問,。 實(shí)踐二:一個(gè)子業(yè)務(wù)一個(gè)服務(wù) 如果所有的數(shù)據(jù)訪問都通過一個(gè)服務(wù)層來訪問,那么一行代碼出故障,,就將影響整個(gè)服務(wù),,所以更合理的做法是在服務(wù)層進(jìn)行拆分,。 服務(wù)層架構(gòu)如何細(xì)分? 垂直拆分是個(gè)好的方案,將子業(yè)務(wù)分拆,,那么微信的服務(wù)化架構(gòu)或許會(huì)變成下面的樣子:
這樣的話,一個(gè)服務(wù)出問題也不會(huì)影響其他服務(wù),,與此同時(shí),,數(shù)據(jù)層也按照業(yè)務(wù)垂直拆分開了。 服務(wù)粒度變細(xì)之后,,出現(xiàn)一個(gè)新的問題,,業(yè)務(wù)與服務(wù)的連接關(guān)系變復(fù)雜了,有什么好的優(yōu)化方案么? 常見的,,加入一個(gè)高可用服務(wù)分發(fā)層(Service Mesh不就是這么干的么),,并在協(xié)議設(shè)計(jì)時(shí)加入服務(wù)號(hào),可以減少蜘蛛網(wǎng)狀的依賴關(guān)系:
實(shí)踐三:一個(gè)數(shù)據(jù)庫對(duì)應(yīng)一個(gè)服務(wù) 數(shù)據(jù)訪問服務(wù)最初是從DAO/ORM的數(shù)據(jù)訪問需求過來的,所以有些公司也有一個(gè)數(shù)據(jù)庫一個(gè)服務(wù)的玩法,。 一個(gè)子業(yè)務(wù)對(duì)應(yīng)一個(gè)服務(wù)的玩法如下圖:
拆分成一個(gè)數(shù)據(jù)庫一個(gè)服務(wù),則架構(gòu)會(huì)變成下面的樣子: 群信息庫,,群成員庫,群消息庫之間也解耦開,,不會(huì)相互影響,。 實(shí)踐四,一個(gè)接口對(duì)應(yīng)一個(gè)服務(wù) 微服務(wù)架構(gòu)中,,更極端的,,甚至一個(gè)接口對(duì)應(yīng)一個(gè)微服務(wù)。 這樣的話,,架構(gòu)就從: 進(jìn)化為:
多個(gè)服務(wù)操縱同一個(gè)數(shù)據(jù)庫,,任何接口服務(wù)出問題,都不會(huì)影響其他接口服務(wù),。使用這種方案的,,一般與開發(fā)語言特性結(jié)合比較緊密,,例如golang。 上文中談到的服務(wù)化與微服務(wù),,不同粒度的服務(wù)化各有什么優(yōu)劣呢? 總的來說,,細(xì)粒度拆分的優(yōu)點(diǎn)有:
細(xì)粒度拆分的不足也很明顯:
互聯(lián)公司,,以“子業(yè)務(wù)”作為微服務(wù)粒度是最常用,訂單服務(wù),,用戶服務(wù),,支付服務(wù)等等。 |
|