理解什么是云原生和云原生應(yīng)用的十二要素
云原生這個(gè)詞相信大家都不陌生,那如果要問(wèn)你,到底什么是云原生,該怎么回答呢?
云原生
云原生計(jì)算基金會(huì) CNCF 在他們的官網(wǎng)上給出的解釋是這樣的。
云原生技術(shù)有利于各組織在公有云、私有云和混合云等新型動(dòng)態(tài)環(huán)境中構(gòu)建和運(yùn)行可彈性擴(kuò)展的應(yīng)用。云原生的代表技術(shù)包括容器、服務(wù)網(wǎng)格、微服務(wù)、不可變基礎(chǔ)設(shè)施和聲明式 API。
這些技術(shù)能夠構(gòu)建容錯(cuò)性好、易于管理和便于觀察的松耦合系統(tǒng)。結(jié)合可靠的自動(dòng)化手段,云原生技術(shù)使工程師能夠輕松地對(duì)系統(tǒng)作出頻繁和可觀測(cè)的重大變更。
其實(shí)上面的定義講了這么多,對(duì)應(yīng)什么是云原生還是很模糊的,不過(guò)從上面的定義中我們可以得到幾個(gè)關(guān)鍵的信息
- 云原生應(yīng)用是需要部署在云環(huán)境中的,但是反過(guò)來(lái)部署在云環(huán)境中的應(yīng)用并不一定是云原生應(yīng)用。
- 云原生應(yīng)用具備一定的可擴(kuò)展性、容錯(cuò)性和可觀察性;
- 云原生不是一種技術(shù)或者框架,而是一種思想;
這個(gè)也比較好理解,早期的時(shí)候如果一個(gè)公司想要上線應(yīng)用或者服務(wù),需要自己購(gòu)買機(jī)器部署機(jī)房,然后才能在機(jī)房的服務(wù)器中部署自己的應(yīng)用,這種肯定不是云原生,畢竟連云都還沒(méi)有上。
后面漸漸的很多云廠商起來(lái)了,提供了云環(huán)境,這個(gè)時(shí)候大家如果要部署應(yīng)用就不再需要自建機(jī)房了,只需要在云廠商那里購(gòu)買對(duì)應(yīng)數(shù)據(jù)中心的服務(wù)器就行,就可以部署應(yīng)用了,但是到這里只能說(shuō)我們的應(yīng)用上云了,我們的應(yīng)用還并不是云原生應(yīng)用。
這也是我們上面提到的應(yīng)用部署到了云環(huán)境上面,并不是代表就是云原生應(yīng)用的,因?yàn)檫@個(gè)時(shí)候我們的應(yīng)用并沒(méi)有充分利用云廠商的能力,同時(shí)也不具備擴(kuò)展性、容錯(cuò)性和可觀察性。
十二要素應(yīng)用
前面介紹了什么是云原生,現(xiàn)在說(shuō)下什么是十二要素應(yīng)用。十二要素應(yīng)用的提出是知名的 PasS 平臺(tái) Heroku 的 CTO Adam Wiggins 提出的,原本說(shuō)的是云上運(yùn)行的應(yīng)用需要遵守的 12 條最佳實(shí)踐,不過(guò)它也同樣適用于云原生應(yīng)用。
1、基準(zhǔn)代碼
基準(zhǔn)代碼說(shuō)的是在我們?nèi)粘i_(kāi)發(fā)和部署的時(shí)候,可能會(huì)有很多個(gè)環(huán)境,比如開(kāi)發(fā),測(cè)試,線上等,我們需要是同一份基準(zhǔn)代碼。不過(guò)這里主要強(qiáng)調(diào)的還是線上,因?yàn)槲覀冊(cè)圃鷳?yīng)用的部署是隨時(shí)隨地都可以動(dòng)態(tài)擴(kuò)展的,這就要保證我們線上的環(huán)境都是基于一份基準(zhǔn)代碼來(lái)進(jìn)行部署,實(shí)現(xiàn)一套代碼多份部署。
這點(diǎn)也很好理解,跟我們的分布式架構(gòu)一樣,也是同一份代碼部署多個(gè)實(shí)例。
2、聲明式依賴
聲明式依賴說(shuō)的是我們要顯示聲明依賴關(guān)系,現(xiàn)在有很多依賴管理工具,比如說(shuō)我們的 Java 項(xiàng)目就會(huì)有 maven 和 gradle,其他語(yǔ)言的項(xiàng)目也會(huì)有其他的包管理工具。
除了我們開(kāi)發(fā)中需要的類庫(kù)的依賴需要顯示之外,如果還需要依賴系統(tǒng)級(jí)別的工具或者庫(kù),我們也需要進(jìn)行聲明式的依賴,不能隱式依賴,這是因?yàn)樵谠圃沫h(huán)境下,我們都是基于容器來(lái)部署應(yīng)用的,如果不顯示的將這些依賴聲明出來(lái),我們是不能創(chuàng)建出一模一樣的容器鏡像,這可能會(huì)導(dǎo)致服務(wù)不可用。
3、配置管理
一個(gè)應(yīng)用如果想要正常的啟動(dòng),除了代碼沒(méi)問(wèn)題之外還要有正確的配置才行,對(duì)于云原生應(yīng)用來(lái)說(shuō)也是一樣的。我們要做到不同的環(huán)境對(duì)于不同的配置,如果環(huán)境是一樣的,配置也需要是一樣的。并且要求我們的配置必須是和代碼分開(kāi)的,這也是很好理解的,畢竟我們一份應(yīng)用代碼要多環(huán)境部署,如果配置一樣那是沒(méi)有辦法部署的。
對(duì)于配置的管理可以用一些中間件,比如 Diamond 或者其他的一些配置中心來(lái)管理,配置中心可以實(shí)現(xiàn)配置的實(shí)時(shí)變更和推送,很方便我們進(jìn)行管理和變更。
4、后端服務(wù)
這里的后端服務(wù)更多說(shuō)的是我們應(yīng)用依賴的一些下游服務(wù)、組件服務(wù)、中間件服務(wù),比如消息隊(duì)列、數(shù)據(jù)庫(kù)、緩存、調(diào)度平臺(tái)等。云原生應(yīng)用要求我們把這些后端服務(wù)都要當(dāng)成資源來(lái)調(diào)用,并且這些資源也要符合云原生應(yīng)用的規(guī)范,也就是能隨時(shí)動(dòng)態(tài)擴(kuò)展。
5、構(gòu)建、發(fā)布、運(yùn)行
云原生應(yīng)用要求我們嚴(yán)格將應(yīng)用的構(gòu)建、發(fā)布和運(yùn)行進(jìn)行隔離。應(yīng)用的這幾個(gè)過(guò)程是每次需求迭代過(guò)后上線的必經(jīng)過(guò)程,并且這幾個(gè)步驟是按照這個(gè)順序進(jìn)行的,也就是說(shuō)不存在還沒(méi)構(gòu)建就進(jìn)行發(fā)布,這個(gè)很好理解。對(duì)于我們 Java 應(yīng)用來(lái)說(shuō),構(gòu)建就是將源代碼進(jìn)行編譯和打包,在構(gòu)建階段如果不通過(guò)是不會(huì)進(jìn)行下一步的。
應(yīng)用構(gòu)建的時(shí)候如果缺少依賴或者有編譯錯(cuò)誤都會(huì)終止構(gòu)建;發(fā)布則是將我們編譯好的 Jar 包或者其他形式和配置文件一起進(jìn)行部署到指定環(huán)境的容器中;運(yùn)行則是將需要發(fā)布的內(nèi)容進(jìn)行啟動(dòng),這個(gè)時(shí)候如果我們的配置有問(wèn)題有可能會(huì)導(dǎo)致應(yīng)用啟動(dòng)不了。
6、進(jìn)程
云原生應(yīng)用要求我們的應(yīng)用是無(wú)狀態(tài)的,這個(gè)也很好理解,畢竟云原生是隨時(shí)可擴(kuò)展的,那就必須要求我們的應(yīng)用是無(wú)狀態(tài)的,這就要求我們?cè)陂_(kāi)發(fā)的時(shí)候就要注意不要在代碼中使用一些需要狀態(tài)的邏輯。比如定時(shí)任務(wù) scheduled 這種,會(huì)導(dǎo)致每個(gè)實(shí)例都會(huì)定時(shí)運(yùn)行,可能會(huì)產(chǎn)生問(wèn)題,可以采用類似于 XXL-JOB 這種分布式調(diào)度平臺(tái)。
7、端口綁定
應(yīng)用通過(guò)綁定端口來(lái)提供服務(wù),這一點(diǎn)可能有些小伙伴不理解,因?yàn)楝F(xiàn)在大部分情況下我們已經(jīng)是這樣做的了,之所以提出這一點(diǎn)是為了避免在應(yīng)用中使用進(jìn)程通信。
8、并發(fā)
要求在高并發(fā)的時(shí)候支持通過(guò)進(jìn)程擴(kuò)展,也就是要求我們的應(yīng)用是無(wú)狀態(tài),能通過(guò)更多的進(jìn)程部署來(lái)實(shí)現(xiàn)擴(kuò)展。這一點(diǎn)也很好理解,跟我們前面提到的無(wú)狀態(tài)也是有關(guān)聯(lián)的。
9、易處理
所謂易處理說(shuō)的是我們的云原生應(yīng)用應(yīng)該具備快速啟動(dòng)和優(yōu)雅終止的能力,因?yàn)榈脑圃h(huán)境要求具有彈性擴(kuò)容的能力,那就需要我們的應(yīng)用能夠快速的啟動(dòng)和結(jié)束。
快速啟動(dòng)可以讓我們的應(yīng)用更快的提供服務(wù),更快的滿足彈性伸縮的要求,而優(yōu)雅的終止也是為了避免在應(yīng)用關(guān)閉的時(shí)候還存在任務(wù)或者流量訪問(wèn)。
10、開(kāi)發(fā)環(huán)境與線上環(huán)境等價(jià)
此外我們需要盡量的保持開(kāi)發(fā)環(huán)境、預(yù)發(fā)環(huán)境以及線上云原生環(huán)境相同,當(dāng)然這里的相同只是是盡可能的保持相同,同樣的環(huán)境能保證我們實(shí)現(xiàn)的功能不會(huì)因?yàn)榄h(huán)境問(wèn)題而出現(xiàn)不可用的情況。但是要知道因?yàn)橐恍┵Y源的問(wèn)題,開(kāi)發(fā)環(huán)境、預(yù)發(fā)環(huán)境跟線上環(huán)境是不會(huì)完全一樣的。
11、日志
云原生要求我們把日志當(dāng)成事件流,同樣是因?yàn)樵圃h(huán)境應(yīng)用的實(shí)例個(gè)數(shù)隨時(shí)都在發(fā)生著變化,每個(gè)實(shí)例時(shí)時(shí)刻刻都會(huì)產(chǎn)生日志,我們不能說(shuō)在每臺(tái)實(shí)例上面查看日志,所以我們要把日志統(tǒng)一收集和采集到特定的日志系統(tǒng)中。這一點(diǎn)其實(shí)在分布式系統(tǒng)里面也是一樣的,一般會(huì)通過(guò) ELK 技術(shù),將日志進(jìn)行存儲(chǔ)和分析。
12、管理進(jìn)程
最后一條這個(gè)管理進(jìn)程指的是將后臺(tái)管理系統(tǒng)的任務(wù)當(dāng)成是一次性的進(jìn)程進(jìn)行執(zhí)行,其實(shí)這一點(diǎn)不算是普適的要素,跟具體的后臺(tái)系統(tǒng)功能有關(guān),這里就不討論了。
總結(jié)
上面提到了什么是云原生以及 12 條云原生應(yīng)用的要素,很多跟我們分布式系統(tǒng)的要求都是一致的,只不過(guò)云原生應(yīng)用的要求會(huì)更高一點(diǎn),更嚴(yán)格一點(diǎn),更自動(dòng)化一點(diǎn)。
從了不起的角度來(lái)看云原生應(yīng)用是目前看來(lái)最好的一種方式,對(duì)于企業(yè)或者個(gè)人來(lái)說(shuō)都是最快和成本最低的。
對(duì)于很多小公司來(lái)說(shuō)完全沒(méi)必要自建一套基礎(chǔ)設(shè)施,直接采用云廠商提供的能力就好,從而快速實(shí)現(xiàn)自身業(yè)務(wù)的發(fā)展,畢竟小公司活下去才是最重要的,沒(méi)必要在這種事情上面浪費(fèi)時(shí)間和精力。
參考
- 學(xué)透 Spring 從入門到項(xiàng)目實(shí)戰(zhàn)
- 網(wǎng)絡(luò)資料