典型案例 3:十分钟搭建弹性可扩展的 Web API
作者 | 蕭起 阿里云云原生團(tuán)隊(duì)
導(dǎo)讀:本節(jié)課程主要分為三個(gè)部分,基本概念中介紹基于函數(shù)計(jì)算的 WebAPI 與普通的 WebAPI 的區(qū)別及優(yōu)勢(shì);開(kāi)發(fā)流程中介紹如何在函數(shù)計(jì)算的控制臺(tái)進(jìn)行 WebAPI 的開(kāi)發(fā);操作演示中會(huì)實(shí)例演示函數(shù)計(jì)算 WebAPI 的開(kāi)發(fā)過(guò)程。
基本概念
常見(jiàn)的 WebAPI 架構(gòu)如上圖所示,主要包括客戶端(瀏覽器)、服務(wù)器、數(shù)據(jù)庫(kù),WebAPI 由服務(wù)器提供,同時(shí)服務(wù)器要完成負(fù)載均衡、登錄鑒權(quán)的相關(guān)操作。
當(dāng)客戶端流量快速增大時(shí),服務(wù)器端只能通過(guò)水平擴(kuò)展加機(jī)器的方式來(lái)增加提高服務(wù)能力。
這種常規(guī)模式主要有兩點(diǎn)局限性:
技術(shù)同學(xué)除了開(kāi)發(fā)業(yè)務(wù)代碼,有大量的服務(wù)器運(yùn)維成本,來(lái)保證服務(wù)的穩(wěn)定性、可用性,技術(shù)同學(xué)要花費(fèi)很多時(shí)間進(jìn)行運(yùn)維工作,占用開(kāi)發(fā)時(shí)間,降低項(xiàng)目研發(fā)效率。
流量突然增加時(shí),需要水平擴(kuò)展加機(jī)器,彈性的響應(yīng)能力差,擴(kuò)容速度往往要數(shù)十分鐘,無(wú)法實(shí)現(xiàn)秒級(jí)極速擴(kuò)容,導(dǎo)致一段時(shí)間內(nèi)的服務(wù)能力不足。同時(shí)當(dāng)流量變少時(shí),難以做到及時(shí)縮容,造成機(jī)器的成本浪費(fèi)。
基于函數(shù)計(jì)算的 WebAPI 架構(gòu)如上圖所示,與常規(guī)的 WebAPI 架構(gòu)相比,客戶端和數(shù)據(jù)庫(kù)未發(fā)生變化,但服務(wù)器變化巨大,主要體現(xiàn)在:
之前需要開(kāi)發(fā)團(tuán)隊(duì)維護(hù)的路由模塊以及鑒權(quán)模塊都將接入服務(wù)商提供的 API 網(wǎng)關(guān)系統(tǒng)以及鑒權(quán)系統(tǒng),開(kāi)發(fā)團(tuán)隊(duì)無(wú)須再維護(hù)這兩部分的業(yè)務(wù)代碼,只需要持續(xù)維護(hù)相關(guān)規(guī)則即可。
在這個(gè)結(jié)構(gòu)下,業(yè)務(wù)代碼也被拆分成了函數(shù)粒度,不同函數(shù)表示不同的功能。
我們已經(jīng)看不到服務(wù)器的存在,是因?yàn)?Serverless 的目的是讓使用者只關(guān)注自己的業(yè)務(wù)邏輯即可,所以一部分安全問(wèn)題、資源調(diào)度問(wèn)題(例如用戶量暴增、如何實(shí)現(xiàn)自動(dòng)擴(kuò)容等)全都交給云廠商負(fù)責(zé)。
相對(duì)于傳統(tǒng)項(xiàng)目而言,傳統(tǒng)項(xiàng)目無(wú)論是否有用戶訪問(wèn),服務(wù)都在運(yùn)行中,都是有成本支出,而 Serverless 而言,只有在用去發(fā)起請(qǐng)求時(shí),函數(shù)才會(huì)被激活并執(zhí)行,且會(huì)按量收費(fèi),可以實(shí)現(xiàn)在有流量的時(shí)候才有支持,沒(méi)有流量的時(shí)候就沒(méi)有支出,相對(duì)來(lái)說(shuō),成本會(huì)進(jìn)一步降低。
開(kāi)發(fā)流程
1. 登錄函數(shù)計(jì)算控制臺(tái),創(chuàng)建應(yīng)用
可以通過(guò)兩種方式來(lái)創(chuàng)建應(yīng)用,如果是已有的 Web 項(xiàng)目,可以選擇上圖中的第一種方式:“常見(jiàn) Web 應(yīng)用”;對(duì)于新項(xiàng)目則推薦使用第二種方式:“基于模板創(chuàng)建應(yīng)用”。我們這里使用模板方式,選擇基于 Python 的 Web 應(yīng)用。
模板可以當(dāng)做應(yīng)用腳手架,選擇適合的模板,可以自動(dòng)完成相關(guān)依賴資源的創(chuàng)建,如角色、OSS、域名網(wǎng)關(guān)等,降低開(kāi)發(fā)成本。
2. 新建函數(shù)
在應(yīng)用下,創(chuàng)建函數(shù),我們是開(kāi)發(fā) WebAPI,所以選擇“HTTP”函數(shù),這種函數(shù)會(huì)將指定的 http 請(qǐng)求作為觸發(fā)器,來(lái)調(diào)度對(duì)應(yīng)函數(shù)的執(zhí)行。
函數(shù)新建好之后,是個(gè)返回 helloWorld 的 demo,我們?cè)诖嘶A(chǔ)上來(lái)開(kāi)發(fā)我們的業(yè)務(wù)邏輯。
首先介紹下上圖代碼中的 handler 函數(shù),這個(gè)函數(shù)是入口函數(shù),http 觸發(fā)器接收到調(diào)用后會(huì)通過(guò)這個(gè)入口來(lái)啟動(dòng)整個(gè)函數(shù)。函數(shù)有兩個(gè)入?yún)?#xff0c;environ 和 start_response:
- environ
environ 中主要包含兩部分內(nèi)容:http 請(qǐng)求的入?yún)⒑秃瘮?shù)執(zhí)行上下文 fcContext,函數(shù)上下文參數(shù)中包含一些函數(shù)運(yùn)行時(shí)的信息(例如 request id 、 臨時(shí) AK ),您在代碼中可以使用這些信息。信息類型是 FCContext。
- start_response
該參數(shù)主要用于生成 http 請(qǐng)求的 response。
3. 配置觸發(fā)器,綁定域名
在新建函數(shù)時(shí)會(huì)自動(dòng)創(chuàng)建一個(gè) http 觸發(fā)器,這個(gè)觸發(fā)器的路徑是“aliyun.com”的一個(gè)測(cè)試路徑,只能用于測(cè)試,真實(shí)的應(yīng)用需要通過(guò)自定義域名將真實(shí)域名與函數(shù)綁定,這樣訪問(wèn)指定域名時(shí),對(duì)應(yīng)函數(shù)就會(huì)被觸發(fā)執(zhí)行。
4. 日志與監(jiān)控
在每個(gè)函數(shù)編輯頁(yè)面,日志和監(jiān)控服務(wù),函數(shù)的每次執(zhí)行都會(huì)生成唯一的 requestId,日志中通過(guò) requestId 進(jìn)行查詢,看到本次函數(shù)執(zhí)行的所有日志。
操作演示
點(diǎn)擊鏈接即可觀看演示視頻:https://developer.aliyun.com/lesson202418999
總結(jié)
以上是生活随笔為你收集整理的典型案例 3:十分钟搭建弹性可扩展的 Web API的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 函数的调试与部署
- 下一篇: 典型案例 1:函数计算在音视频场景实践