FaaS介绍
FaaS介紹
???????? 云計算技術(shù)的核心是服務(wù)化,服務(wù)化就需要提供閉環(huán)和靈活的服務(wù)。而云計算也在持續(xù)發(fā)展中,從最初的基礎(chǔ)設(shè)施服務(wù)化(IaaS),平臺服務(wù)化(PaaS),軟件服務(wù)化(SaaS),陸續(xù)演化出數(shù)據(jù)庫服務(wù)化(DBaaS),容器服務(wù)化(CaaS)。其實一個更細(xì)分的服務(wù)化叫做FaaS,FaaS是Functions as a Service的縮寫,可以廣義的理解為功能服務(wù)化,也可以解釋為函數(shù)服務(wù)化。使用FaaS只需要關(guān)注業(yè)務(wù)代碼邏輯,無需關(guān)注服務(wù)器資源,所以FaaS也跟開發(fā)者無需關(guān)注服務(wù)器Serverless密切相關(guān)。可以說FaaS提供了一個更加細(xì)分和抽象的服務(wù)化能力。
????????
FaaS和PaaS的關(guān)系
? ? 要理解FaaS,就必須了解FaaS和PaaS的關(guān)系(關(guān)于PaaS的前世今生可以參考筆者的另一篇博客http://dockone.io/article/635)。
???????? 在早期的PaaS的技術(shù)實現(xiàn)中,比如GAE、SAE,因為當(dāng)時還沒有像Docker容器這樣的沙盒打包能力,PaaS往往會提供各種語言技術(shù)棧,比如Java\PHP等,而開發(fā)者通過上傳的代碼的方式進(jìn)行部署,PaaS會負(fù)責(zé)代碼構(gòu)建和服務(wù)的生命周期管理。進(jìn)一步的,PaaS開始允許開發(fā)者自定義開發(fā)和構(gòu)建環(huán)境,比如像Heroku和CloudFoundry的Buildpack就是定義了代碼的構(gòu)建和運行邏輯,Buildpack實現(xiàn)了三步功能:
?
- detect:檢查當(dāng)前代碼是否能支持,比tomcat buildpack發(fā)現(xiàn)WEB-INF路徑就認(rèn)為自己能夠運行它。
- compile:將代碼進(jìn)行編譯構(gòu)建,比如將java代碼構(gòu)建成jar包。
- release:將應(yīng)用程序啟動,比如運行tomcat的startup.sh。
?
備注:buildpack的詳細(xì)說明可以參考https://docs.cloudfoundry.org/buildpacks/
????????
???????? 實際上BuildPack還是比較難解決代碼依賴的問題,而Docker的容器一致性環(huán)境和Dockerfile組成完成了強大的沙盒打包能力,為此PaaS平臺紛紛支持Docker容器來解決代碼構(gòu)建,像Kubernete就可以專注于容器編排和服務(wù)生命周期管理,而不用像CloudFoundry那樣要在內(nèi)部流程和組件提供代碼構(gòu)建能力,所以Kubernete也被稱為CaaS,因為只關(guān)注容器的服務(wù)化管理,代碼的構(gòu)建由Docker或者上層Devops平臺負(fù)責(zé)。
????????
???????? 所以可以說一開始FaaS是和PaaS融合在一起的,而現(xiàn)在PaaS就更加專注于服務(wù)編排和資源管理,而FaaS也開始獨立出來,FaaS逐漸形成以代碼函數(shù)為主體的事件驅(qū)動架構(gòu),使用FaaS的時候可以將函數(shù)作為一個線上服務(wù)、遠(yuǎn)程計算服務(wù),可以通過 API 執(zhí)行、通過郵件執(zhí)行、通過Iot 執(zhí)行,通過隊列執(zhí)行。
???????? 云計算服務(wù)提供商也紛紛提出FaaS,比如AWS Lambda,Google Cloud Functions以及Azure Functions,然后也有更多的FaaS開源框架推出。接下來我們通過介紹AWS Lambda讓讀者更加清楚FaaS的業(yè)務(wù)形態(tài)和使用場景。
?
AWS Lambda
??? Lambda是AWS 2014年推出的計算服務(wù)。Lambda是一種FaaS,所以Lambda服務(wù)的核心概念是Lambda function(簡稱function,函數(shù))。圍繞function可以定義情景,包括執(zhí)行環(huán)境(語言、內(nèi)存、超時、?IAM角色)以及這個function要觸發(fā)的另一個function。
?????? function上傳之后,開發(fā)者可以將其指定到指定的AWS資源(如某個S3 bucket,某個DynamoDB表,某個Kinesis流),然后Lambda就會建立該資源跟你的function之間的關(guān)聯(lián)。當(dāng)資源方面發(fā)生變動,Lambda就會去創(chuàng)建資源去執(zhí)行你的function。用于運行function的資源的創(chuàng)建分配和釋放都有Lambda自動來做,開發(fā)者完全不需要去干預(yù)。
???????? Lambda是一個事件驅(qū)動架構(gòu),應(yīng)用由函數(shù)(functions,即業(yè)務(wù)邏輯的載體)+ 數(shù)據(jù)(data,即跟業(yè)務(wù)相關(guān)的輸入與輸出),以及這兩者之間的交互——即事件(events。常見的事件如增加、變更、刪除等)組成。所以Lambda可以無縫地和其他服務(wù)集成,如下:
場景1:Amazon S3 +Lambda進(jìn)行圖片處理
???????假設(shè)有一個照片共享應(yīng)用程序。用戶在應(yīng)用程序上傳照片,應(yīng)用程序?qū)⑦@些用戶照片存儲到?Amazon S3?存中。然后應(yīng)用程序針對上傳的圖片進(jìn)行處理,包括圖片壓縮、加水印等等,在這種場景下,通過?Lambda?配合S3,Amazon S3?是Lambda支持的?AWS?事件源之一,可以發(fā)布對象創(chuàng)建的事件?并調(diào)用您的?Lambda?函數(shù)。?Lambda?函數(shù)代碼可以從?S3?存儲桶讀取照片對象、進(jìn)行圖片處理,然后將其保存到S3?。
?
場景2:Amazon APIGateway+Lambda實現(xiàn)API調(diào)用
???????通過 Amazon API Gateway,可以根據(jù)在 AWS?Lambda?中運行的代碼快速、輕松地創(chuàng)建自定義 API,然后通過 API 調(diào)用EC2或者 Lambda。Lambda相比EC2來說是一個即開即用的函數(shù),在沒有調(diào)用的時候是不會運行和計費的,并且AWS可以根據(jù)請求的大小,自動伸縮Lambda所需的資源,這一切都是開發(fā)者無需關(guān)心的。
??????
????????
?
?
作者簡介
吳龍輝,致力于云計算PaaS的研究和實踐,《Kubernetes實戰(zhàn)》作者,活躍于CloudFoundry,Docker,Kubernetes等開源社區(qū),貢獻(xiàn)代碼和撰寫技術(shù)文檔。?
郵箱:wlh6666@qq.com
總結(jié)
- 上一篇: Fluentd初探 简介与安装
- 下一篇: Faas 和无服务器架构