用微服務(wù)方法開(kāi)發(fā)應(yīng)用可以增強(qiáng)適應(yīng)性和加快上市速度,但是把應(yīng)用分拆為細(xì)粒度服務(wù)又會(huì)導(dǎo)致復(fù)雜性。以下是我們期待的。
自從2011年微服務(wù)這個(gè)詞被杜撰出來(lái),它就在前瞻的應(yīng)用開(kāi)發(fā)機(jī)構(gòu)中引起軒然大波。過(guò)了短短幾年,微服務(wù)即成為主流,根據(jù)Nginix最近的調(diào)查,36%受調(diào)查的企業(yè)當(dāng)前正在使用微服務(wù),另外26%還在研究階段。但到底什么是微服務(wù)架構(gòu)呢?它適合你的機(jī)構(gòu)文化、技能和需要嗎?
一起來(lái)看看你應(yīng)該在下一個(gè)應(yīng)用開(kāi)發(fā)項(xiàng)目使用微服務(wù)的七個(gè)理由,還有五個(gè)你成功的道路上必須掃除的障礙。
用微服務(wù)的理由
微服務(wù)是面向服務(wù)的體系架構(gòu)(SOA)的一個(gè)變體,它是這樣一個(gè)架構(gòu)樣式,在這里應(yīng)用程序被分解為多個(gè)寬松地耦合的服務(wù)。有了細(xì)粒度的服務(wù)和輕量級(jí)的協(xié)議,微服務(wù)可以提供增強(qiáng)的模塊、使應(yīng)用更容易開(kāi)發(fā)、測(cè)試、部署、還有更重要的是變更和維護(hù)。
當(dāng)中心化的、多級(jí)的架構(gòu)被用來(lái)在單個(gè)代碼庫(kù)上創(chuàng)建整個(gè)應(yīng)用時(shí),毫無(wú)疑問(wèn)你的機(jī)構(gòu)仍然受制于單體時(shí)期開(kāi)發(fā)的應(yīng)用。在臺(tái)式機(jī)主宰IT時(shí)期客戶服務(wù)模式是一個(gè)極好的選擇。但是由于移動(dòng)設(shè)備和云的興起,后臺(tái)數(shù)據(jù)必須對(duì)一系列的設(shè)備可用,而單體架構(gòu)不再讓你輕松了,因?yàn)椴还苁裁磿r(shí)候做出更改,系統(tǒng)都必須被更新,每次你要添加功能或調(diào)整到新環(huán)境時(shí),它都為新錯(cuò)誤創(chuàng)造了可能性。更糟糕的是,由于一切都受到單個(gè)代碼庫(kù)的束縛,你不能擴(kuò)展某一個(gè)功能或服務(wù),你必須擴(kuò)展整個(gè)應(yīng)用,這導(dǎo)致極其高昂的成本。
有了微服務(wù),你的代碼被分解為以獨(dú)立進(jìn)程運(yùn)行的獨(dú)立服務(wù)。在獨(dú)立的、通信的服務(wù)的編制下,來(lái)自一個(gè)服務(wù)的輸出被用作另一個(gè)服務(wù)的輸入。微服務(wù)對(duì)那些對(duì)自己的應(yīng)用所能支持的一些列設(shè)備沒(méi)有預(yù)設(shè)概念的企業(yè)尤其有用。由于微服務(wù)是設(shè)備和平臺(tái)無(wú)關(guān)的,它使企業(yè)能開(kāi)發(fā)這樣的應(yīng)用,這種應(yīng)用能提供跨越多個(gè)平臺(tái)的持續(xù)的用戶體驗(yàn),橫跨網(wǎng)頁(yè)、手機(jī)、物聯(lián)網(wǎng)、可穿戴設(shè)備和智能手環(huán)等環(huán)境。網(wǎng)飛(Netflix)、貝寶、亞馬遜、易趣和推特只是其中幾家使用微服務(wù)的企業(yè)。
例如沃爾瑪加拿大,它于2012年將它的軟件架構(gòu)重構(gòu)成微服務(wù)。該公司在當(dāng)時(shí)一直不具備處理每分鐘600萬(wàn)頁(yè)面的能力,幾乎在一夜之間實(shí)現(xiàn)了轉(zhuǎn)化率大幅增長(zhǎng)的結(jié)果。停機(jī)時(shí)間也被最小化了,公司可以用較廉價(jià)的x86服務(wù)器代替昂貴的商用硬件,結(jié)果是總體成本節(jié)省了20%~50%。
即便你的機(jī)構(gòu)沒(méi)有沃爾瑪和亞馬遜的體量,微服務(wù)依然可以提供巨大的價(jià)值。下面是轉(zhuǎn)向微服務(wù)后你的機(jī)構(gòu)能得到的其中一些好處。
增強(qiáng)的適應(yīng)性
有了微服務(wù),你的整個(gè)應(yīng)用都去中心化了,不像單體架構(gòu),代碼里的一個(gè)故障會(huì)影響到多個(gè)服務(wù)和功能,用微服務(wù)的話故障的影響很小。甚至當(dāng)幾個(gè)系統(tǒng)都停機(jī)維護(hù)時(shí),你的用戶也注意不到。
改善的擴(kuò)展性
擴(kuò)展性是微服務(wù)的關(guān)鍵方面。因?yàn)槊恳粋€(gè)服務(wù)都是一個(gè)獨(dú)立的組件,你可以擴(kuò)展一個(gè)功能的規(guī)模而不影響整個(gè)應(yīng)用。業(yè)務(wù)關(guān)鍵型服務(wù)可以被部署在多臺(tái)服務(wù)器上,在不影響其它服務(wù)的性能的情況下增強(qiáng)可用性和性能。
用正確的工具做正確的任務(wù)
有了微服務(wù),你就不必受制于單個(gè)供應(yīng)商。你可以靈活地用正確的工具做正確的任務(wù)。每個(gè)服務(wù)都可以用它自己的語(yǔ)言、框架或輔助服務(wù)而同時(shí)可以和你的應(yīng)用里的其它服務(wù)通信。
更快的上市時(shí)間
因?yàn)槲⒎?wù)是在寬松的耦合服務(wù)上工作的,你不必重寫(xiě)整個(gè)代碼庫(kù)來(lái)增加或修改一個(gè)功能。你只變更某一個(gè)服務(wù)。通過(guò)開(kāi)發(fā)可獨(dú)立測(cè)試或部屬的更小增量的應(yīng)用,你可以讓你的應(yīng)用和服務(wù)更快的上市。
更容易排錯(cuò)和維護(hù)
微服務(wù)還使排錯(cuò)和測(cè)試應(yīng)用變得更容易。有了這些更小的經(jīng)過(guò)持續(xù)交付和測(cè)試流程的模塊,你交付無(wú)錯(cuò)應(yīng)用的能力大大的提高了。
增加投資回報(bào)減少總體擁有成本
微服務(wù)還可以讓你優(yōu)化資源。有了微服務(wù),多個(gè)團(tuán)隊(duì)在不同的服務(wù)上工作,使你可以更快地部署,或在需要時(shí)挖掘更多。開(kāi)發(fā)時(shí)間縮短了,而你的團(tuán)隊(duì)的代碼將更易于重用。通過(guò)解耦服務(wù),你不必在昂貴的機(jī)器上操作?;镜膞86機(jī)器就能做。微服務(wù)提升的效率不僅減少了架構(gòu)成本,還最小化了停機(jī)時(shí)間。
持續(xù)交付
不像單體應(yīng)用,它有專門(mén)的團(tuán)隊(duì)致力于單一的功能,比如用戶界面、數(shù)據(jù)庫(kù)、服務(wù)器端邏輯、技術(shù)層,微服務(wù)的跨功能團(tuán)隊(duì)用持續(xù)交付模型來(lái)處理應(yīng)用的整個(gè)生命周期。當(dāng)開(kāi)發(fā)者、運(yùn)營(yíng)、測(cè)試團(tuán)隊(duì)同時(shí)在單個(gè)服務(wù)上工作時(shí),測(cè)試和排錯(cuò)變得容易和迅速。用了這個(gè)增量式開(kāi)發(fā)的方法,代碼被持續(xù)地開(kāi)發(fā)、測(cè)試和部署,你使用現(xiàn)成的庫(kù)代碼而不是重新發(fā)明輪子。
微服務(wù)并不適合所有的企業(yè)
接受了微服務(wù)的企業(yè)已經(jīng)意識(shí)到顯著的好處,忽視這個(gè)的機(jī)構(gòu)可能會(huì)落伍。盡管微服務(wù)看起來(lái)很有前途,并不是所有的企業(yè)都能從微服務(wù)獲利。確保你的企業(yè)有足夠的能力管理它。以下是給機(jī)構(gòu)的一些提醒。
你需要配備快速調(diào)配和應(yīng)用部署
有了增量式開(kāi)發(fā)和持續(xù)交付,微服務(wù)讓你的機(jī)構(gòu)長(zhǎng)葆活力。員工應(yīng)該立即調(diào)配資源以跟上最大化利用微服務(wù)所需的步伐。如果部署服務(wù)器要數(shù)天或數(shù)月的時(shí)間,你就會(huì)陷入嚴(yán)重的麻煩。同樣地,你應(yīng)該快速地部署新服務(wù)和應(yīng)用。
穩(wěn)健的監(jiān)控不能少
因?yàn)槊恳粋€(gè)服務(wù)都依賴它自己的語(yǔ)言、平臺(tái)和應(yīng)用程序接口(API),你將安排多個(gè)團(tuán)隊(duì)同時(shí)在你的微服務(wù)項(xiàng)目的不同實(shí)體上工作。你需要穩(wěn)健的監(jiān)控來(lái)有效地監(jiān)控和管理整個(gè)架構(gòu),因?yàn)槿绻悴恢婪?wù)什么時(shí)候會(huì)出故障或機(jī)器什么時(shí)候會(huì)停機(jī),當(dāng)這些情況發(fā)生的時(shí)候根本就不可能追蹤。
你必須接受開(kāi)發(fā)運(yùn)維(devops)文化
在跨功能團(tuán)隊(duì)中工作,你的業(yè)務(wù)應(yīng)該加入開(kāi)發(fā)運(yùn)維實(shí)踐和文化。在傳統(tǒng)的場(chǎng)合,開(kāi)發(fā)者專注于特性和功能,而運(yùn)營(yíng)團(tuán)隊(duì)則掉入了生產(chǎn)挑戰(zhàn)的陷進(jìn)。在運(yùn)維里,每個(gè)人都為服務(wù)的調(diào)配負(fù)責(zé),當(dāng)然也包括故障。
測(cè)試時(shí)很復(fù)雜的
有了微服務(wù),測(cè)試不再是直接的。每一個(gè)服務(wù)都有它自己的依賴關(guān)系,有些是直接的,有些是傳遞的。當(dāng)功能被增加的時(shí)候,新的依賴關(guān)系會(huì)產(chǎn)生。要關(guān)注所有一切變得不實(shí)際。還有,當(dāng)你的服務(wù)數(shù)量增加的時(shí)候,復(fù)雜性也增加了。不管是數(shù)據(jù)庫(kù)錯(cuò)誤、網(wǎng)絡(luò)延遲、緩存問(wèn)題、服務(wù)不可用性,你的微服務(wù)架構(gòu)最好能處理合理級(jí)別的故障。所以,適應(yīng)性測(cè)試和故障注入是必不可少的。
你必須假定故障總會(huì)發(fā)生
設(shè)計(jì)時(shí)為故障做好準(zhǔn)備是很重要的。你應(yīng)該準(zhǔn)備好處理多個(gè)故障問(wèn)題,比如系統(tǒng)停機(jī)、緩慢的服務(wù)和不期望的回應(yīng)。在這里,負(fù)載均衡是很重要的,但是有后備計(jì)劃是另一個(gè)重要的選擇。當(dāng)故障發(fā)生的時(shí)候,陷入困境的服務(wù)應(yīng)該能繼續(xù)以降級(jí)的功能運(yùn)行而不會(huì)使整個(gè)系統(tǒng)崩潰。