新聞中心
serverless 工程實(shí)踐|細(xì)數(shù) Serverless 的配套服務(wù)
作者:劉宇 2021-09-08 10:12:39
云計(jì)算 從 Serverless 的結(jié)構(gòu)上來(lái)看,Serverless = FaaS + BaaS 是一個(gè)被普遍認(rèn)可的概念;從 Serverless 的特性上來(lái)看,Serverless 運(yùn)行在無(wú)狀態(tài)的計(jì)算容器中,由事件觸發(fā),并且擁有彈性伸縮以及按量付費(fèi)等能力,讓使用者不用花費(fèi)更多的精力在服務(wù)器上,而是更加關(guān)注業(yè)務(wù)本身。

前言
上文說(shuō)到云計(jì)算的十余年發(fā)展讓整個(gè)互聯(lián)網(wǎng)行業(yè)發(fā)生了翻天覆地的變化,Serverless 作為云計(jì)算的產(chǎn)物,或者說(shuō)是云計(jì)算在某個(gè)時(shí)代的表現(xiàn),被很多人認(rèn)為是真正意義上的云計(jì)算,關(guān)于“Serverless 是什么”這個(gè)問(wèn)題,其實(shí)是可以通過(guò)不同角度來(lái)分析的。
Martin Fowler 在 “Serverless Architectures” 一文中從 Serverless 組成角度給出了 Serverless 的定義,他認(rèn)為 Serverless 實(shí)際上是 BaaS 與 FaaS 的組合,并針對(duì) BaaS 和 FaaS 進(jìn)行了詳細(xì)的描述。
Serverless 最早用于描述那些大部分或者完全依賴(lài)于第三方(云端)應(yīng)用或服務(wù)來(lái)管理服務(wù)器端邏輯和狀態(tài)的應(yīng)用,這些應(yīng)用通常是富客戶(hù)端應(yīng)用(單頁(yè)應(yīng)用或者移動(dòng)端App),建立在云服務(wù)生態(tài)之上,包括數(shù)據(jù)庫(kù)(Parse、Firebase)、賬號(hào)系統(tǒng)(Auth0、AWS Cognito)等。這些服務(wù)最早被稱(chēng)為 Baas(Backend as a Service,后端即服務(wù))。
Serverless 還可以指這種情況:應(yīng)用的一部分服務(wù)端邏輯依然由開(kāi)發(fā)者完成,但是和傳統(tǒng)架構(gòu)不同,它運(yùn)行在一個(gè)無(wú)狀態(tài)的計(jì)算容器中,由事件驅(qū)動(dòng),生命周期很短(甚至只有一次調(diào)用),完全由第三方管理。這種情況被稱(chēng)為 FaaS(Functions as a service,函數(shù)即服務(wù))。AWS Lambda 是目前的熱門(mén) FaaS 實(shí)現(xiàn)之一。
通過(guò) Martin Fowler 的描述可以總結(jié)出 FaaS、BaaS 以及 Serverless 之間的關(guān)系為下圖所示。
Serverless 架構(gòu)的組成
從 Serverless 的結(jié)構(gòu)上來(lái)看,Serverless = FaaS + BaaS 是一個(gè)被普遍認(rèn)可的概念;從 Serverless 的特性上來(lái)看,Serverless 運(yùn)行在無(wú)狀態(tài)的計(jì)算容器中,由事件觸發(fā),并且擁有彈性伸縮以及按量付費(fèi)等能力,讓使用者不用花費(fèi)更多的精力在服務(wù)器上,而是更加關(guān)注業(yè)務(wù)本身。
不同角度上的 Serverless 的定義
Serverless 工作流程
在實(shí)際生產(chǎn)中,Serverless 架構(gòu)通常都是 FaaS 與 BaaS 的結(jié)合,并且具備彈性伸縮和按量付費(fèi)的特性。
當(dāng)開(kāi)發(fā)者想要開(kāi)發(fā)一個(gè)項(xiàng)目的時(shí)候:
通常只需要根據(jù) FaaS 提供商所提供的 Runtime,選擇一個(gè)熟悉的編程語(yǔ)言,然后進(jìn)行項(xiàng)目開(kāi)發(fā)、測(cè)試(圖中步驟 1)
完成之后將代碼上傳到FaaS平臺(tái)(圖中步驟 2)
上傳完成之后,只需要通過(guò) API/SDK;或者一些云端的事件源(圖中步驟 3)
觸發(fā)上傳到 FaaS 平臺(tái)的函數(shù),F(xiàn)aaS 平臺(tái)就會(huì)根據(jù)觸發(fā)的并發(fā)度等彈性執(zhí)行對(duì)應(yīng)的函數(shù)(圖中步驟 4)
最后用戶(hù)可以根據(jù)實(shí)際資源使用量進(jìn)行按量付費(fèi)(圖中步驟 5)
Serverless 工作流程
我們來(lái)看一個(gè) Web 應(yīng)用的例子。通常情況下一些 Web 應(yīng)用都是傳統(tǒng)的三層 C/S 架構(gòu),例如一個(gè)常見(jiàn)的電子商務(wù)應(yīng)用,假設(shè)它的服務(wù)端用 Java,客戶(hù)端用 HTML/JavaScript。
傳統(tǒng) Web 應(yīng)用三層 C/S 架構(gòu)
在這個(gè)架構(gòu)下,服務(wù)端僅為云服務(wù)器,其承載了大量業(yè)務(wù)功能和業(yè)務(wù)邏輯,例如,系統(tǒng)中的大部分邏輯(身份驗(yàn)證、頁(yè)面導(dǎo)航、搜索、交易等)都在服務(wù)端實(shí)現(xiàn)。把它改造成 Serverless 應(yīng)用形態(tài)。
Serverless 應(yīng)用形態(tài)簡(jiǎn)圖
在 Serverless 應(yīng)用形態(tài)下,移除了最初應(yīng)用中的身份驗(yàn)證邏輯,換用一個(gè)第三方的 BaaS 服務(wù)(上圖中步驟 1);允許客戶(hù)端直接訪(fǎng)問(wèn)一部分?jǐn)?shù)據(jù)庫(kù)內(nèi)容,這部分?jǐn)?shù)據(jù)完全由第三方托管,會(huì)用一些安全配置來(lái)管理客戶(hù)端訪(fǎng)問(wèn)相應(yīng)數(shù)據(jù)的權(quán)限(上圖中步驟 2);前面兩點(diǎn)已經(jīng)隱含了非常重要的第三點(diǎn):先前服務(wù)端的部分邏輯已經(jīng)轉(zhuǎn)移到了客戶(hù)端,如保持用戶(hù) Session、理解應(yīng)用的 UX 結(jié)構(gòu)、獲取數(shù)據(jù)并渲染出用戶(hù)界面等。
客戶(hù)端實(shí)際上已經(jīng)在逐步演變?yōu)閱雾?yè)應(yīng)用(上圖中步驟 3);還有一些任務(wù)需要保留在服務(wù)器上,比如繁重的計(jì)算任務(wù)或者需要訪(fǎng)問(wèn)大量數(shù)據(jù)的操作。這里以“搜索”為例,搜索功能可以從持續(xù)運(yùn)行的服務(wù)端中拆分出來(lái),以 FaaS 的方式實(shí)現(xiàn),從 API 網(wǎng)關(guān)(后文做詳細(xì)解釋?zhuān)┙邮照?qǐng)求并返回響應(yīng)。這個(gè)服務(wù)端函數(shù)可以和客戶(hù)端一樣,從同一個(gè)數(shù)據(jù)庫(kù)讀取產(chǎn)品數(shù)據(jù)。原始的服務(wù)端是用 Java 寫(xiě)的,而 AWS Lambda(假定用的這家 FaaS 平臺(tái))也支持 Java,那么原先的搜索代碼略作修改就能實(shí)現(xiàn)這個(gè)搜索函數(shù)(上圖中步驟 4);還可以把“購(gòu)買(mǎi)”功能改寫(xiě)為另一個(gè) FaaS函數(shù),出于安全考慮,它需要在服務(wù)端而非客戶(hù)端實(shí)現(xiàn)。它同樣經(jīng)由API網(wǎng)關(guān)暴露給外部使用(上圖中步驟 5)。
在整個(gè)項(xiàng)目中,Serverless 用戶(hù)實(shí)際關(guān)心的也就只剩下函數(shù)中的業(yè)務(wù)邏輯,至于身份驗(yàn)證邏輯、API 網(wǎng)關(guān)以及數(shù)據(jù)庫(kù)等原先在服務(wù)端的一些產(chǎn)品/服務(wù)統(tǒng)統(tǒng)交給云廠(chǎng)商提供。在整個(gè)項(xiàng)目開(kāi)發(fā)、上線(xiàn)以及維護(hù)的過(guò)程中,用戶(hù)并不需要關(guān)注服務(wù)器層面的維護(hù),也無(wú)須為流量的波峰波谷進(jìn)行運(yùn)維資源的投入,這一切的安全性、彈性能力以及運(yùn)維工作都交給云廠(chǎng)商來(lái)統(tǒng)一處理/調(diào)度,用戶(hù)所需要關(guān)注的就是自己的業(yè)務(wù)代碼是否符合自己的業(yè)務(wù)要求,同時(shí)在 Serverless 架構(gòu)下,用戶(hù)也無(wú)需為資源閑置進(jìn)行額外的支出,Serverless 架構(gòu)的按量付費(fèi)模型以及彈性伸縮能力、服務(wù)端低運(yùn)維/免運(yùn)維能力,可以讓 Serverless 用戶(hù)的資源成本、人力成本、整體研發(fā)效能得到大幅度提升,讓項(xiàng)目的性能、安全性、穩(wěn)定性得到極大的保障。
Serverless 的配套服務(wù)
1、開(kāi)發(fā)者工具
Serverless 開(kāi)發(fā)者工具包括命令行工具、編輯器插件以及其他工具。
一般情況下,命令行工具有廠(chǎng)商一方工具和開(kāi)源建設(shè)的三方工具兩種,例如 AWS Lambda 的 SAM CLI、阿里云函數(shù)計(jì)算的 Funcraft 等就是典型的一方工具。這類(lèi)工具的特點(diǎn)是和廠(chǎng)商、產(chǎn)品的匹配度非常高,一些特性的支持比較迅速,缺點(diǎn)是比較保守。Serverless Devs、Serverless Framework 就是典型的三方工具,這兩個(gè)工具都支持 AWS Lambda、阿里云函數(shù)計(jì)算、騰訊云云函數(shù)等云廠(chǎng)商的 FaaS 產(chǎn)品。
從客戶(hù)端表現(xiàn)上來(lái)看,其都是 Serverless 開(kāi)發(fā)者工具,都是組件化的命令行工具,也都支持多云;從形態(tài)上來(lái)看,Serverless Framework 更注重部署與運(yùn)維方向, Serverless Devs 更注重 Serverless 應(yīng)用的全生命周期。同時(shí),Serverless Devs 相對(duì) Serverless Framework 而言,增加了可視化界面。
Serverless Devs GUI 首頁(yè)
如圖所示,通過(guò)該界面,用戶(hù)可以快速地部署應(yīng)用。
Serverless Devs GUI 可視化 Yaml 編輯頁(yè)
用戶(hù)可以快速地管理云上 Serverless 相關(guān)資源,如圖所示。
Serverless Devs GUI 項(xiàng)目管理頁(yè)
Azure Functions 也提供了 Visual Studio Code 插件,如下圖所示。Visual Studio 中的 Azure Functions 項(xiàng)目模板可用于創(chuàng)建項(xiàng)目,創(chuàng)建的項(xiàng)目可發(fā)布到 Azure 中的函數(shù)應(yīng)用中。用戶(hù)可使用函數(shù)應(yīng)用將函數(shù)分組為一個(gè)邏輯單元,以便于管理、部署和共享資源。
Azure Functions 提供的 VSCode 插件
阿里云在開(kāi)發(fā)者工具層面提供了 VSCode 插件,如圖所示。
同時(shí),阿里云函數(shù)計(jì)算還提供了 Cloud Toolkit 工具,實(shí)現(xiàn)了在本地 Jet Brains IDE 中運(yùn)行、下載云端函數(shù),創(chuàng)建、上傳本地函數(shù)。以 IntelliJ IDEA 為例,其函數(shù)管理界面如下圖所示。
阿里云函數(shù)計(jì)算 VSCode 插件函數(shù)管理界面
2、Serverless Workflow
Serverless Workflow(Serverless 工作流)是一個(gè)用來(lái)協(xié)調(diào)多個(gè)分布式任務(wù)執(zhí)行的全托管云服務(wù)。
如圖所示,在 Serverless 工作流中,用戶(hù)可以用順序、分支、并行等方式來(lái)編排分布式任務(wù)。Serverless 工作流會(huì)按照設(shè)定好的步驟可靠地協(xié)調(diào)任務(wù),跟蹤每個(gè)任務(wù)的狀態(tài)轉(zhuǎn)換,并在必要時(shí)執(zhí)行用戶(hù)定義的重試邏輯,以確保工作流順利完成。
Serverless 工作流通過(guò)提供日志記錄和審計(jì)來(lái)監(jiān)視任務(wù)的執(zhí)行,方便用戶(hù)輕松地診斷和調(diào)試應(yīng)用。Serverless 工作流簡(jiǎn)化了開(kāi)發(fā)和運(yùn)行業(yè)務(wù)流程所需要的任務(wù)協(xié)調(diào)、狀態(tài)管理以及錯(cuò)誤處理等煩瑣的工作,讓用戶(hù)聚焦業(yè)務(wù)邏輯開(kāi)發(fā)。
Serverless 工作流示例
Serverless 工作流可以協(xié)調(diào)分布式組件編排不同基礎(chǔ)架構(gòu)、不同網(wǎng)絡(luò)、不同語(yǔ)言編寫(xiě)的應(yīng)用,抹平混合云、專(zhuān)有云過(guò)渡到公共云或者從單體架構(gòu)演進(jìn)到微服務(wù)架構(gòu)的落差。Serverless 工作流提供了豐富的控制邏輯,例如順序、選擇、并行等,讓用戶(hù)以更少的代碼實(shí)現(xiàn) 復(fù)雜的業(yè)務(wù)邏輯。Serverless 工作流為用戶(hù)管理流程狀態(tài),提供內(nèi)置檢查點(diǎn)和回放能力,以確保應(yīng)用程序按照預(yù)期逐步執(zhí)行。錯(cuò)誤重試和捕獲可以讓用戶(hù)靈活地處理錯(cuò)誤。Serverless 工作流根據(jù)實(shí)際執(zhí)行步驟轉(zhuǎn)換個(gè)數(shù)收費(fèi),執(zhí)行結(jié)束不再收費(fèi)。Serverless 工作流自動(dòng)擴(kuò)展,讓用戶(hù)免于管理硬件預(yù)算和擴(kuò)展。
Serverless 應(yīng)用的可觀(guān)測(cè)性
Serverless 應(yīng)用的可觀(guān)測(cè)性是被很多用戶(hù)所關(guān)注的。可觀(guān)測(cè)性是通過(guò)外部表現(xiàn)判斷系統(tǒng)內(nèi)部狀態(tài)來(lái)衡量的。在應(yīng)用開(kāi)發(fā)中,可觀(guān)測(cè)性幫助用戶(hù)判斷系統(tǒng)內(nèi)部的健康狀況,在系統(tǒng)出現(xiàn)問(wèn)題時(shí),幫助用戶(hù)定位問(wèn)題、排查問(wèn)題、分析問(wèn)題;在系統(tǒng)平穩(wěn)運(yùn)行時(shí),幫助用戶(hù)評(píng)估風(fēng)險(xiǎn),預(yù)測(cè)可能出現(xiàn)的問(wèn)題。在 Serverless 應(yīng)用開(kāi)發(fā)中,如果觀(guān)察到函數(shù)的并發(fā)度持續(xù)升高,很可能是業(yè)務(wù)推廣團(tuán)隊(duì)努力工作使業(yè)務(wù)規(guī)模迅速擴(kuò)張。為了避免達(dá)到并發(fā)度限制閾值,開(kāi)發(fā)者就需要提前提升并發(fā)度。以阿里云函數(shù)計(jì)算為例,阿里云函數(shù)計(jì)算在可觀(guān)測(cè)性層面提供了多種維度,包括 Logging、Metric 以及 Tracing 等。
函數(shù)計(jì)算可觀(guān)測(cè)性整體圖表
在控制臺(tái)監(jiān)控中心,我們可以查看整體的 Metric、服務(wù)級(jí) Metric 以及每個(gè)函數(shù)的 Metric。除此之外,我們還可以看到當(dāng)前函數(shù)的請(qǐng)求記錄。
函數(shù)計(jì)算可觀(guān)測(cè)性函數(shù)請(qǐng)求記錄
根據(jù)不同的請(qǐng)求記錄,可以查看到函數(shù)的詳細(xì)信息,如圖所示。
函數(shù)計(jì)算可觀(guān)測(cè)性請(qǐng)求級(jí)記錄詳細(xì)信息
除了在控制臺(tái)的監(jiān)控中心處可以查看到函數(shù)的日志等信息,我們?cè)诤瘮?shù)詳情頁(yè)面也可以看到函數(shù)的詳細(xì)日志信息。
函數(shù)計(jì)算日志查看
Tracing 相關(guān)信息如圖所示。
函數(shù)計(jì)算可觀(guān)測(cè)性 Tracing 相關(guān)信息
新聞標(biāo)題:Serverless工程實(shí)踐|細(xì)數(shù)Serverless的配套服務(wù)
網(wǎng)站網(wǎng)址:http://www.dlmjj.cn/article/dhecsdo.html


咨詢(xún)
建站咨詢(xún)
