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