去狀態(tài)化
所謂的去狀態(tài)化,就是應(yīng)用程序一開始會(huì)有很多的數(shù)據(jù),比如有些數(shù)據(jù)是保存在內(nèi)存里,像會(huì)話的數(shù)據(jù),有的是保存在本地文件系統(tǒng)、本地庫(kù)里,像照片。去狀態(tài)化做的事情沒有那么難,把這些數(shù)據(jù)外置化就可以了,可以把會(huì)話放在緩存里,可以把用戶數(shù)據(jù)放在數(shù)據(jù)庫(kù)里,可以把照片保存在遠(yuǎn)程的分布式存儲(chǔ)里面。僅僅包括商務(wù)邏輯、算法的應(yīng)用擴(kuò)展起來就非常方便,一變?nèi)?、三變五,可以比較好地分擔(dān)整個(gè)應(yīng)用。其他有狀態(tài)的事情就交給外面的緩存、數(shù)據(jù)庫(kù)和分布式存儲(chǔ)來做。開源軟件和互聯(lián)網(wǎng)軟件發(fā)展到今天,外部的緩存、數(shù)據(jù)庫(kù)和分布式存儲(chǔ)都已經(jīng)有了自己的集群模式,所以把它外置出來并不擔(dān)心丟失。
容器化
無狀態(tài)化以后,就可以進(jìn)行容器化。有人說容器化就是微服務(wù),微服務(wù)就是容器化,其實(shí)不完全。這里我們用Kubernetes進(jìn)行管理,把一個(gè)服務(wù)拆成了四個(gè)服務(wù),服務(wù)A、B、C、D,它們之間互相關(guān)聯(lián)、互相調(diào)動(dòng)。容器化并用Kubernetes管理以后,它的服務(wù)可以自發(fā)現(xiàn)、自修復(fù)。如果這時(shí)候中間的機(jī)器掛了,中間的B、C服務(wù)會(huì)自動(dòng)遷移到另外兩臺(tái)機(jī)器上,重啟以后IP地址可能會(huì)是改變的,那么服務(wù)A、D怎么找到服務(wù)B、C呢?Kubernetes會(huì)自動(dòng)管理,Kubernetes中每個(gè)服務(wù)都有一個(gè)服務(wù)名,A調(diào)用B,B就是一個(gè)服務(wù)名。A不用關(guān)心B的IP是什么,也不用把IP配在配置文件里面,只需要把服務(wù)名配在配置文件。無論B遷移到哪個(gè)機(jī)器,A要訪問B,Kubernetes會(huì)自動(dòng)把服務(wù)名映射為B的IP地址訪問過去。這樣就會(huì)優(yōu)雅地實(shí)現(xiàn)自修復(fù)以及負(fù)載均衡。如果發(fā)現(xiàn)B是瓶頸,原來B只有一個(gè)實(shí)體,現(xiàn)在B有三個(gè)實(shí)體,這三個(gè)實(shí)體還叫B,那么A訪問時(shí)還是訪問B,但是A訪問時(shí)不用關(guān)心訪問的是這三個(gè)B里面的哪一個(gè),Kubernetes會(huì)幫我們選一個(gè)進(jìn)行訪問,這樣就實(shí)現(xiàn)了負(fù)載均衡。
DevOps、可迭代
用這種方式,開發(fā)的整個(gè)流程會(huì)非常的順暢。因?yàn)槿萜鞯溺R像是不可變的,所以鏡像把OS、業(yè)務(wù)代碼、運(yùn)行環(huán)境、程序庫(kù)、目錄結(jié)構(gòu)都包含在內(nèi),好處是鏡像無論放在測(cè)試、聯(lián)調(diào)、生產(chǎn)環(huán)境里面,都能保證環(huán)境的一致性。其次,比如從1.0版本升級(jí)到1.1版本,發(fā)現(xiàn)1.1版本有點(diǎn)不對(duì),要回滾到1.0版本時(shí),也可以確認(rèn)它就是當(dāng)時(shí)的1.0版本。如果是自己手工調(diào)整的話,需要特別小心,過了一段時(shí)間可能會(huì)忘了自己做了哪些微調(diào)整從1.0版本升級(jí)到1.1版本。當(dāng)然其中會(huì)有不一樣的地方,比如說環(huán)境的配置可能需要通過環(huán)境變量或者更穩(wěn)健的方式來注入測(cè)試環(huán)境、聯(lián)調(diào)環(huán)境、生產(chǎn)環(huán)境。中間一個(gè)優(yōu)雅的事情是,比如原來做一個(gè)程序往往會(huì)有三份配置文件,打包時(shí)也會(huì)把不同的配置文件放進(jìn)去。如果以Kubernetes自發(fā)現(xiàn)的方式,把B的名字放到配置文件里就可以了。本地起一個(gè)開發(fā)環(huán)境,只要把B的名字設(shè)為127.0.0.1,在本地就可以相互訪問。到測(cè)試環(huán)境,A訪問B,配置文件是不用變的,訪問的B就是測(cè)試環(huán)境里面的B。到生產(chǎn)環(huán)境里面一樣,配置文件也不用變更,不用每次保存多份配置文件,開發(fā)流程也會(huì)非常順暢。
微服務(wù)架構(gòu)
這是最初電商的架構(gòu),本來是單體的架構(gòu),后來拆分成很多很多的子服務(wù),包括前端的、業(yè)務(wù)系統(tǒng)、基礎(chǔ)服務(wù)系統(tǒng)的,它們之間相互引用,利用Kubernetes相互發(fā)現(xiàn)。如果沒有自發(fā)現(xiàn)的系統(tǒng),維護(hù)起來還是比較麻煩的。這其實(shí)是考拉海購(gòu)抽象化的模型,整個(gè)架構(gòu)比這個(gè)要復(fù)雜。巨大的優(yōu)點(diǎn)是,比如“雙十一”來了,進(jìn)行壓測(cè)可以發(fā)現(xiàn)里面的瓶頸點(diǎn),對(duì)瓶頸點(diǎn)可以進(jìn)行彈性伸縮,對(duì)于非瓶頸點(diǎn)伸縮就相對(duì)小一點(diǎn)。大家不會(huì)在“雙十一”那天瘋狂的進(jìn)行用戶注冊(cè),但是下訂單壓力就比較大了。
從私有云到公有云
接下來,我們從私有云開始邁向公有云,開始對(duì)外進(jìn)行服務(wù)。這還是有一些挑戰(zhàn)的:
第一,容器的安全問題。如果我們?cè)试S用戶共享主機(jī),大家進(jìn)容器是能看到這個(gè)機(jī)器上所有的CPU和MEMORY的,而不是僅僅只能看到兩盒。如果是一個(gè)黑客,完全可以把旁邊的容器黑掉,所以安全問題是一個(gè)非常關(guān)鍵的問題,安全問題一個(gè)解決思路就是KVM。