對(duì)于云原生解決方案中涉及到的微服務(wù),DevOps,容器云和ServiceMesh等內(nèi)容,在前面很多文章都已經(jīng)談到過(guò),今天準(zhǔn)備談下對(duì)Serverless架構(gòu)的一些理解。
實(shí)際上要完全理解Serverless無(wú)服務(wù)器架構(gòu)是一件相對(duì)困難的事情,包括到現(xiàn)在我的認(rèn)知里面仍然認(rèn)為這種架構(gòu)是無(wú)法滿足傳統(tǒng)IT應(yīng)用系統(tǒng)的架構(gòu)轉(zhuǎn)型和遷移的,只能夠應(yīng)用到一些特定的場(chǎng)景。
對(duì)Serverless架構(gòu)基礎(chǔ)概念的理解

首先我們還是先看下對(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)用程序意味著開(kāi)發(fā)者可以專注在產(chǎn)品代碼上,而無(wú)須管理和操作云端或本地的服務(wù)器或運(yùn)行時(shí)。Serverless真正做到了部署應(yīng)用無(wú)需涉及基礎(chǔ)設(shè)施的建設(shè),自動(dòng)構(gòu)建、部署和啟動(dòng)服務(wù)。
注:這里必須搞清和容器化paas的區(qū)別點(diǎn),要知道容器PaaS本身也是不用關(guān)心服務(wù)器的,但是可以看到在Serverless是一種更小更靈活的動(dòng)態(tài)容器這是其一,其次是真正到了服務(wù)級(jí)別,而不是部署包級(jí)別。因?yàn)樵谠瓉?lái)的部署包級(jí)別就一定還是會(huì)存在編譯打包部署,要將部署包部署到類似tomact,jboss中間件的過(guò)程。而到了Serverless階段功能都是FaaS粒度更新,沒(méi)有打包構(gòu)建動(dòng)作,你也不用關(guān)系應(yīng)用中間件。
Serverless由開(kāi)發(fā)者實(shí)現(xiàn)的服務(wù)端邏輯運(yùn)行在無(wú)狀態(tài)的計(jì)算容器中,它由事件觸發(fā), 完全被第三方管理,其業(yè)務(wù)層面的狀態(tài)則被開(kāi)發(fā)者使用的數(shù)據(jù)庫(kù)和存儲(chǔ)資源所記錄。
關(guān)鍵兩類服務(wù)-FaaS和BaaS
1.FaaS(Function as a Service,函數(shù)即服務(wù))
要理解這個(gè)概念,首先還是要說(shuō)明下傳統(tǒng)的一個(gè)軟件應(yīng)用功能是如何開(kāi)發(fā)和交付的。
即我們首先是在本地開(kāi)發(fā)環(huán)境和IDE里面建設(shè)一個(gè)項(xiàng)目,然后建立相應(yīng)的代碼文件,編寫代碼,完成后進(jìn)行編譯構(gòu)建,形成一個(gè)部署包。然后將部署包部署到中間件或容器里面,部署完成后應(yīng)用就暴露一個(gè)訪問(wèn)地址,我們通過(guò)該地址訪問(wèn)該應(yīng)用功能。
那么到FaaS里面是什么概念呢?
首先就是沒(méi)有了中間件容器的概念,或者說(shuō)這個(gè)容器對(duì)你不可見(jiàn),最終的程序運(yùn)行在哪個(gè)容器里面,或者說(shuō)中間件容器長(zhǎng)什么樣子你根本不需要知道。
其次就是沒(méi)有編譯構(gòu)建動(dòng)作,對(duì)于寫好的程序不需要進(jìn)行編譯和構(gòu)建,打包成一個(gè)部署包進(jìn)行部署,寫好的程序即交付到Serverless環(huán)境后即可以運(yùn)行。如果你不需要運(yùn)行了,支撐程序運(yùn)行的環(huán)境或容器也可以快速的銷毀。
再次,我們?cè)诒镜亻_(kāi)發(fā)環(huán)境寫一個(gè)應(yīng)用功能,不可避免都會(huì)涉及到類似SSH三層框架,類似SpringCloud微服務(wù)開(kāi)發(fā)框架等。但是到了Serverless階段你可以看到?jīng)]有很重的開(kāi)發(fā)框架這個(gè)說(shuō)法,也就是說(shuō)開(kāi)發(fā)框架在FaaS里面不再存在。那么原來(lái)你是通過(guò)開(kāi)發(fā)框架開(kāi)發(fā)一個(gè)應(yīng)用,這個(gè)應(yīng)用比如有20個(gè)功能點(diǎn),那么到了FaaS這個(gè)階段,對(duì)應(yīng)的就是20個(gè)獨(dú)立的代碼片段實(shí)現(xiàn)20個(gè)功能點(diǎn)。
以上就是FaaS和傳統(tǒng)應(yīng)用的關(guān)鍵區(qū)別點(diǎn)。
FaaS意在無(wú)須自行管理服務(wù)器系統(tǒng)或自己的服務(wù)器應(yīng)用程序,即可直接運(yùn)行后端代碼。其中所指的服務(wù)器應(yīng)用程序,是該技術(shù)與容器和PaaS(平臺(tái)即服務(wù))等其他現(xiàn)代化架構(gòu)最大的差異。FaaS可以取代一些服務(wù)處理服務(wù)器(可能是物理計(jì)算機(jī),但絕對(duì)需要運(yùn)行某種應(yīng)用程序),這樣不僅不需要自行供應(yīng)服務(wù)器,也不需要全時(shí)運(yùn)行應(yīng)用程序。
FaaS產(chǎn)品不要求必須使用特定框架或庫(kù)進(jìn)行開(kāi)發(fā)。在語(yǔ)言和環(huán)境方面,F(xiàn)aaS函數(shù)就是常規(guī)的應(yīng)用程序。例如AWS Lambda的函數(shù)可以通過(guò)JAVAscript、Python以及任何JVM語(yǔ)言(Java、Clojure、Scala)等實(shí)現(xiàn)。然而Lambda函數(shù)也可以執(zhí)行任何捆綁有所需部署構(gòu)件的進(jìn)程,因此可以使用任何語(yǔ)言,只要能編譯為Unix進(jìn)程即可。
FaaS中的函數(shù)可以通過(guò)供應(yīng)商定義的事件類型觸發(fā)。對(duì)于亞馬遜AWS,此類觸發(fā)事件可以包括S3(文件)更新、時(shí)間(計(jì)劃任務(wù)),以及加入消息總線的消息(例如Kinesis)。通常你的函數(shù)需要通過(guò)參數(shù)指定自己需要綁定到的事件源。大部分供應(yīng)商還允許函數(shù)作為對(duì)傳入Http請(qǐng)求的響應(yīng)來(lái)觸發(fā),通常這類請(qǐng)求來(lái)自某種該類型的API網(wǎng)關(guān)(例如AWS API網(wǎng)關(guān)、Webtask)。
2.BaaS(Backend as a Service,后端即服務(wù))
BaaS(Backend as a Service,后端即服務(wù))是指我們不再編寫或管理所有服務(wù)端組件,可以使用領(lǐng)域通用的遠(yuǎn)程組件(而不是進(jìn)程內(nèi)的庫(kù))來(lái)提供服務(wù)。
BaaS看起來(lái)和我們常說(shuō)的PaaS平臺(tái)感覺(jué)很類似,那么來(lái)看下兩者的區(qū)別。
對(duì)應(yīng)PaaS平臺(tái)我們看到實(shí)際上提供的是應(yīng)用托管,應(yīng)用自動(dòng)部署,后續(xù)資源彈性擴(kuò)展調(diào)度能力。即前提是有部署包,再調(diào)用PaaS平臺(tái)的能力將應(yīng)用部署到托管的中間件和容器里面。這里面有兩個(gè)重點(diǎn),即:其一是有部署包,其二是有中間件和容器的概念。
但是到了BaaS可以看到,已經(jīng)沒(méi)有編譯構(gòu)建和部署包的概念,對(duì)于容器和應(yīng)用中間件概念也不再有或?qū)﹂_(kāi)發(fā)者不可見(jiàn)。而實(shí)際上BaaS需要提供的是什么呢?即代碼片段編寫完成上傳后運(yùn)行代碼片段的能力。
但是實(shí)際上單獨(dú)的一個(gè)代碼片段本身很難實(shí)現(xiàn)一個(gè)業(yè)務(wù)場(chǎng)景功能。
比如我們需要做一個(gè)網(wǎng)頁(yè)抓取功能,那么在實(shí)現(xiàn)這個(gè)功能的時(shí)候可能涉及到圖片存儲(chǔ),全文檢索,對(duì)象存儲(chǔ)幾個(gè)關(guān)鍵技術(shù)服務(wù)能力。而這些技術(shù)能力就是BaaS平臺(tái)提供,即類似于我們傳統(tǒng)PaaS平臺(tái)里面說(shuō)的技術(shù)服務(wù)能力平臺(tái)。
那么代碼片段做什么事呢?即通過(guò)代碼片段對(duì)BaaS層提供的API能力進(jìn)行組合或編排,這樣就可以完成一個(gè)簡(jiǎn)單的業(yè)務(wù)場(chǎng)景和功能實(shí)現(xiàn)。
例如我們看當(dāng)前亞馬遜提供的Serverless服務(wù)應(yīng)用場(chǎng)景圖,如下:

可以看到BaaS提供類似網(wǎng)關(guān),消息通知,對(duì)象存儲(chǔ)等各種技術(shù)服務(wù)能力,而前端的FaaS通過(guò)對(duì)這些技術(shù)服務(wù)能力進(jìn)行組合完成一個(gè)業(yè)務(wù)功能實(shí)現(xiàn)。
在AWS用Serverless創(chuàng)建一個(gè)應(yīng)用一般會(huì)涉及到如下內(nèi)容
- API Gateway 網(wǎng)關(guān)服務(wù),實(shí)現(xiàn)我們需要的網(wǎng)絡(luò)RESTful接口
- Lambda 函數(shù)計(jì)算,實(shí)現(xiàn)我們需要的平行擴(kuò)展業(yè)務(wù)運(yùn)算
- Dynamodb數(shù)據(jù)庫(kù),實(shí)現(xiàn)我們需要的“單機(jī)”無(wú)限性能數(shù)據(jù)庫(kù)
- S3服務(wù),實(shí)現(xiàn)前端靜態(tài)頁(yè)面的存儲(chǔ)
通過(guò) Amazon API Gateway,您可以根據(jù)在 AWS Lambda 中運(yùn)行的代碼快速、輕松地創(chuàng)建自定義 API,然后通過(guò) API 調(diào)用 Lambda 代碼。Amazon API Gateway 可以用您的賬戶執(zhí)行 AWS Lambda 代碼,也可以在 AWS 外部通過(guò)可公共訪問(wèn)的 HTTP 端點(diǎn)來(lái)調(diào)用 AWS Elastic Beanstalk、Amazon EC2 或 Web 服務(wù)。利用 Amazon API Gateway 控制臺(tái),您可以定義 REST API 及其關(guān)聯(lián)的資源和方法、管理 API 生命周期、生成客戶端 SDK,并能查看 API 指標(biāo)。
Serverless架構(gòu)適合的場(chǎng)景
在現(xiàn)階段,Serverless主要應(yīng)用在以下幾個(gè)場(chǎng)景。首先在Web及移動(dòng)端服務(wù)中,可以整合API網(wǎng)關(guān)和Serverles服務(wù)構(gòu)建Web及移動(dòng)后端,幫助開(kāi)發(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ī)器人等。這里簡(jiǎn)單說(shuō)兩個(gè)場(chǎng)景,方便大家思考。
場(chǎng)景一:應(yīng)用負(fù)載有顯著的波峰波谷
Serverless 應(yīng)用成功與否的評(píng)判標(biāo)準(zhǔn)并不是公司規(guī)模的大小,而是其業(yè)務(wù)背后的具體技術(shù)問(wèn)題,比如業(yè)務(wù)波峰波谷明顯,如何實(shí)現(xiàn)削峰填谷。一個(gè)公司的業(yè)務(wù)負(fù)載具有波峰波谷時(shí),機(jī)器資源要按照峰值需求預(yù)估;而在波谷時(shí)期機(jī)器利用率則明顯下降,因?yàn)椴荒苓M(jìn)行資源復(fù)用而導(dǎo)致浪費(fèi)。
業(yè)界普遍共識(shí)是,當(dāng)自有機(jī)器的利用率小于 30%,使用 Serverless 后會(huì)有顯著的效率提升。對(duì)于云服務(wù)廠商,在具備了足夠多的用戶之后,各種波峰波谷疊加后平穩(wěn)化,聚合之后資源復(fù)用性更高。比如,外賣企業(yè)負(fù)載高峰是在用餐時(shí)期,安防行業(yè)的負(fù)載高峰則是夜間,這是受各個(gè)企業(yè)業(yè)務(wù)定位所限的;而對(duì)于一個(gè)成熟的云服務(wù)廠商,如果其平臺(tái)足夠大,用戶足夠多,是不應(yīng)該有明顯的波峰波谷現(xiàn)象的。
場(chǎng)景二:典型用例 - 基于事件的數(shù)據(jù)處理
視頻處理的后端系統(tǒng),常見(jiàn)功能需求如下:視頻轉(zhuǎn)碼、抽取數(shù)據(jù)、人臉識(shí)別等,這些均為通用計(jì)算任務(wù),可由函數(shù)計(jì)算執(zhí)行。開(kāi)發(fā)者需要自己寫出實(shí)現(xiàn)邏輯,再將任務(wù)按照控制流連接起來(lái),每個(gè)任務(wù)的具體執(zhí)行由云廠商來(lái)負(fù)責(zé)。如此,開(kāi)發(fā)變得更便捷,并且構(gòu)建的系統(tǒng)天然高可用、實(shí)時(shí)彈性伸縮,用戶不需要關(guān)心機(jī)器層面問(wèn)題。
具體參考:
https://blog.csdn.net/cc18868876837/article/details/90672971
微服務(wù)和Serverless關(guān)系和融合

當(dāng)我們比較微服務(wù)和Serverless時(shí),實(shí)際上比較的是微服務(wù)和FaaS。直觀上來(lái)看,微服務(wù)和FaaS的差別在于粒度,而要實(shí)現(xiàn)FaaS,首先必須將單體應(yīng)用演進(jìn)到微服務(wù),然后才能進(jìn)一步地分解到函數(shù)級(jí)別,實(shí)現(xiàn)FaaS。
微服務(wù)和Serverless不完全是同一層面的事物,實(shí)際上不應(yīng)該放在一個(gè)層面進(jìn)行比較。
原因就是微服務(wù)仍然是傳統(tǒng)IT架構(gòu)演進(jìn)的一個(gè)容易理解過(guò)程,即原來(lái)傳統(tǒng)的單體應(yīng)用拆分為微服務(wù)模塊,從數(shù)據(jù)庫(kù),邏輯層都進(jìn)行拆分,都能夠獨(dú)立自治。拆分后的微服務(wù)可以基于容器進(jìn)行部署和管理。
但是微服務(wù)并沒(méi)有強(qiáng)調(diào)傳統(tǒng)SOA我們經(jīng)常說(shuō)的識(shí)別可重用的服務(wù)接口,基于服務(wù)接口進(jìn)行應(yīng)用功能的組裝。
在這個(gè)意義上可以看到Serverless說(shuō)成是SOA分層架構(gòu)思想的進(jìn)一步演進(jìn)更加合適。
這個(gè)演進(jìn)過(guò)程出現(xiàn)了兩個(gè)關(guān)鍵點(diǎn)。
- 其一就是共性技術(shù)服務(wù)能力全部轉(zhuǎn)變?yōu)锽aaS層的API服務(wù)接口
- 其二是前端應(yīng)用功能開(kāi)發(fā)轉(zhuǎn)化為代碼片段和對(duì)API能力的組合
以上這兩點(diǎn)才是Serverless架構(gòu)到重點(diǎn),因此可以說(shuō)傳統(tǒng)架構(gòu)朝微服務(wù)架構(gòu)演進(jìn)是順理成章的一個(gè)漸進(jìn)過(guò)程,但是不能說(shuō)微服務(wù)到Serverless演進(jìn)是平滑的。
Serverless比微服務(wù)粒度打的更細(xì),完全到了功能點(diǎn)級(jí),實(shí)際上可以看到后續(xù)管控運(yùn)維的復(fù)雜度是增加了的,對(duì)于類似單一功能App,微信小程序,定向數(shù)據(jù)采集等適合,但是對(duì)于復(fù)雜應(yīng)用系統(tǒng)暫時(shí)不適合。包括我們看到企業(yè)內(nèi)部復(fù)雜業(yè)務(wù)系統(tǒng),當(dāng)前轉(zhuǎn)微服務(wù)架構(gòu)本身就已經(jīng)很吃力。一拆分一定會(huì)帶來(lái)集成的問(wèn)題,監(jiān)控運(yùn)維的問(wèn)題,事務(wù)一致性的問(wèn)題。
注意對(duì)于Serverless不僅僅是無(wú)服務(wù)器,是整體架構(gòu)設(shè)計(jì)的概念都弱化了,同時(shí)應(yīng)用開(kāi)發(fā)框架的概念也隨著弱化,沒(méi)有重的開(kāi)發(fā)框架和底層平臺(tái),也沒(méi)有編譯和部署概念。
在已有的API服務(wù)能力都用傳統(tǒng)方式提供出來(lái)后,可以看到對(duì)于Serverless更加適合用來(lái)做前端應(yīng)用的組合和輕量級(jí)編排,通過(guò)FaaS來(lái)實(shí)現(xiàn)對(duì)各類第三方API服務(wù)能力的整合完成要給特定功能。
比如你要做一個(gè)簡(jiǎn)單的圖像處理程序,那么圖像采集,圖像識(shí)別和匹配,圖像存儲(chǔ)都可以調(diào)用獨(dú)立的第三方API接口服務(wù)來(lái)完成。
在Serverless后,可以看到對(duì)開(kāi)發(fā)人員技能要求進(jìn)一步降低,更不需要大家都去做全棧工程師,開(kāi)發(fā)人員也可以花更多的精力來(lái)關(guān)注業(yè)務(wù)場(chǎng)景和業(yè)務(wù)需求的理解和實(shí)現(xiàn)。同時(shí)在Serverless后也可以看到,小功能的開(kāi)發(fā)和交付周期會(huì)更快更加敏捷。
微服務(wù)和Serverless相互融合
在前面我們談到了BaaS層,對(duì)于各大公有云服務(wù)商來(lái)說(shuō),提供的BaaS層更多的是類似消息,緩存,對(duì)象存儲(chǔ),網(wǎng)關(guān)等技術(shù)服務(wù)API能力接口,而對(duì)于傳統(tǒng)業(yè)務(wù)系統(tǒng)需要提供的可復(fù)用業(yè)務(wù)能力接口是服務(wù)提供的。
你也可以理解為BaaS可以提供技術(shù)中臺(tái)API,但是服務(wù)提供業(yè)務(wù)中臺(tái)API。
因此如果你采用Serverless方式來(lái)構(gòu)建傳統(tǒng)業(yè)務(wù)應(yīng)用功能,你會(huì)發(fā)現(xiàn)一些業(yè)務(wù)后端API能力并不具備,在這種情況下你完全可以采用微服務(wù)的方式開(kāi)發(fā)業(yè)務(wù)API服務(wù)接口能力,然后暴露給前端FaaS層使用。即我們說(shuō)的構(gòu)建方式為:
完整業(yè)務(wù)應(yīng)用功能 = 前端FaaS代碼組合+(后端BaaSAPI+后端業(yè)務(wù)微服務(wù)API)
通過(guò)這種方式,一些簡(jiǎn)單的業(yè)務(wù)功能場(chǎng)景我們就可以遷移到采用Serverless來(lái)進(jìn)行開(kāi)發(fā)。但是要做到一個(gè)傳統(tǒng)IT系統(tǒng)應(yīng)用全部功能遷移到Serverless仍然相當(dāng)困難。因?yàn)閭鹘y(tǒng)IT系統(tǒng),業(yè)務(wù)微服務(wù)能力往往才是主體能力。
進(jìn)一步對(duì)Serverless架構(gòu)關(guān)鍵思想理解
首先再回顧下對(duì)Serverless無(wú)服務(wù)器架構(gòu)的一個(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)用程序意味著開(kāi)發(fā)者可以專注在產(chǎn)品代碼上,而無(wú)須管理和操作云端或本地的服務(wù)器或運(yùn)行時(shí)。Serverless真正做到了部署應(yīng)用無(wú)需涉及基礎(chǔ)設(shè)施的建設(shè),自動(dòng)構(gòu)建、部署和啟動(dòng)服務(wù)。
過(guò)去是“構(gòu)建一個(gè)框架運(yùn)行在一臺(tái)服務(wù)器上,對(duì)多個(gè)事件進(jìn)行響應(yīng)”,Serverless則變?yōu)?ldquo;構(gòu)建或使用一個(gè)微服務(wù)或微功能來(lái)響應(yīng)一個(gè)事件”,做到當(dāng)訪問(wèn)時(shí),調(diào)入相關(guān)資源開(kāi)始運(yùn)行,運(yùn)行完成后,卸載所有開(kāi)銷,真正做到按需按次計(jì)費(fèi)。這是云計(jì)算向縱深發(fā)展的一種自然而然的過(guò)程。
Serverless無(wú)服務(wù)器架構(gòu)的一些關(guān)鍵理解
通過(guò)拆分實(shí)現(xiàn)對(duì)應(yīng)用基礎(chǔ)設(shè)施的進(jìn)一步弱化(中間件,容器,開(kāi)發(fā)框架)

首先可以看到Serverless架構(gòu)下本身就體現(xiàn)了微服務(wù),而且這種微服務(wù)API的粒度更加細(xì),更加小,一個(gè)API往往僅僅能夠完成一個(gè)微功能。因此不再像傳統(tǒng)應(yīng)用必須是一個(gè)大的組件模塊,實(shí)現(xiàn)多個(gè)功能并打包在一起。
大的功能拆分為微功能-》微功能本身拆分為無(wú)狀態(tài)的微服務(wù)API
在完成了這種拆分后,要實(shí)現(xiàn)一個(gè)大功能那么就是對(duì)諸多的微服務(wù)API的的組裝過(guò)程。
我們還是從傳統(tǒng)的云平臺(tái)說(shuō)起,在傳統(tǒng)的應(yīng)用開(kāi)發(fā)和云平臺(tái)模式下,我們開(kāi)發(fā)一個(gè)應(yīng)用還是能夠明確的感受到虛擬機(jī),感受到中間件容器資源,同時(shí)應(yīng)用開(kāi)發(fā)必須依托一個(gè)很重的開(kāi)發(fā)框架,類似springcloiud,類似傳統(tǒng)的ssh框架等等。
但是新架構(gòu)下可以看到?jīng)]有復(fù)雜的開(kāi)發(fā)框架,也沒(méi)有重的中間件容器,只有一個(gè)個(gè)新粒度的微服務(wù)API,微功能的實(shí)現(xiàn),這些實(shí)現(xiàn)也不存在傳統(tǒng)的打包和部署動(dòng)作。也就是說(shuō)整個(gè)軟件的開(kāi)發(fā)過(guò)程實(shí)現(xiàn)完全的面向服務(wù)化,你可以使用第三方已有的服務(wù),你開(kāi)發(fā)完成的微功能也是服務(wù),你呈現(xiàn)給用戶的是多個(gè)服務(wù)的串聯(lián)和組裝。
在這種場(chǎng)景下沒(méi)有任何的中間件資源需要你去關(guān)心和維護(hù),類似傳統(tǒng)模式下我們可能需要關(guān)心和運(yùn)維我們的數(shù)據(jù)庫(kù),關(guān)心和運(yùn)維我們的Tomcat容器服務(wù)器,我們有復(fù)雜的編譯構(gòu)建,打包部署動(dòng)作,而這些在無(wú)服務(wù)器架構(gòu)模式下都沒(méi)有了。體現(xiàn)出現(xiàn)的是函數(shù)或事件,而函數(shù)本身也是服務(wù)。
傳統(tǒng)云平臺(tái)計(jì)費(fèi)模式的一大轉(zhuǎn)變-真正實(shí)現(xiàn)使用次數(shù)來(lái)計(jì)費(fèi)

這個(gè)可以講是Serverless無(wú)服務(wù)器架構(gòu)帶來(lái)的第二大轉(zhuǎn)變,真正實(shí)現(xiàn)按使用次數(shù)計(jì)費(fèi)。在傳統(tǒng)云平臺(tái)模式下可以看到,虛擬機(jī)或計(jì)算資源是固定分配給你了的,即使某天你的業(yè)務(wù)系統(tǒng)沒(méi)有任何的訪問(wèn)請(qǐng)求,你也需要給云服務(wù)商繳費(fèi)。
你為何需要固定分配的資源,簡(jiǎn)單來(lái)說(shuō)還是你拿到一個(gè)虛擬機(jī)后,你還有很多的應(yīng)用基礎(chǔ)設(shè)施需要在虛擬機(jī)上安裝部署和搭建,比如我們前面講的中間件容器,網(wǎng)關(guān),基礎(chǔ)框架包,應(yīng)用部署包等。而這些應(yīng)用基礎(chǔ)設(shè)施越重就越難以靈活的響應(yīng)。
而到了Serverless無(wú)服務(wù)器架構(gòu)下可以看到應(yīng)用已經(jīng)拆分為足夠細(xì)的微功能或API,而這些微功能的運(yùn)行本身需要極少的輕量化資源即可,因此我們能夠?qū)崿F(xiàn)對(duì)類似動(dòng)態(tài)容器能力,快速申請(qǐng)獲取容器資源,使用完成后快速的銷毀釋放資源。
所以你可以看到實(shí)現(xiàn)微服務(wù)化,實(shí)現(xiàn)FaaS或聲明式API編程是走向按次動(dòng)態(tài)收費(fèi)的基礎(chǔ)。
- Serverless 是真正的按需使用,請(qǐng)求到來(lái)時(shí)才開(kāi)始運(yùn)行
- Serverless 是按運(yùn)行時(shí)間和內(nèi)存來(lái)算錢的
- Serverless 應(yīng)用嚴(yán)重依賴于特定的云平臺(tái)、第三方服務(wù)
對(duì)于AWS 官方對(duì)于 Serverless 的介紹是這樣的:無(wú)服務(wù)器架構(gòu)是基于互聯(lián)網(wǎng)的系統(tǒng),其中應(yīng)用開(kāi)發(fā)不使用常規(guī)的服務(wù)進(jìn)程。相反,它們僅依賴于第三方服務(wù)(例如AWS Lambda服務(wù)),客戶端邏輯和服務(wù)托管遠(yuǎn)程過(guò)程調(diào)用的組合。
在Serverless架構(gòu)下開(kāi)發(fā)人員不再關(guān)心底層邏輯

簡(jiǎn)單來(lái)說(shuō)最早的開(kāi)發(fā)往往會(huì)涉及到操作系統(tǒng),進(jìn)一步的會(huì)涉及到數(shù)據(jù)庫(kù),應(yīng)用中間件容器,然后是各類的開(kāi)發(fā)框架,而這些在Serverless架構(gòu)下開(kāi)發(fā)人員不再關(guān)心,更多的是關(guān)心業(yè)務(wù)場(chǎng)景和業(yè)務(wù)功能的實(shí)現(xiàn)。
這里的不關(guān)心包括兩個(gè)方面,一個(gè)是不會(huì)直接去安裝部署和配置這些中間件,其次是不用去關(guān)心這些中間件或容器運(yùn)行在哪里?更加不用自己運(yùn)維這些中間件容器。簡(jiǎn)單來(lái)說(shuō),你真正要運(yùn)維的就是你實(shí)現(xiàn)的服務(wù)API接口,你實(shí)現(xiàn)的事件或函數(shù)。
目前業(yè)界的各類 Serverless 實(shí)現(xiàn)按功能而言,主要為應(yīng)用服務(wù)提供了兩個(gè)方面的支持:函數(shù)即服務(wù)(Function as a Service,F(xiàn)aaS)以及后臺(tái)即服務(wù)(Backend as a Service,BaaS)。
而實(shí)際上我們看到最難的仍然是在類似數(shù)據(jù)庫(kù)等原來(lái)的中間件資源能力的服務(wù)化,即我們對(duì)數(shù)據(jù)庫(kù)的需求也變成了一個(gè)個(gè)可以拆分的微服務(wù)API請(qǐng)求。比如我們僅僅是一個(gè)爬蟲采集后的數(shù)據(jù)存儲(chǔ)這種單一場(chǎng)景往往比較容易實(shí)現(xiàn),但是類似企業(yè)信息化系統(tǒng)這種底層復(fù)雜數(shù)據(jù)模型,強(qiáng)關(guān)系和強(qiáng)事務(wù)場(chǎng)景下往往就很難實(shí)現(xiàn)徹底意義上的數(shù)據(jù)庫(kù)能夠服務(wù)化。
正是這個(gè)原因我們看到類似Serverless架構(gòu)前期更加適用于移動(dòng)互聯(lián)網(wǎng),物聯(lián)網(wǎng)IOT,面向互聯(lián)網(wǎng)的聚合類應(yīng)用實(shí)現(xiàn)上面,而對(duì)于傳統(tǒng)企業(yè)信息化應(yīng)用軟件至少短期難看很難適用。
傳統(tǒng)企業(yè)信息化應(yīng)用轉(zhuǎn)到Serverless

對(duì)于這點(diǎn),實(shí)際上我在前面已經(jīng)談到,對(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)基本沒(méi)有任何的可能性。
我們可以看到,對(duì)于SOA架構(gòu)思想出來(lái)很多年,我們?cè)缇拖M麑鹘y(tǒng)企業(yè)內(nèi)部新和應(yīng)用的開(kāi)發(fā)基于ESB總線暴露的共享服務(wù)能力進(jìn)行BPEL服務(wù)編排來(lái)完成,即使這點(diǎn)對(duì)于絕大部分企業(yè)都很難真正做到和實(shí)施。
可以看到Serverless是SOA架構(gòu)思想應(yīng)用的極致?tīng)顟B(tài)。
由于企業(yè)應(yīng)用本身的業(yè)務(wù)復(fù)雜性,數(shù)據(jù)關(guān)聯(lián)和耦合性,集成復(fù)雜性,事務(wù)強(qiáng)一致性要求等。很難真正實(shí)現(xiàn)將傳統(tǒng)IT應(yīng)用完全的Serverless化。
那么唯一可行的應(yīng)用場(chǎng)景,即是我前面談到的,對(duì)于一些簡(jiǎn)單的功能開(kāi)發(fā),我們可以基于技術(shù)中臺(tái)和業(yè)務(wù)中臺(tái)暴露的API服務(wù)能力,進(jìn)行前端的代碼片段組裝來(lái)完成。但是前提仍然是需要首先開(kāi)發(fā)業(yè)務(wù)微服務(wù)模塊,并暴露API服務(wù)能力接口。
對(duì)于企業(yè)內(nèi)的信息化,在企業(yè)傳統(tǒng)IT架構(gòu)轉(zhuǎn)型過(guò)程中,重點(diǎn)還是云原生里面的微服務(wù),服務(wù)網(wǎng)格和DevOps幾個(gè)關(guān)鍵能力。即首先是微服務(wù)化拆分,其次通過(guò)服務(wù)網(wǎng)格去中心化,再次通過(guò)Devops實(shí)現(xiàn)和云端的快速對(duì)接和持續(xù)交付能力。
頭條號(hào):@人月聊IT,分享SOA,微服務(wù),DevOps和云原生相關(guān)技術(shù)文章。