草根開(kāi)發(fā)群體的大力支持正在將微服務(wù)架構(gòu)的采用率推到新的高度。據(jù)紅帽公司中間件專家Mark Little博士聲稱,微服務(wù)是個(gè)好東西,卻不是世界和平的答案。
紅帽公司中間件部門工程副總裁Mark Little博士:采用微服務(wù)并不意味著你那架構(gòu)差強(qiáng)的泥球突然變得架構(gòu)很好。
鑒于微服務(wù)的人氣扶搖直上,那些記性不好的人可能忽略了這種方法極其類似面向服務(wù)的架構(gòu)(SOA),20年前SOA第一次出現(xiàn)在世人眼前。
不過(guò)紅帽公司中間件部門工程副總裁Mark Little博士喜歡將微服務(wù)看成面向服務(wù)的架構(gòu)中的精華部分,它得益于出現(xiàn)了更先進(jìn)的工程和運(yùn)維技術(shù)及技巧。
Little說(shuō):“區(qū)別就在于,推動(dòng)它的主要是開(kāi)發(fā)軟件和分布式軟件領(lǐng)域的新方法。Linux容器等技術(shù)――Docker就是個(gè)典例。你現(xiàn)在有了不變的服務(wù),有了Kuberneters之類用于協(xié)調(diào)那些服務(wù)的技術(shù)――很顯然,你有了開(kāi)發(fā)運(yùn)維(DevOps),而開(kāi)發(fā)運(yùn)維受到敏捷開(kāi)發(fā)理念的重大影響。”
“那些技術(shù)讓人們真正回顧我們?cè)谶^(guò)去開(kāi)發(fā)分布式系統(tǒng)的方法,面向服務(wù)的架構(gòu)就是這方面的一個(gè)例子,并挑選與那些技術(shù)相匹配的精華部分?;蛘叻粗嗳?,找到與面向服務(wù)的架構(gòu)的一些精華部分相匹配的那些技術(shù)。這可能就是區(qū)別所在。架構(gòu)方法并非不一樣,但是其背后的技術(shù)確實(shí)不一樣。”
在微服務(wù)架構(gòu)中,應(yīng)用程序組裝成一組小小的半自主式進(jìn)程,這些進(jìn)程執(zhí)行特定的任務(wù),并使用API彼此進(jìn)行聯(lián)系。微服務(wù)旨在易于使用、靈活擴(kuò)展,在Web應(yīng)用程序、移動(dòng)應(yīng)用程序和物聯(lián)網(wǎng)應(yīng)用程序中日益嶄露頭角。
在面向服務(wù)的架構(gòu)的以往不足中,Little提到了一個(gè)不足:無(wú)法在客戶機(jī)和服務(wù)之間提供很好的契約定義,他還提到了Web服務(wù)描述語(yǔ)言(WSDL)的不足,這種語(yǔ)言對(duì)松散耦合、分布式的系統(tǒng)而言差強(qiáng)人意。
然而,就因?yàn)樵S多因素和技術(shù)融合到一起,讓微服務(wù)成為當(dāng)下風(fēng)光無(wú)限的架構(gòu),并不能保證它就能一帆風(fēng)順。
Little說(shuō):“認(rèn)識(shí)到微服務(wù)不是世界和平的答案,這一點(diǎn)很重要。它對(duì)一些任務(wù)來(lái)說(shuō)很好。但是它跟任何技術(shù)一樣,也有缺點(diǎn)。就因?yàn)槟悴捎昧宋⒎?wù),并不突然意味著你那架構(gòu)差勁的泥球(ball of mud)突然架構(gòu)變得很好,不再是泥球。它有可能變成了好多分布式泥球。”
“這讓我有點(diǎn)擔(dān)憂。我長(zhǎng)期以來(lái)就在關(guān)注面向服務(wù)的架構(gòu),知道優(yōu)點(diǎn)和缺點(diǎn)。我喜歡微服務(wù),因?yàn)樗屛覀兊靡躁P(guān)注優(yōu)點(diǎn),但是人們以為它能解決根本就解決不了的許多問(wèn)題,這確實(shí)讓我擔(dān)心。”
如果你正在考慮微服務(wù),最好從良好的軟件工程實(shí)踐開(kāi)始入手。
Little說(shuō):“從根本上來(lái)說(shuō),這正是面向服務(wù)的架構(gòu)背后的思想。如果你不從那方面開(kāi)始入手,無(wú)論你使用Docker、虛擬化、Java虛擬機(jī)還是使用其他什么都不重要,合適的工具不會(huì)為你解決架構(gòu)問(wèn)題。”
微架構(gòu)或者甚至面向服務(wù)的架構(gòu)真正發(fā)揮所長(zhǎng)的地方在于,應(yīng)彼此獨(dú)立部署的邏輯服務(wù),這些邏輯服務(wù)可以獨(dú)立于其他服務(wù)進(jìn)行擴(kuò)展,而且能夠?qū)崿F(xiàn)獨(dú)立的故障切換。
Little說(shuō):“我在微服務(wù)方面擔(dān)心的問(wèn)題之一就是,你有一個(gè)整體式系統(tǒng)(monolith),假設(shè)你開(kāi)始把它分解成多個(gè)服務(wù),可是分解時(shí)很隨意,到頭來(lái)就會(huì)分解得過(guò)細(xì),最后會(huì)有10個(gè)、100個(gè)甚至1000個(gè)微服務(wù)。”
“但是這些微服務(wù)又彼此高度依賴,以至于如果某一個(gè)服務(wù)出現(xiàn)故障,其余服務(wù)很有可能也會(huì)出現(xiàn)故障。這種情況下,你一無(wú)所獲。你有999個(gè)服務(wù)就在那里干等著另一個(gè)服務(wù)恢復(fù)正常運(yùn)行。”
據(jù)Little聲稱,那些開(kāi)始使用微服務(wù)的人應(yīng)該找出未能實(shí)現(xiàn)其功能的軟件,而不是就因?yàn)槭褂媚晗薅涯切┡f軟件挑出來(lái)。
[page]他說(shuō):“找出對(duì)你來(lái)說(shuō)確實(shí)沒(méi)有發(fā)揮功能的軟件――我強(qiáng)調(diào)的是沒(méi)有發(fā)揮功能的那個(gè)組件,因?yàn)槟闳缃窨赡軗碛性谶^(guò)去30年一直順暢運(yùn)行的整體式系統(tǒng),而且全年365天很順利地處理你交給它處理的負(fù)載。”
“在這種情況下,把整體式系統(tǒng)分解成微服務(wù)可能不會(huì)給你帶來(lái)多大的好處。但是你可能會(huì)有完全相反的整體式系統(tǒng):來(lái)來(lái)去去的不同團(tuán)隊(duì)長(zhǎng)年累月構(gòu)建了某套系統(tǒng),你只好不斷給它打補(bǔ)丁。”
“該系統(tǒng)甚至可能很不可靠,用許多不同的語(yǔ)言來(lái)實(shí)施,你在考慮無(wú)論如何要重新實(shí)施它。這種情況下,就很適合使用微服務(wù)。”
除了深入了解應(yīng)用程序的功能、它在哪里沒(méi)有實(shí)現(xiàn)功能外,還要明白它里面的哪些組件可以分解成微服務(wù),但切忌過(guò)猶不及。
Little說(shuō):“你不應(yīng)該把它分解成太小的微服務(wù)。有些人甚至在談?wù)摷{米服務(wù)(nano service),那未免也太過(guò)了。別這么做。明白你將如何衡量成功,這通常很重要,對(duì)微服務(wù)來(lái)說(shuō)尤為重要。”
即使在軟件沒(méi)有發(fā)揮功能的情況下,也要避免從頭開(kāi)始重新實(shí)施一切,因?yàn)橛行┎糠挚梢员A粝聛?lái)。
Little說(shuō):“如果你擁有的軟件沒(méi)有發(fā)揮功能,仍應(yīng)該看看有些部分能不能保留下來(lái)――要是軟件部署已有二十三年,好多人在使用它,更是要有所保留,要是它是用COBOL實(shí)施的,更是要有所保留,這表明它久經(jīng)考驗(yàn)。”
“比如說(shuō),由于你在圣誕節(jié)那天的請(qǐng)求規(guī)模比30年前多出幾個(gè)數(shù)量級(jí),軟件如今對(duì)你來(lái)說(shuō)可能沒(méi)發(fā)揮功能。但是這并不意味著那些COBOL代碼中就沒(méi)有一些基礎(chǔ)的部分可以拿來(lái)重復(fù)使用。應(yīng)該可以重復(fù)使用,因?yàn)榫退丬浖e(cuò)誤出現(xiàn)在新的系統(tǒng)中,你也希望它們是新的軟件錯(cuò)誤。你不希望重新引入已加以解決的舊軟件錯(cuò)誤。”
所以,有的操作系統(tǒng)(unit of work)可以獨(dú)立于其他一切而部署;它們可能會(huì)出故障,但不會(huì)引起應(yīng)用程序的其余部分陷入停頓;還可以獨(dú)立于其他一切進(jìn)行擴(kuò)展,找出了這種操作單元后,下一步就是考慮你可以對(duì)它定義什么樣的契約。
Little說(shuō):“該契約將包括其接口:我如何遠(yuǎn)程調(diào)用它,我用什么來(lái)遠(yuǎn)程調(diào)用它?許多人談?wù)撐⒎?wù)和代表狀態(tài)傳輸協(xié)議(REST);REST對(duì)微服務(wù)來(lái)說(shuō)絕對(duì)是一種根本方法。但是它未必就是你想與服務(wù)進(jìn)行聯(lián)系的唯一方法。”
“你可能想使用一種二進(jìn)制協(xié)議與服務(wù)進(jìn)行聯(lián)系。可能除了使用一些老式協(xié)議與它進(jìn)行聯(lián)系外,你別無(wú)選擇。如果是COBOL,盡管你改用微服務(wù),你的架構(gòu)中可能仍有相當(dāng)多一部分仍與公共對(duì)象請(qǐng)求代理架構(gòu)(CORBA)緊密相關(guān)。它可能不是與你的微服務(wù)進(jìn)行聯(lián)系的獨(dú)家方式,但是你可能得在某個(gè)地方要有CORBA適配件。”
之后是典型的分布式系統(tǒng)問(wèn)題,因?yàn)橐坏┠汩_(kāi)始創(chuàng)建可獨(dú)立擴(kuò)展的微服務(wù),通過(guò)HTTP或二進(jìn)制協(xié)議的遠(yuǎn)程交互其速度將不如內(nèi)存中的過(guò)程調(diào)用。
Little說(shuō):“所以你要擔(dān)心調(diào)用遠(yuǎn)程服務(wù)意味著什么,如果你在響應(yīng)時(shí)間方面有嚴(yán)格要求,更要擔(dān)心了。越是將這些東西分解成服務(wù),無(wú)論它們是宏服務(wù)、微服務(wù)還是納米服務(wù),你越要開(kāi)始擔(dān)心:我是在分布式環(huán)境中運(yùn)行。這對(duì)我來(lái)說(shuō)意味著什么?我的應(yīng)用程序?qū)嶋H上忍受得了嗎?”
“因?yàn)槲铱赡艽_實(shí)需要微服務(wù),可是很遺憾,除非有人發(fā)明一種網(wǎng)絡(luò)使用超光速粒子來(lái)傳輸信息,否則我其實(shí)無(wú)法調(diào)用任何東西,因?yàn)槲覐膩?lái)無(wú)法履行我的契約義務(wù)。我的一切都在大泥球里面。”
原文標(biāo)題:Microservices 101: The good, the bad and the ugly