今天再下從微服務(wù)到ServerLess無(wú)服務(wù)器架構(gòu)的演進(jìn)過(guò)程方面的話題。對(duì)于ServerLess我在前面專門寫過(guò)一篇文章進(jìn)行說(shuō)明,自己也專門申請(qǐng)了騰訊云ServerLess環(huán)境做了簡(jiǎn)單驗(yàn)證和測(cè)試。具體可以參考下面這篇文章。
你應(yīng)該了解的Serverless無(wú)服務(wù)器架構(gòu)和應(yīng)用場(chǎng)景
最近1到2年,類似阿里,騰訊,華為各大公有云服務(wù)商對(duì)ServerLess架構(gòu)和解決方案推廣力度很大,也看了一些垂直細(xì)分場(chǎng)景下ServerLess架構(gòu)下的成熟應(yīng)用和實(shí)踐。但是實(shí)際上可以看到這些應(yīng)用場(chǎng)景主要還是集中在互聯(lián)網(wǎng)應(yīng)用中,即使在互聯(lián)網(wǎng)應(yīng)用中也是一些相當(dāng)垂直的場(chǎng)景,比如一些基礎(chǔ)服務(wù)能力整合,數(shù)據(jù)采集發(fā)送,事件響應(yīng)場(chǎng)景,物聯(lián)網(wǎng)垂直應(yīng)用等。
而對(duì)于傳統(tǒng)企業(yè)信息化領(lǐng)域,ServerLess應(yīng)用很少。
其次,對(duì)于一個(gè)傳統(tǒng)的IT應(yīng)用系統(tǒng),可以說(shuō)對(duì)其進(jìn)行微服務(wù)化和架構(gòu)改造,但是卻很難在短期做到完全的ServerLess化。
今天重新談這篇文章,還是想對(duì)ServerLess無(wú)服務(wù)器架構(gòu)里面的一些關(guān)鍵內(nèi)容進(jìn)一步說(shuō)明,也方便大家理清思路和要點(diǎn)。
ServerLess無(wú)服務(wù)器架構(gòu)
首先我們還是先看下對(duì)Serverless的一個(gè)基礎(chǔ)定義和說(shuō)明,即:
Serverless是一種構(gòu)建和管理基于微服務(wù)架構(gòu)的完整流程,允許你在服務(wù)部署級(jí)別而不是服務(wù)器部署級(jí)別來(lái)管理你的應(yīng)用部署。它與傳統(tǒng)架構(gòu)的不同之處在于,完全由第三方管理,由事件觸發(fā),存在于無(wú)狀態(tài)(Stateless)、暫存(可能只存在于一次調(diào)用的過(guò)程中)計(jì)算容器內(nèi)。
構(gòu)建無(wú)服務(wù)器應(yīng)用程序意味著開發(fā)者可以專注在產(chǎn)品代碼上,而無(wú)須管理和操作云端或本地的服務(wù)器或運(yùn)行時(shí)。Serverless真正做到了部署應(yīng)用無(wú)需涉及基礎(chǔ)設(shè)施的建設(shè),自動(dòng)構(gòu)建、部署和啟動(dòng)服務(wù)。
在這里我想再?gòu)?qiáng)調(diào)下里面的一些關(guān)鍵點(diǎn)。
徹底意義上的從資源到服務(wù)
實(shí)際在談微服務(wù)的時(shí)候,我們希望的就是整個(gè)云平臺(tái)不斷地向上抽象和上移,從IaaS層資源能力提供到PaaS層服務(wù)能力提供。
但是實(shí)際在應(yīng)用開發(fā)過(guò)程中,并沒有完全做到對(duì)資源層的隔離,比如一些自研的基礎(chǔ)組件開發(fā)和部署,一些數(shù)據(jù)庫(kù)資源部署,我們?nèi)匀贿€在申請(qǐng)類似虛擬機(jī)資源,然后自己進(jìn)行部署和管理。也就是說(shuō)沒有做到完整意義上的對(duì)資源層透明。
而到了Serverless階段,那就是必須做到完整意義上的服務(wù)化,你能夠看到和使用的只能夠是通過(guò)API網(wǎng)關(guān)暴露給你的API接口服務(wù)能力,對(duì)于資源層可以做到徹底意義上的不關(guān)心。
所以對(duì)于Serverless無(wú)服務(wù)器化這個(gè)詞,無(wú)服務(wù)器化可以理解為無(wú)資源化,即你不直接面對(duì)資源層,你面對(duì)的都是服務(wù)能力,去訂購(gòu)和消費(fèi)使用API服務(wù)能力。
去重的開發(fā)框架和組件依賴
對(duì)于Serverless可以理解為微服務(wù)的進(jìn)一步拆分,即將微服務(wù)實(shí)現(xiàn)的各個(gè)能力全部拆分和解耦,每一個(gè)服務(wù)能力變成無(wú)狀態(tài)的API接口能力,這些API接口能力就是一個(gè)個(gè)的可以通過(guò)腳本來(lái)實(shí)現(xiàn)的云函數(shù),構(gòu)成了Serverless架構(gòu)中的FaaS層。
傳統(tǒng)架構(gòu),即使微服務(wù)架構(gòu)仍然可以看到有比較重的微服務(wù)開發(fā)框架,有共性底層技術(shù)組件依賴等,而這些在Serverless下全部都應(yīng)該去掉或者轉(zhuǎn)為由云平臺(tái)統(tǒng)一提供。
簡(jiǎn)單來(lái)說(shuō)如果共性基礎(chǔ)框架這層不去掉,上層就不可能徹底的函數(shù)化。
徹底的無(wú)狀態(tài)化
為何徹底函數(shù)化困難?
除了前面談到的有一個(gè)共性的技術(shù)框架依賴外,另外一個(gè)關(guān)鍵點(diǎn)就是各個(gè)方法和函數(shù)之間的調(diào)用往往存在狀態(tài),需要做類似會(huì)話保持等相關(guān)動(dòng)作。
一旦方法間存在狀態(tài),那么實(shí)際每一個(gè)方法或函數(shù)功能的實(shí)現(xiàn)就無(wú)法做到完全的自我管理,這個(gè)不論在前期部署,后續(xù)的彈性伸縮,高可用等各種場(chǎng)景中你都需要去考慮狀態(tài)保持的問題,那么整體架構(gòu)又變得復(fù)雜。
因此在Serverless不斷在強(qiáng)調(diào)事件驅(qū)動(dòng),強(qiáng)調(diào)無(wú)狀態(tài),強(qiáng)調(diào)任何一個(gè)接口調(diào)完就結(jié)束,這個(gè)結(jié)束不僅僅是不保留狀態(tài),包括承載FaaS函數(shù)實(shí)現(xiàn)的輕量無(wú)狀態(tài)容器也可以做到快速的銷毀。
所以你也可以看到無(wú)狀態(tài)化是實(shí)現(xiàn)Serverless能夠按調(diào)用次數(shù)進(jìn)行計(jì)費(fèi)的一個(gè)關(guān)鍵。要實(shí)現(xiàn)這個(gè)按次計(jì)費(fèi)就必須做到資源層的快速啟動(dòng),創(chuàng)建,快速的擴(kuò)展,銷毀等各種能力。
從微服務(wù)到ServerLess無(wú)服務(wù)器架構(gòu)
實(shí)際上將微服務(wù)和ServerLess無(wú)服務(wù)器架構(gòu)進(jìn)行對(duì)比,或者將ServerLess作為微服務(wù)后續(xù)的發(fā)展趨勢(shì)并不合理。
基于上圖可以看到。
ServerLess無(wú)服務(wù)架構(gòu)實(shí)際是整個(gè)云平臺(tái)的重心不斷上移,從資源到服務(wù)層能力不斷抽象的一個(gè)過(guò)程。
那么微服務(wù)在哪里?
微微服務(wù)實(shí)際可以理解為PaaS層發(fā)展的第二個(gè)階段。對(duì)于PaaS層的第一個(gè)階段仍然是單體應(yīng)用和傳統(tǒng)的基于虛擬機(jī)進(jìn)行應(yīng)用調(diào)度和托管的PaaS平臺(tái),同時(shí)類似數(shù)據(jù)庫(kù),消息等技術(shù)服務(wù)能力也不足夠成熟。
而隨著云原生技術(shù)的發(fā)展,特別是云原生中的微服務(wù),容器技術(shù)也在不斷發(fā)展。公有云PaaS平臺(tái)發(fā)展到了圍繞容器+技術(shù)服務(wù)為核心的云原生PaaS平臺(tái)。在這個(gè)過(guò)程中傳統(tǒng)的單體應(yīng)用為了獲得更好的性能和可擴(kuò)展性,也轉(zhuǎn)變從單體拆分為更小的微服務(wù)。
這個(gè)發(fā)展階段可以參考下圖:
我們可以將整個(gè)演進(jìn)過(guò)程分為三個(gè)階段。
在傳統(tǒng)單體架構(gòu)階段,往往只會(huì)使用到云平臺(tái)提供的虛擬化資源池,提供彈性計(jì)算和彈性存儲(chǔ)能力。應(yīng)用自己申請(qǐng)?zhí)摂M機(jī),然后安裝環(huán)境,管理環(huán)境。同時(shí)應(yīng)用在開發(fā)完成后也是人工來(lái)完成將測(cè)試通過(guò)的版本部署到虛擬機(jī)環(huán)境中去。
而到了云原生PaaS平臺(tái)階段,底層的資源池變成了更加輕量化的容器,同時(shí)上層的單體已經(jīng)拆分為了多個(gè)獨(dú)立松耦合的微服務(wù),中間件PaaS層實(shí)現(xiàn)兩個(gè)能力。
其一是類似K8s實(shí)現(xiàn)的容器資源編排和調(diào)度;其二是實(shí)現(xiàn)共性的技術(shù)服務(wù)能力提供,其中包括了數(shù)據(jù)庫(kù),消息,緩存等各種技術(shù)服務(wù)能力。
為了更好地銜接上層微服務(wù)和底層容器云資源,可以通過(guò)DevOps持續(xù)集成和交付最佳實(shí)踐和工具集的整合,來(lái)完成整個(gè)從需求,開發(fā),測(cè)試,集成,交付過(guò)程的全面自動(dòng)化。也就是說(shuō)整個(gè)編譯,構(gòu)建,打包,部署的動(dòng)作全部由DevOps過(guò)程自動(dòng)完成。
到了ServerLess階段,實(shí)際看到又帶來(lái)如下變化。
其一是底層的容器變成無(wú)狀態(tài)化容器,更加輕量,也更加容易快速創(chuàng)建和銷毀;其二是上層的微服務(wù)能力進(jìn)一步拆分為各個(gè)獨(dú)立,無(wú)狀態(tài)的云函數(shù)或服務(wù);其三是PaaS層的技術(shù)服務(wù)能力進(jìn)一步增強(qiáng),構(gòu)建完整的BaaS層。
BaaS(Backend as a Service,后端即服務(wù))是指我們不再編寫或管理所有服務(wù)端組件,可以使用領(lǐng)域通用的遠(yuǎn)程組件(而不是進(jìn)程內(nèi)的庫(kù))來(lái)提供服務(wù)。
傳統(tǒng)企業(yè)應(yīng)用遷移到ServerLess思考
在現(xiàn)階段,Serverless主要應(yīng)用在以下幾個(gè)場(chǎng)景。首先在Web及移動(dòng)端服務(wù)中,可以整合API網(wǎng)關(guān)和Serverles服務(wù)構(gòu)建Web及移動(dòng)后端,幫助開發(fā)者構(gòu)建可彈性擴(kuò)展、高可用的移動(dòng)或 Web后端應(yīng)用服務(wù)。
在IoT場(chǎng)景下可高效地處理實(shí)時(shí)流數(shù)據(jù),由設(shè)備產(chǎn)生海量的實(shí)時(shí)信息流數(shù)據(jù),通過(guò)Serverles服務(wù)分類處理并寫入后端處理。另外在實(shí)時(shí)媒體資訊內(nèi)容處理場(chǎng)景里,用戶上傳的音視頻到對(duì)象存儲(chǔ)OBS,通過(guò)上傳事件觸發(fā)多個(gè)函數(shù),分別完成高清轉(zhuǎn)碼、音頻轉(zhuǎn)碼等功能,滿足用戶對(duì)實(shí)時(shí)性和并發(fā)能力的高要求。
無(wú)服務(wù)器計(jì)算還適合于任何事件驅(qū)動(dòng)的各種不同的用例,這包括物聯(lián)網(wǎng),移動(dòng)應(yīng)用,基于網(wǎng)絡(luò)的應(yīng)用程序和聊天機(jī)器人等。
我曾經(jīng)提到如下觀點(diǎn):
對(duì)于傳統(tǒng)企業(yè)信息化應(yīng)用來(lái)說(shuō),由于本身業(yè)務(wù)規(guī)則和邏輯實(shí)現(xiàn)復(fù)雜,同時(shí)存在大類的流程,數(shù)據(jù),應(yīng)用功能間的協(xié)同和集成。在這種場(chǎng)景下,轉(zhuǎn)到完全的Serverless架構(gòu)基本沒有任何的可能性。
在這里想轉(zhuǎn)換下思考方式,即對(duì)于傳統(tǒng)企業(yè)信息化應(yīng)用,如果要遷移到ServerLess無(wú)服務(wù)器化架構(gòu)需要做哪些準(zhǔn)備。
對(duì)于這個(gè)問題,我準(zhǔn)備分幾個(gè)點(diǎn)來(lái)思考。
第一:BaaS后端即服務(wù)能力仍然是傳統(tǒng)方式構(gòu)建
在這里再次強(qiáng)調(diào)下對(duì)于BaaS后端共性服務(wù)能力提供這塊,仍然是采用傳統(tǒng)架構(gòu)或當(dāng)期的微服務(wù)架構(gòu)方式來(lái)提供。
當(dāng)我們一說(shuō)到Serverless架構(gòu)的時(shí)候,很容易將思考重心放在FaaS云函數(shù)這層,其原因是在當(dāng)前的公有云服務(wù)下,類似存儲(chǔ),數(shù)據(jù),消息等各種BaaS后端服務(wù)能力都是云平臺(tái)在提供。但是當(dāng)前去開發(fā)企業(yè)級(jí)應(yīng)用的時(shí)候,這個(gè)BaaS后端服務(wù)含義變化。
即BaaS后端服務(wù)不僅僅是技術(shù)服務(wù),也包括了共性業(yè)務(wù)服務(wù)能力。
如果還是用中臺(tái)這個(gè)詞,你可以理解為企業(yè)共性的業(yè)務(wù)中臺(tái)和數(shù)據(jù)中臺(tái)提供的共性服務(wù)能力也是BaaS后端服務(wù)的重要組成。
也就說(shuō)你要開發(fā)企業(yè)級(jí)應(yīng)用,那么先得把BaaS這層做好,否則寸步難行。
第二:徹底的無(wú)狀態(tài)化開發(fā)模式
在前面已經(jīng)談到,Serverless架構(gòu)是一種徹底的無(wú)狀態(tài)化架構(gòu)模式。比如你原來(lái)本身就是采用的類似事件驅(qū)動(dòng)架構(gòu)在開發(fā),那么轉(zhuǎn)移到Serverless相當(dāng)容易。但是如果你原來(lái)更多的都是大量長(zhǎng)周期事務(wù),大量的狀態(tài)保持場(chǎng)景,那么整個(gè)遷移就相當(dāng)復(fù)雜。
無(wú)狀態(tài)開發(fā)類似SOA架構(gòu)思想里面的服務(wù)組裝和服務(wù)編排,也類似于基于消息事件機(jī)制的事件鏈編排模式。但是核心都是無(wú)狀態(tài),你需要通過(guò)其它方式,比如類似token傳遞來(lái)保持狀態(tài),通過(guò)消息機(jī)制來(lái)暫存狀態(tài)等。
第三:面向服務(wù)開發(fā)而非面向資源開發(fā)
這個(gè)也是我在前面就強(qiáng)調(diào)的點(diǎn),如果后續(xù)要轉(zhuǎn)移到Serverless架構(gòu)模式,那么你現(xiàn)在所有的開發(fā)指導(dǎo)思想都應(yīng)該是面向服務(wù)而非面向資源。
你不要再去考慮申請(qǐng)訂購(gòu)虛擬機(jī)或容器資源,你需要考慮的是將你的技術(shù)需求轉(zhuǎn)換為對(duì)技術(shù)服務(wù)的需求;將你的業(yè)務(wù)需求轉(zhuǎn)變?yōu)橐粋€(gè)個(gè)獨(dú)立的無(wú)狀態(tài)功能函數(shù)。
在前面我就談到如果你現(xiàn)在上云過(guò)程中,都還是在自己申請(qǐng)?zhí)摂M機(jī)安裝數(shù)據(jù),安裝消息中間件,那么在后期就更難以遷移到ServerLess模式。包括在前面對(duì)騰訊云ServerLess簡(jiǎn)單驗(yàn)證中也可以看到,當(dāng)你需要數(shù)據(jù)持久化存儲(chǔ)的時(shí)候,你不是去申請(qǐng)了一個(gè)虛擬機(jī)自己安裝Mysql數(shù)據(jù)庫(kù),而是在基礎(chǔ)服務(wù)里面有一個(gè)數(shù)據(jù)庫(kù)服務(wù),你直接使用這個(gè)服務(wù)能力來(lái)創(chuàng)建數(shù)據(jù)庫(kù)集合即可。
對(duì)于所有開發(fā)人員來(lái)說(shuō),面向服務(wù)開發(fā)是一個(gè)相對(duì)重要的內(nèi)容。
第四:開發(fā)團(tuán)隊(duì)和人員分工
進(jìn)入到ServerLess無(wú)服務(wù)器階段的時(shí)候,可以看到開發(fā)團(tuán)隊(duì)人員往往重新進(jìn)行分工,這個(gè)分工可以看做是當(dāng)前微服務(wù)前后端分工的一個(gè)分支。
即一個(gè)團(tuán)隊(duì)專門來(lái)做BaaS后端服務(wù)這層,這個(gè)團(tuán)隊(duì)仍然是采用傳統(tǒng)方法或者當(dāng)前的微服務(wù)架構(gòu)來(lái)進(jìn)行開發(fā)和持續(xù)集成交付。而對(duì)于另外一個(gè)開發(fā)團(tuán)隊(duì)則面向應(yīng)用和用戶,面向后端提供的API接口服務(wù),這個(gè)開發(fā)團(tuán)隊(duì)完全可以由當(dāng)前的前端開發(fā)人員來(lái)組成。
也就是說(shuō)在后端BaaS服務(wù)穩(wěn)定后,對(duì)于新應(yīng)用的創(chuàng)建更多就是前端應(yīng)用,F(xiàn)aaS云函數(shù)的編寫,前端開發(fā)人員可以更加關(guān)注業(yè)務(wù)場(chǎng)景和規(guī)則的實(shí)現(xiàn),更多的是去組裝和組合BaaS層已有的業(yè)務(wù)服務(wù)和技術(shù)服務(wù)能力來(lái)滿足各種需求。
可以舉個(gè)簡(jiǎn)單的例子。
對(duì)于傳統(tǒng)的OA辦公自動(dòng)化場(chǎng)景里面,當(dāng)組織,權(quán)限,人員,流程這些共性的后端服務(wù)能力具備后,對(duì)于前端各種類似請(qǐng)假單,出差申請(qǐng)單這種功能的開發(fā)是完全可以實(shí)現(xiàn)云函數(shù)化的。這個(gè)時(shí)候前端應(yīng)用的開發(fā)更類似于當(dāng)前的低代碼開發(fā)平臺(tái)完成的事情。
原文地址:https://mp.weixin.qq.com/s/0o2VJj9E9AC4LV4Eacmfxg