本篇文章給大家分享的是有關(guān)XXOps持續(xù)發(fā)布和部署是怎樣的,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。
成都創(chuàng)新互聯(lián)專注于涼州企業(yè)網(wǎng)站建設(shè),自適應(yīng)網(wǎng)站建設(shè),購(gòu)物商城網(wǎng)站建設(shè)。涼州網(wǎng)站建設(shè)公司,為涼州等地區(qū)提供建站服務(wù)。全流程按需求定制制作,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,成都創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)
首先,根本原因還是為了提升代碼的交付效率(好像是句正確的廢話),從技術(shù)上,主要原因還是因?yàn)閺膯误w工程拆分成了服務(wù)化的應(yīng)用。
單體工程的歷史原因也很好理解,在創(chuàng)業(yè)初期,技術(shù)人員有限的情況下,為了快速找到正確的業(yè)務(wù)發(fā)展方向,技術(shù)人員必定會(huì)把全部的精力放到業(yè)務(wù)需求的實(shí)現(xiàn)上,這時(shí)技術(shù)或架構(gòu)層面的事情是次要的,且在創(chuàng)業(yè)早期,用戶量和業(yè)務(wù)模型也沒有這么復(fù)雜,也沒有必要搞復(fù)雜的架構(gòu)出來(lái),LNMP足矣,從我們的實(shí)踐來(lái)看這樣的技術(shù)選擇是無(wú)比正確的。
但是,隨著業(yè)務(wù)量和業(yè)務(wù)復(fù)雜度的增加(如電商的用戶、商家、店鋪、商品、交易和支付體系),業(yè)務(wù)服務(wù)質(zhì)量要求變得越來(lái)越苛刻(低時(shí)延、高可用),需求的交付周期卻要求越來(lái)越短(腦補(bǔ)下產(chǎn)品經(jīng)理站在程序員身后的場(chǎng)景),同時(shí)工程師數(shù)量也已經(jīng)到了幾百人規(guī)模,這時(shí)單體工程就暴露出很多問題,比如代碼邏輯耦合嚴(yán)重、底層公共方法不敢動(dòng),代碼量巨大已經(jīng)沒有任何一個(gè)人能對(duì)整個(gè)工程代碼熟悉,上百個(gè)工程師同時(shí)向同一個(gè)工程提交代碼,代碼維護(hù)耗費(fèi)的精力非常大。最終一張圖看下當(dāng)時(shí)的場(chǎng)景:
所以,解決方案向著Java服務(wù)化的方向演進(jìn)(具體原因就不解釋了),簡(jiǎn)單示意如下:
單體應(yīng)用拆分成服務(wù)化應(yīng)用后,應(yīng)用的情況就變成了許許多多、大大小小的應(yīng)用模式,下圖示意:
這個(gè)時(shí)候遇到的最棘手的問題,就是發(fā)布問題,這么多的應(yīng)用對(duì)應(yīng)的代碼都是不同的,且Java服務(wù)化之后涉及編譯構(gòu)建、服務(wù)優(yōu)雅上下線等一系列等問題,環(huán)節(jié)也多了很多(后面會(huì)看到),這些環(huán)節(jié)單純的靠手工執(zhí)行腳本和人為的串聯(lián)已經(jīng)成為不可能的事情,這個(gè)直接影響到開發(fā)、測(cè)試和運(yùn)維整個(gè)研發(fā)體系的效率,所以是擺在面前必須要首要解決的。
好的,接下來(lái)我們就開始做發(fā)布系統(tǒng)了,提煉一下,發(fā)布做的事情就是,將提交后的應(yīng)用代碼,進(jìn)行編譯打包,然后發(fā)布到應(yīng)用對(duì)應(yīng)IP主機(jī)的指定目錄下,并且做到應(yīng)用服務(wù)的優(yōu)雅上下線(或者叫做優(yōu)雅啟停)。
理解起來(lái)不復(fù)雜,其實(shí)我們可以抽象出發(fā)布的最重要的三步,我們也是始終圍繞著這三步在不斷的完善,如下:
下面就分階段詳細(xì)描述三個(gè)主要環(huán)節(jié):
代碼管理工具是Gitlab,代碼提交過(guò)程中最重要的就是對(duì)于分支合并的管理(這里又涉及到標(biāo)準(zhǔn)規(guī)范的制定),我們的策略示意大致如下:
描述如下:
1、master分支,跟線上應(yīng)用代碼保持同步,也就是說(shuō)隨時(shí)可以發(fā)布到線上進(jìn)行部署運(yùn)行。
2、開發(fā)分支,通常以feature/defect來(lái)表示,比如開發(fā)一個(gè)新的需求,就會(huì)以當(dāng)前master為基線,拉一個(gè)feature分支出來(lái)進(jìn)行開發(fā),同一個(gè)應(yīng)用可以同時(shí)存在多個(gè)feature分支并行開發(fā)。
3、發(fā)布分支,以release表示,在發(fā)布時(shí)會(huì)將所有提交集成的代碼commit合并,形成release_環(huán)境_時(shí)間戳為分支名稱,比如release_dev_01_29_20_52_10 就代表該分支是在1月29號(hào)20:52:10在dev環(huán)境發(fā)布時(shí)創(chuàng)建的臨時(shí)發(fā)布分支。
4、從預(yù)發(fā)進(jìn)入線上時(shí),會(huì)以當(dāng)前預(yù)發(fā)環(huán)境的發(fā)布分支release_pre_xxxx為基線創(chuàng)建一個(gè)release_online分支,作為線上的發(fā)布分支,線上發(fā)布結(jié)束后會(huì)把release_online分支合并到master中,這也就保證了發(fā)布到線上的代碼最終一定會(huì)跟master的代碼保持一致。
上面講完了代碼提交環(huán)節(jié),下一個(gè)環(huán)節(jié)就是要構(gòu)建了,以Java為例,構(gòu)建我們用到了兩個(gè)工具,Docker和Maven。Docker主要用來(lái)提供一個(gè)干凈獨(dú)立的編譯環(huán)境,Maven作為我們的依賴管理和打包工具。整個(gè)構(gòu)建過(guò)程如下:
以Java為例,簡(jiǎn)單描述如下:
1、首先準(zhǔn)備好JDK的編譯鏡像,這個(gè)鏡像環(huán)境與線上環(huán)境保持一致,當(dāng)有新的構(gòu)建任務(wù)進(jìn)來(lái)時(shí),就創(chuàng)建一個(gè)對(duì)應(yīng)的Docker實(shí)例進(jìn)行代碼編譯;
2、構(gòu)建任務(wù)會(huì)根據(jù)應(yīng)用配置管理中的Git地址,將代碼clone下來(lái)放到指定的編譯目錄,Docker實(shí)例啟動(dòng)后,將編譯目錄掛在到Docker實(shí)例中;
3、對(duì)于Java應(yīng)用,在這個(gè)Docker實(shí)例環(huán)境中,就可以執(zhí)行mvn package命令打包了,最終會(huì)生成一個(gè)可發(fā)布xxx.war的軟件包;
4、同樣的,對(duì)于C++,Go、NodeJs,也會(huì)準(zhǔn)備好類似的編譯鏡像,不同的是打包時(shí),對(duì)于C++是cmake&make,Go就是go install等等,最終也會(huì)生成一個(gè)可發(fā)布的軟件包;
5、構(gòu)建完成后,Docker實(shí)例銷毀;
這里面Docker發(fā)揮了一個(gè)很大的作用,就是提供了干凈的,互不干擾的編譯環(huán)境,且對(duì)于并發(fā)打包的情況,Docker快速創(chuàng)建多個(gè)并行的實(shí)例出來(lái)提供編譯環(huán)境,使用完銷毀,這個(gè)效率上的優(yōu)勢(shì)也是非常大的。
6、關(guān)于配置管理,當(dāng)時(shí)設(shè)計(jì)時(shí)考慮比較簡(jiǎn)單,我們的做法是同時(shí)做三個(gè)配置文件出來(lái),dev_pom.xml,pre_pom.xml,online_pom.xml,分別對(duì)應(yīng)開發(fā)、預(yù)發(fā)和線上三個(gè)不同的環(huán)境,根據(jù)發(fā)布的環(huán)境不同,將不同的配置文件替換上去。這樣做其實(shí)可擴(kuò)展性不夠,對(duì)于多機(jī)房、多分組的情況會(huì)有更多的配置文件創(chuàng)建出來(lái),且對(duì)于有敏感信息的配置項(xiàng)保密也不夠(不過(guò)這些配置都已經(jīng)加密挪到中間件的配置中心了),更好的辦法可以考慮采用阿里早已開源的auto-config方案,這里就不細(xì)講了。
以上,代碼提交和編譯構(gòu)建完成后,就該進(jìn)入發(fā)布到線上的部署環(huán)節(jié)了,也就是將代碼發(fā)布到應(yīng)用對(duì)應(yīng)IP主機(jī)的指定目錄下,并且能夠優(yōu)雅的上下線應(yīng)用服務(wù),貌似很簡(jiǎn)單,但是,看下圖:
這個(gè)過(guò)程的環(huán)節(jié)還是比較多的,這些環(huán)節(jié)內(nèi)部又會(huì)有很多的細(xì)節(jié),所以整個(gè)部署環(huán)節(jié)是很復(fù)雜的,下面將整體思路介紹一下:
0、從CMDB中,拿到應(yīng)用-主機(jī)IP對(duì)應(yīng)關(guān)系,然后再?gòu)?開始做,后面的過(guò)程可以是針對(duì)單臺(tái)機(jī)器做,也可以是分批或分組多臺(tái)機(jī)器同時(shí)做。(從第0步開始,原因就是我們上一篇文章里面說(shuō)的CMDB和應(yīng)用配置管理的基礎(chǔ)要先打好,這個(gè)基礎(chǔ)沒有,下面的環(huán)節(jié)就無(wú)法順暢地執(zhí)行);
1、檢查每臺(tái)機(jī)器上的服務(wù)是否正常運(yùn)行的,如果是正常服務(wù)的,說(shuō)明可以發(fā)布,但是服務(wù)本身異常,就要記錄或跳過(guò)了;
2、下載war包到指定目錄(應(yīng)用的目錄信息,應(yīng)用配置管理又發(fā)揮作用了);
3、將監(jiān)控關(guān)閉,以免服務(wù)下線和停止產(chǎn)生誤告警;
4、優(yōu)雅下線,包含RPC服務(wù)從LB下線或Web服務(wù)從Nginx下線(如果不提供http服務(wù)就不涉及),下線動(dòng)作均通過(guò)API接口調(diào)用方式實(shí)現(xiàn);
5、下線后自動(dòng)檢測(cè)無(wú)新的流量進(jìn)入,停止應(yīng)用,發(fā)布代碼,然后啟動(dòng)應(yīng)用(這時(shí)應(yīng)用配置管理里面,啟停命令等等就又發(fā)揮作用了);
6、優(yōu)雅上線,進(jìn)行健康監(jiān)測(cè),檢查進(jìn)程和應(yīng)用狀態(tài)是否正常,如果全部監(jiān)測(cè)通過(guò),開始上線服務(wù),開啟監(jiān)控;
7、分批發(fā)布,這里簡(jiǎn)單提一下,假設(shè)我們一個(gè)應(yīng)用有100臺(tái)主機(jī),這個(gè)時(shí)候做發(fā)布不可能全部一把停掉,這樣服務(wù)會(huì)中斷,但是也不能一臺(tái)臺(tái)的做,這樣效率又太低,所以我們可以折中分批發(fā),比如可以分5批,每批20臺(tái),也可以分10批,每批10臺(tái),這樣既可以保證在線升級(jí),也可以保證效率能夠跟的上。當(dāng)然復(fù)雜一點(diǎn),還有分組分批,或者按步長(zhǎng)分批,第一批5臺(tái),第二批10臺(tái),后面每批20臺(tái)等等。示例如下:
整個(gè)過(guò)程下來(lái)我們可以看到:
1、基于場(chǎng)景入手,將業(yè)務(wù)流程梳理細(xì)致,做到細(xì)分環(huán)節(jié),每步自動(dòng)化,流程串聯(lián)
2、CMDB和應(yīng)用配置管理的內(nèi)容,在這一部分無(wú)時(shí)無(wú)處不在發(fā)揮著基礎(chǔ)的作用
以上就是XXOps持續(xù)發(fā)布和部署是怎樣的,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
當(dāng)前標(biāo)題:XXOps持續(xù)發(fā)布和部署是怎樣的
本文URL:http://jinyejixie.com/article8/jjeeip.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號(hào)、網(wǎng)站內(nèi)鏈、用戶體驗(yàn)、小程序開發(fā)、虛擬主機(jī)、網(wǎng)站設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)