(長(zhǎng)江大學(xué) 湖北 荊州 434023)
開(kāi)發(fā)經(jīng)驗(yàn)的積累以及新技術(shù)的出現(xiàn),使得微服務(wù)發(fā)展的十分迅速。它有異構(gòu)特性,不局限于特定技術(shù),它的實(shí)現(xiàn)細(xì)節(jié)變化的速度比它的理念要快得多。微服務(wù),簡(jiǎn)單的來(lái)說(shuō),麻雀雖小,五臟俱全,它一般不是單獨(dú)的服務(wù),通常是多個(gè)服務(wù)相互協(xié)調(diào)工作。然而服務(wù)有一定的邊界,根據(jù)領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)來(lái)說(shuō),領(lǐng)域的邊界,也就是服務(wù)的邊界,和服務(wù)的業(yè)務(wù)相關(guān)聯(lián)。每個(gè)服務(wù)只專注于領(lǐng)域之內(nèi)業(yè)務(wù),這就使得代碼避免過(guò)于臃腫,重構(gòu)也十分方便。但是也因?yàn)榉?wù)的數(shù)量會(huì)很多,就考慮持續(xù)集成和持續(xù)交付的問(wèn)題,尤為重要。
持續(xù)集成不是新的概念,但是它的基本用法因地制宜,需要研究。微服務(wù)的版本控制如今有很多方案,但有一定的相同點(diǎn)。當(dāng)有代碼提交時(shí),需要讓新提交的代碼與代碼庫(kù)的代碼進(jìn)行合并,共享代碼庫(kù)保持同步。接著會(huì)檢測(cè)到已提交的代碼,驗(yàn)證代碼是否能編譯,測(cè)試能否通過(guò)。之后生成構(gòu)建物,不同的打包方式統(tǒng)稱為構(gòu)建物,它是用于部署的。為了可以減少不必要的重復(fù)事情,還能確保,線上的和測(cè)試通過(guò)的構(gòu)建物是同樣的一個(gè)。通常把構(gòu)建物存在倉(cāng)庫(kù)中來(lái)實(shí)現(xiàn),大家共享,同時(shí)能看見(jiàn)。而我們常說(shuō)的持續(xù)交付,它其實(shí)是持續(xù)集成的后續(xù)發(fā)展,需要將整個(gè)流程自動(dòng)化,從構(gòu)建測(cè)試一直到部署到生產(chǎn)環(huán)境,呈現(xiàn)給客戶使用。所以想要完成持續(xù)交付流程,其核心就是構(gòu)建流水線,下面開(kāi)始簡(jiǎn)述構(gòu)建流水線。
構(gòu)建流水線是把代碼從編寫(xiě)完成,上傳到版本管理的代碼庫(kù)后,構(gòu)建、部署、測(cè)試到發(fā)布的一個(gè)流程,并且要實(shí)現(xiàn)自動(dòng)化。它的實(shí)現(xiàn)的效果就是,程序的源代碼、配置(包含環(huán)境和數(shù)據(jù)源等)發(fā)生變化,便會(huì)出發(fā)構(gòu)建流水線的過(guò)程。流水線的第一步就是編譯得到二進(jìn)制文件,有些情況需要得到安裝包,后續(xù)步驟大致上就是在此基礎(chǔ)上做相關(guān)的測(cè)試,確保程序在不同的環(huán)境和配置的可用性,這是非常重要的。當(dāng)程序通過(guò)了測(cè)試,它就可以發(fā)布了。需要滿足這樣的過(guò)程,就要滿足兩點(diǎn)要求,即自動(dòng)化和高頻交付。不滿足自動(dòng)化,沒(méi)法高效,不能重復(fù)利用。程序和配置以及發(fā)布不同,這樣的結(jié)果可能都會(huì)有所不同。而且手工操作容易出錯(cuò),還不容易定位錯(cuò)在了哪里,這樣這個(gè)流程就不再高效失去了使用價(jià)值。另外,需要做到高頻發(fā)布,即發(fā)布周期很短,細(xì)小的差異都是一種版本升級(jí),這樣做的版本控制很容易定位錯(cuò)誤,回退版本。另外也很容易即使反饋給使用者,滿足客戶的需求,及時(shí)改正。那么,如何去實(shí)現(xiàn)一個(gè)構(gòu)建流水線呢?為系統(tǒng)創(chuàng)建一個(gè)自動(dòng)化的流水線,不是一蹴而就的,應(yīng)該使用增量方式來(lái)實(shí)現(xiàn)部署流水線。
(一)建立流程圖
第一步就是畫(huà)出從提交到發(fā)布整個(gè)過(guò)程的流程圖,一且有了流程圖,就可以用持續(xù)集成和發(fā)布管理工具對(duì)流程建模了。每當(dāng)有人提交代碼,就應(yīng)該觸發(fā)提交階段,合并代碼。接著就是用最新的二進(jìn)制包進(jìn)入驗(yàn)收測(cè)試。同時(shí)測(cè)試環(huán)境和生產(chǎn)環(huán)境應(yīng)該能夠手動(dòng)操作選擇具體的版本部署對(duì)應(yīng)的二進(jìn)制包,這應(yīng)該需要授權(quán),流水線系統(tǒng)管理角色能夠承擔(dān)這個(gè)責(zé)任。
(二)自動(dòng)化構(gòu)建和部署過(guò)程
持續(xù)集成服務(wù)器監(jiān)視版本控制系統(tǒng),發(fā)現(xiàn)有新提交的代碼時(shí),更新源代碼,運(yùn)行自動(dòng)化構(gòu)建流程,并將生成的二進(jìn)制包放在文件系統(tǒng),使整個(gè)團(tuán)隊(duì)都能通過(guò)持續(xù)集成服務(wù)器獲取。持續(xù)構(gòu)建流程建立并運(yùn)行起來(lái)了,接下來(lái)就是要實(shí)現(xiàn)部署的自動(dòng)化。首先,要找到能夠部署應(yīng)用程序的一臺(tái)機(jī)器。如果項(xiàng)目復(fù)雜龐大,可能就需要找?guī)着_(tái)專用機(jī)器了。這個(gè)部署環(huán)節(jié)也需要自動(dòng)化流程,雖然此時(shí)還只是測(cè)試環(huán)境。部署包含為程序打包,如果程序的不同模塊需要部署在不同的機(jī)器上,就得分別打包;安裝和配置過(guò)程實(shí)現(xiàn)自動(dòng)化;寫(xiě)自動(dòng)化部署測(cè)試腳本驗(yàn)證部署是否成功。部署流程是自動(dòng)化驗(yàn)收測(cè)試的前提條件.一且將部署流程自動(dòng)化后,接下來(lái)就要一鍵式部署了。配置一下持續(xù)集成服務(wù)器,做到能自由挑選應(yīng)用版本,并做到通過(guò)手動(dòng)操作來(lái)觸發(fā)一個(gè)流程,即獲取作為構(gòu)建輸出的二進(jìn)制文件,運(yùn)行部署腳本,再運(yùn)行部署測(cè)試。在這個(gè)過(guò)程中,每次只構(gòu)建一個(gè)二進(jìn)制文件,在不同環(huán)境使用不同的配置文件即可,只需要將配置文件從程序中剝離,單獨(dú)修改配置即可。測(cè)試環(huán)境部署和生產(chǎn)環(huán)境部署的流程相同,不同的地方也只能是環(huán)境配置信息不同。
(三)自動(dòng)化單元測(cè)試和驗(yàn)收測(cè)試
單元測(cè)試不和數(shù)據(jù)庫(kù)和其他文件系統(tǒng)交互,這個(gè)過(guò)程很快,能夠快速直觀找到錯(cuò)誤。所以寫(xiě)好功能就應(yīng)該進(jìn)行單元測(cè)試,改進(jìn)程序。隨著程序不斷變得復(fù)雜,單元測(cè)試也越來(lái)越多。測(cè)試時(shí)間過(guò)長(zhǎng),就應(yīng)該分開(kāi),并行測(cè)試。
驗(yàn)收測(cè)試分為功能測(cè)試和非功能測(cè)試。非功能需求測(cè)試一般在項(xiàng)目初期,這樣做可以獲得一些數(shù)據(jù),通過(guò)數(shù)據(jù)分析,來(lái)驗(yàn)證可行性,從而進(jìn)行合理的調(diào)整。驗(yàn)收測(cè)試和性能測(cè)試同一個(gè)階段里接連運(yùn)行。當(dāng)然可以將它們分開(kāi)確定哪里出錯(cuò)。自動(dòng)化驗(yàn)收測(cè)試追查隨機(jī)問(wèn)題和難以重現(xiàn)的問(wèn)題,如競(jìng)爭(zhēng)條件、死鎖,以及資源爭(zhēng)奪,這些問(wèn)題在程序發(fā)布之后就很隱蔽了。當(dāng)然,在部署流水錢(qián)中,提交測(cè)試階段和驗(yàn)收階段需要運(yùn)行哪些測(cè)試取決于你的測(cè)試策略。在項(xiàng)目初期,至少有每種測(cè)試的一到兩個(gè)測(cè)試可以自動(dòng)化運(yùn)行,并把它們放到部署流水線中。初步框架就建好了,隨著項(xiàng)目的進(jìn)展,就比較容易新增測(cè)試。
(四)持續(xù)改進(jìn)構(gòu)建流水線
流水線有兩個(gè)常見(jiàn)的外延:組件和分支。大型應(yīng)用程序由多個(gè)組件拼裝而成,每個(gè)組件都應(yīng)該有一個(gè)對(duì)應(yīng)的小型流水線,再用一個(gè)流水線把所有組件拼裝在一起,并運(yùn)行整個(gè)驗(yàn)收測(cè)試集,再部署到測(cè)試環(huán)境、試運(yùn)行環(huán)境和生產(chǎn)環(huán)境中。實(shí)現(xiàn)了構(gòu)建流水線后,需要注意三個(gè)重點(diǎn)。第一,不需要一次實(shí)現(xiàn)整個(gè)流水線,應(yīng)該增量實(shí)現(xiàn)。流程中有手工操作部分,流水線中為它創(chuàng)建一個(gè)占位符。當(dāng)開(kāi)始和結(jié)束手工任務(wù)時(shí),確保部署流水線記錄下這兩個(gè)時(shí)間點(diǎn),可以計(jì)算每個(gè)手工過(guò)程消耗了多少時(shí)間,并估計(jì)會(huì)在什么程度上成為流程中的瓶頸。第二,構(gòu)建流水線是最重要的統(tǒng)計(jì)數(shù)據(jù)來(lái)源。這個(gè)過(guò)程需要記錄各個(gè)階段的修改內(nèi)容,以及修改后的每次的運(yùn)行時(shí)間。之后,可以使用這些數(shù)據(jù)計(jì)算從提交開(kāi)始到將其部署到生產(chǎn)環(huán)境的周期時(shí)間,以及花在每個(gè)階段上的時(shí)間。分析這些時(shí)間段,可以找到耗時(shí)較長(zhǎng)的階段和修改細(xì)節(jié),去優(yōu)化,縮短時(shí)間,從而減少整個(gè)流程所耗時(shí)間。最后,構(gòu)建流水線應(yīng)該隨著系統(tǒng)不斷迭代而改進(jìn)交付流程,不斷變化,持續(xù)改善和重構(gòu)。
微服務(wù)十分火熱,傳統(tǒng)項(xiàng)目也在向微服務(wù)轉(zhuǎn)型,許多傳統(tǒng)整體架構(gòu)也開(kāi)始拆分成一系列的微服務(wù)。這個(gè)過(guò)程中,持續(xù)交付是其中重要一環(huán),不然大量的服務(wù),頻繁提交很難維護(hù)。要契合敏捷開(kāi)發(fā),快速迭代的理念。構(gòu)建持續(xù)交付流水線是非常有必要的,持續(xù)交付流水線的增量實(shí)現(xiàn)方式,也需要在后續(xù)的學(xué)習(xí)中不斷的探索和研究。