幾年前我在一家互聯(lián)網(wǎng)公司的一個(gè)電商產(chǎn)品上工作時(shí),經(jīng)歷了項(xiàng)目從無(wú)到有、業(yè)務(wù)從小到大的演變過(guò)程薄辅。當(dāng)時(shí)微服務(wù)架構(gòu)還沒(méi)有興起要拂,產(chǎn)品架構(gòu)主要是基于單體架構(gòu)的。在一年多時(shí)間內(nèi)站楚,業(yè)務(wù)流量就擴(kuò)大了十倍左右脱惰,各種功能特性需求也應(yīng)接不暇。隨著業(yè)務(wù)流量和復(fù)雜性的攀升窿春,單體架構(gòu)的問(wèn)題很快凸顯了出來(lái)拉一。
首先是系統(tǒng)復(fù)雜度不斷上升。由于對(duì)業(yè)務(wù)只進(jìn)行了簡(jiǎn)單的劃分旧乞,分為兩三個(gè)大的代碼庫(kù)蔚润,所有人的代碼提交都在這兩三個(gè)代碼庫(kù)上進(jìn)行,久而久之模塊之間的耦合越來(lái)越多尺栖,代碼的整潔性和可讀性都不斷下降嫡纠,一個(gè)文件幾千行、一個(gè)函數(shù)幾百行的情況也屢見(jiàn)不鮮延赌。一個(gè)臃腫的單體系統(tǒng)編譯除盏、啟動(dòng)、構(gòu)建都會(huì)變慢挫以,發(fā)展到后來(lái)在本地啟動(dòng)主系統(tǒng)就需要5-10分鐘者蠕,可想而知開(kāi)發(fā)人員在這些上面每天又會(huì)浪費(fèi)多少等待時(shí)間。
其次是質(zhì)量缺陷成為一大困擾屡贺。由于系統(tǒng)復(fù)雜蠢棱,模塊之間耦合多,不容易寫(xiě)自動(dòng)化測(cè)試甩栈,在交付壓力的驅(qū)使下開(kāi)發(fā)只好以滿(mǎn)足功能上線(xiàn)為第一目標(biāo)泻仙,所以導(dǎo)致生產(chǎn)環(huán)境經(jīng)常出現(xiàn)bug,有時(shí)甚至是影響到核心功能的嚴(yán)重bug量没,不得不在線(xiàn)回滾玉转,給公司帶來(lái)了損失之外又增添了額外的修復(fù)成本,而且也影響著團(tuán)隊(duì)的上線(xiàn)信心殴蹄。
架構(gòu)的腐化也制約著創(chuàng)新的動(dòng)力究抓,團(tuán)隊(duì)中有些愿意嘗試新技術(shù)、新架構(gòu)的成員袭灯,但一想到如何從紛繁復(fù)雜的代碼中理出個(gè)頭緒刺下,引入新技術(shù)的同時(shí)又不影響現(xiàn)有系統(tǒng)功能,往往就打退堂鼓了稽荧。
同時(shí)橘茉,發(fā)布的風(fēng)險(xiǎn)也在逐漸增大,當(dāng)時(shí)這樣的系統(tǒng)以多實(shí)例方式部署在多個(gè)虛擬機(jī)上,自動(dòng)化部署程度不高畅卓,而且生產(chǎn)環(huán)境和測(cè)試環(huán)境多少會(huì)有些不一致的現(xiàn)象擅腰。再加上前述的各種因素,導(dǎo)致往往在測(cè)試環(huán)境難以發(fā)現(xiàn)性能和安全方面的問(wèn)題翁潘,往往在上線(xiàn)了以后才發(fā)現(xiàn)所發(fā)布功能存在一些問(wèn)題趁冈,只好再手動(dòng)回滾。發(fā)布后還需嚴(yán)密關(guān)注是否發(fā)生異常拜马,久而久之渗勘,導(dǎo)致每一次發(fā)布都成為開(kāi)發(fā)和運(yùn)維人員的噩夢(mèng),用膽戰(zhàn)心驚形容也不為過(guò)一膨。
而且呀邢,運(yùn)維方面,由于系統(tǒng)未進(jìn)行適當(dāng)?shù)牟鸱直鳎瑢?duì)于水平擴(kuò)展也不是那么容易价淌,無(wú)法將系統(tǒng)中的性能瓶頸部分進(jìn)行單獨(dú)擴(kuò)容,就只好將整體系統(tǒng)進(jìn)行擴(kuò)容瞒津,浪費(fèi)資源倒是其次蝉衣,主要是有時(shí)有些含狀態(tài)的任務(wù)或功能無(wú)法直接擴(kuò)容。
幾年后當(dāng)微服務(wù)架構(gòu)及其相關(guān)的持續(xù)交付巷蚪、DevOps病毡、敏捷等實(shí)踐逐步興起時(shí),我意識(shí)到曾經(jīng)遇到過(guò)的問(wèn)題不只是我們才遇到屁柏。而這些思想和方法的出現(xiàn)啦膜,正是為了解決這些問(wèn)題。在我看來(lái)微服務(wù)相關(guān)的實(shí)踐實(shí)施的價(jià)值點(diǎn)主要有:
更簡(jiǎn)單淌喻。如果一件事情太復(fù)雜僧家,目標(biāo)太大,就對(duì)其分解成若干個(gè)小目標(biāo)裸删,分而治之各個(gè)擊破八拱,就會(huì)感覺(jué)容易許多。微服務(wù)正是體現(xiàn)著這樣的思想涯塔,對(duì)系統(tǒng)進(jìn)行適當(dāng)?shù)牟鸱旨〉荆M成一個(gè)個(gè)高內(nèi)聚低耦合的模塊化服務(wù),服務(wù)之間以輕量級(jí)通信進(jìn)行交互匕荸,每個(gè)服務(wù)在獨(dú)立進(jìn)程中運(yùn)行爹谭,可獨(dú)立部署快速發(fā)布。無(wú)形中讓各個(gè)微服務(wù)的復(fù)雜度降低了許多榛搔,寫(xiě)自動(dòng)化測(cè)試也變得相對(duì)容易許多旦棉,讓團(tuán)隊(duì)對(duì)開(kāi)發(fā)質(zhì)量和速度都能有所兼顧齿风。
更可靠药薯。持續(xù)構(gòu)建绑洛、持續(xù)部署等開(kāi)發(fā)流水線(xiàn)的實(shí)踐都強(qiáng)調(diào)盡可能用標(biāo)準(zhǔn)化和自動(dòng)化的方式去完成團(tuán)隊(duì)日常工作中的重復(fù)部分。這不僅僅是為了避免重復(fù)勞動(dòng)童本,也是為了建立更加易于追蹤和控制的系統(tǒng)真屯,提高可靠性,避免因人的手工作業(yè)疏忽所帶來(lái)的問(wèn)題穷娱。
更敏捷绑蔫。敏捷方法論中的核心思想之一是建立快速反饋的通路,這樣團(tuán)隊(duì)才能更快地知道自己是否走在正確的道路上泵额,及時(shí)作出調(diào)整和優(yōu)化配深。看板嫁盲、CI篓叶、自動(dòng)化測(cè)試等實(shí)踐的目的之一都是讓團(tuán)隊(duì)能夠快速而直觀(guān)地得到作業(yè)狀態(tài)和結(jié)果的反饋。小而精的微服務(wù)系統(tǒng)羞秤,也讓各項(xiàng)作業(yè)的執(zhí)行更加快速缸托,從而能夠更快地得到反饋。
當(dāng)然微服務(wù)架構(gòu)也是一把雙刃劍瘾蛋,并不是每個(gè)產(chǎn)品都適合實(shí)施微服務(wù)俐镐,實(shí)施過(guò)程中也避免不了各種陣痛。但只要團(tuán)隊(duì)能夠認(rèn)識(shí)到微服務(wù)實(shí)施的價(jià)值所在哺哼,提前評(píng)估和控制好風(fēng)險(xiǎn)佩抹,在落地過(guò)程中發(fā)展出真正適合自己的實(shí)踐,就能發(fā)揮其作用取董。