1.什么是微服務(wù)
簡(jiǎn)單而言微服務(wù)就是一些協(xié)同工作的小而自治的服務(wù)。這與傳統(tǒng)服務(wù)存在一些不同的點(diǎn)。
1.1 很小,專注于做好一件事情
隨著新功能的增加,代碼庫(kù)會(huì)越變?cè)酱?。時(shí)間久了代碼庫(kù)會(huì)非常龐大,以至于想要知道在什么地方做修改都很困難。盡管我們想在巨大的代碼庫(kù)中做到清晰的模塊化,但事實(shí)上這些模塊之間的界限很難維護(hù)。相似的功能代碼開始在代碼庫(kù)中隨處可見,使得修復(fù)bug或?qū)崿F(xiàn)更加困難。
在一個(gè)單塊系統(tǒng)內(nèi),通常會(huì)創(chuàng)建一些抽象層或者模塊來(lái)保證代碼的內(nèi)聚性,從而避免上述問題。內(nèi)聚性是指將相關(guān)代碼放一起,在考慮使用微服務(wù)的時(shí)候,內(nèi)聚性這一概念很重要。
微服務(wù)將單一職責(zé)的理念應(yīng)用在獨(dú)立的服務(wù)上,根據(jù)業(yè)務(wù)的邊界來(lái)確定服務(wù)的邊界,這樣很容易確定某個(gè)功能代碼應(yīng)該放在哪里。而且由于該服務(wù)專注于某個(gè)邊界之內(nèi),因此可以更好地避免由于代碼庫(kù)過大衍生出的很多相關(guān)問題。
1.2 自治性
一個(gè)微服務(wù)就是一個(gè)獨(dú)立的實(shí)體。它可以獨(dú)立地部署在PAAS上,也可以作為一個(gè)操作系統(tǒng)進(jìn)程存在。
服務(wù)之間通過網(wǎng)絡(luò)調(diào)用進(jìn)行通信,從而加強(qiáng)了服務(wù)之間的隔離性,避免緊耦合。
這些服務(wù)應(yīng)該可以彼此間獨(dú)立修改,并且一個(gè)服務(wù)的部署不應(yīng)該引起消費(fèi)方的變動(dòng)。
2.主要好處
微服務(wù)有很多不同的好處,其中很多好處也適用于任何一個(gè)分布式系統(tǒng)。
2.1 技術(shù)異構(gòu)性
在一個(gè)有多個(gè)服務(wù)相互協(xié)作的系統(tǒng)中,可以在不同的服務(wù)中使用最合適該服務(wù)的技術(shù),嘗試使用一種適合所有場(chǎng)景的標(biāo)準(zhǔn)化技術(shù),會(huì)使得所有場(chǎng)景都無(wú)法得到很好的支持。
如果系統(tǒng)中的一部分需要做性能提升,可以使用性能更好的技術(shù)棧重新構(gòu)建該部分,系統(tǒng)中的不同部分也可以使用不同的數(shù)據(jù)存儲(chǔ)技術(shù),比如對(duì)于社交網(wǎng)絡(luò)來(lái)說(shuō),圖數(shù)據(jù)庫(kù)能更好地處理用戶之間的交互操作,但是對(duì)于用戶發(fā)布的帖子而言文檔數(shù)據(jù)庫(kù)可能是一個(gè)更好的選擇。
微服務(wù)可以幫助我們更快的采用新技術(shù),并且理解這些新技術(shù)的好處。嘗試新技術(shù)通常伴隨著風(fēng)險(xiǎn),尤其是對(duì)于單個(gè)系統(tǒng)而言,對(duì)于微服務(wù)而言,總會(huì)存在一些地方讓我可以嘗試新技術(shù)。
2.2 彈性
如果系統(tǒng)中的某一個(gè)組件不可用了,但并沒有導(dǎo)致級(jí)聯(lián)故障,那么系統(tǒng)的其它部分還可以正常運(yùn)行。單個(gè)系統(tǒng)中如果服務(wù)不可用,那么所有的功能都不可用。微服務(wù)系統(tǒng)可以很好地處理服務(wù)不可用和功能降級(jí)問題。
2.3 擴(kuò)展
龐大的單個(gè)服務(wù)職能作為一個(gè)整體進(jìn)行擴(kuò)展,即使系統(tǒng)中只有一小部分存在性能問題,也需要對(duì)整個(gè)服務(wù)進(jìn)行擴(kuò)展。如果使用較小的多個(gè)服務(wù),則可以只對(duì)需要擴(kuò)展的服務(wù)進(jìn)行擴(kuò)展,把那些不需要擴(kuò)展的服務(wù)運(yùn)行在更小的、性能稍差的硬件上。
2.4 簡(jiǎn)化部署
在有幾百萬(wàn)代碼行的單塊應(yīng)用中,即使只修改了一行代碼,也需要重新部署整個(gè)應(yīng)用程序才能夠發(fā)布變更。這種部署的影響很大、風(fēng)險(xiǎn)很高,因此相關(guān)干系人不敢輕易做部署。于是在實(shí)際操作中,部署的頻率就會(huì)變得很低。
在微服務(wù)架構(gòu)中,各個(gè)服務(wù)是獨(dú)立部署的,這樣也就可以更快地對(duì)特定部分的代碼進(jìn)行部署。如果真的出了問題,也只會(huì)影響一個(gè)服務(wù),并且能夠進(jìn)行快速回滾。
2.5 與組織結(jié)構(gòu)相匹配
微服務(wù)架構(gòu)可以很好地將架構(gòu)與組織結(jié)構(gòu)想匹配,避免出現(xiàn)過大的代碼庫(kù),從而獲得理想的團(tuán)隊(duì)大小和生產(chǎn)力。
2.6 可組合性
在微服務(wù)架構(gòu)中,系統(tǒng)會(huì)開放很多接口供外部使用。當(dāng)情況發(fā)生改變時(shí),可以使用不同的方式構(gòu)建應(yīng)用,而整體化應(yīng)用只能提供一個(gè)非常粗粒度的接口供外部使用。
2.7 對(duì)可替代性的優(yōu)化
單個(gè)微服務(wù)的代碼量較少,重新實(shí)現(xiàn)某一個(gè)服務(wù)或者是直接刪除該服務(wù)都是相對(duì)可操作的。使用微服務(wù)架構(gòu)的團(tuán)隊(duì)可以在需要時(shí)輕易的重寫服務(wù),或者刪除不在使用的服務(wù)。
結(jié)語(yǔ):沒有銀彈
微服務(wù)不是免費(fèi)的午餐,更不是銀彈。每個(gè)公司、組織、系統(tǒng)都不一樣。微服務(wù)是否適合你,或者說(shuō)你能夠在多大程度上采用微服務(wù),取決于很多因素。