云函數基本應用
云函數(Serverless Cloud Function)是騰訊云提供的無服務器(serverless)執行環境,幫助用戶在沒有購買和管理服務器時仍能運行代碼。
用戶只需要使用云平臺支持的語言編寫核心代碼及設置代碼運行的條件,代碼即可在騰訊云基礎設施上彈性、安全地運行,并可完全管理底層計算資源,包括服務器CPU、內存、網絡、代碼部署、彈性伸縮、負載均衡等服務。
1.服務端架構的演進
1.1 物理機時代(機房)
步驟:
購買主機
托管機房(備案)
鏈接電源網線
安裝系統
部署運行環境
申請靜態IP
部署繁瑣,問題多(磁盤受損,停電...)
1.2 虛擬機時代
物理機分割成多臺虛擬機提供給用戶使用,硬件設備管理統一由云廠商負責,直接在云平臺購買虛擬機
問題:用戶增多,數據和圖片過多,數據庫性能瓶頸,磁盤耗盡、資源不足,服務器負載
處理:數據庫遷移到云廠商提供的云服務器上,更穩定性能更好;圖片存儲遷移到對象存儲上,無限擴容。服務器只處理請求,將計算和存儲分離開,降低了系統負載。
虛擬機優點:不用關心底層硬件
存在問題:服務器集群管理(服務器運行環境配置、統一)
1.3 容器時代(主流服務器架構技術,docker)
在虛擬機技術的基礎上把代碼和環境打包到一起,與服務器配置分離,使代碼和運行環境保持一致。在服務器部署容器,不再部署應用。
存在問題:容器過多時的管理
解決方法:容器編排技術(k8s)
||
問題:流量洪峰(服務器預估不到位宕機)-》 服務器擴充、大量編排工作 -》 平時大量服務器運行浪費成本
需要:只關心業務代碼的實現,脫離服務器管理,不用再關注運行環境和服務器擴容,流量洪峰來臨時自動調配更多服務器資源支撐,流量低谷時自動釋放服務器資源節約成本。
解決方案:serverless,自動進行服務器資源管理
服務端發展(基礎架構的抽象)
物理機 -> 虛擬機: 脫離硬件設備管理,將計算機拆分為相互隔離的虛擬機
虛擬機 -> 容器:擺脫運行環境和集群管理工作,將虛擬機運行環境抽象為容器
容器 -> serverless:不再關心運行環境和服務器資源調配
2.serverless概念
serverful:服務器的一切都需要人工進行干預
廣義概念:服務端架構理念,開發者不用關心服務器,將服務器相關工作交給云平臺,與服務器運維有關的所有工作都不再關心。
開發者只關注業務邏輯本身,所有與業務無關的基礎設施都交由云平臺負責,由云平臺統一調度、管理、運維。
狹義概念:Serverless架構就是采用FaaS(函數即服務)和BaaS(后端即服務)服務來解決問題的一種設計。
Baas(backend as a service):(服務器和開發環境)由serverless對后端架構進行包攬,包括硬件維護、集群管理、運行環境搭建、緩存等等,由云平臺做好封裝,以接口方式提供服務。對開發者來說,只需要編寫業務邏輯代碼,不需要關心實現,baas作為一個黑盒,通過接口對黑盒進行取用。
-
Faas(function as a service):(運行邏輯代碼)以函數方式運行代碼,函數運行平臺。選擇編程語言編寫函數。
對開發來說,faas即serverless,在faas中能體會到serverless全部特性:
無運維:faas函數運行時,開發者對底層函數無感知,faas負責服務器資源調度和運維
事件驅動:不持續運行,通過一定條件進行觸發,集成觸發器直接使用
按量付費:根據faas執行次數和消耗CPU進行付費
彈性收縮:根據函數運行需要資源量自動調配服務器資源,實時彈性伸縮
faas進行計算+baas進行存儲,分開部署收費。應用存儲被分離成獨立云服務器,減少丟失風險;應用本身變為無狀態,易于調度和擴縮容。
serverless的缺點
嚴重依賴云平臺廠商:各云廠商實現接口的標準不同,同一套代碼無法在不同serverless產品上運行,云平臺遷移成本高
開發調試困難:serverless依賴云服務,本地難以搭建云服務環境,在本地開發調試復雜。serverless架構飛速發展,開發調試部署等工具不完善。
底層硬件不確定:baas對開發者來說是個黑盒,硬件資源不確定。當代碼需要在特定CPU和GPU上運行時,云廠商未提供對底層硬件的可選項,底層硬件的類型和型號不可知。
(其它:運行機制、開發方式……)
3.云函數使用
云平臺:騰訊云(初學者友好)
云開發CloudBase:包含整個使用時需要的所有服務,用戶驗證、數據庫存儲、緩存等(不使用服務器資源時免費)
1)登錄騰訊云
2)選擇serverless應用
3)選擇函數服務
4)創建函數
用戶帳號配額限制
內容 | 默認配額限制 |
---|---|
每個地域下的函數代碼總體積 | 100GB |
每個地域下的總函數并發配額 | 128000MB(廣州、上海、北京、成都、中國香港)64000MB(孟買、新加坡、東京、多倫多、硅谷、法蘭克福、深圳金融、上海金融) |
每個地域下命名空間個數 | 5 |
每個命名空間下的總函數并發配額 | 可購買 函數套餐包進行配額調整 |
每個命名空間下函數個數 | 50 |
函數類型選擇:
event 函數: 由指定格式的事件觸發,例如定時觸發事件、COS 觸發事件等,事件結構詳情見 觸發器。
Web 函數:專注于優化 Web 服務場景,可以直接接受并處理 HTTP 請求,詳情見 Web 函數。
執行方法:對應項目的主函數,是程序執行的起點,以文件名.執行方法名的形式進行設置,如
index.main_handler
。-
函數入參:指函數在被觸發調用時所傳遞給函數的內容。
event: 觸發函數執行的基本信息
-
云 API 觸發函數執行: 在調用方和函數代碼之間自定義一個 dict 類型的參數。調用方按照定義好的格式傳入數據,函數代碼按格式獲取數據。
示例: 定義一個 dict 類型的數據結構
{"key":"XXX"}
,當調用方傳入數據{"key":"abctest"}
時,函數代碼可以通過event[key]
來獲得值 abctest。 -
觸發器觸發函數執行: SCF 和 API 網關、對象存儲 COS、消息隊列 Ckafka 等多種云服務打通,可以通過給函數綁定對應的云服務觸發器觸發函數執行。觸發器觸發函數時,event 會以一種平臺預定義的、不可更改的格式作為 event 參數傳給函數,可以根據此格式編寫代碼并從 event 參數中獲取信息。
示例: 通過對象存儲 COS 觸發函數時會將對象存儲桶及文件的具體信息以JSON 格式 傳遞給 event 參數,在函數代碼中通過解析 event 信息即可完成對觸發事件的處理。
-
context: SCF 平臺提供的入參,獲取到運行環境及當前請求的相關信息。SCF 提供的入參 context
包含的字段及含義如下:
[圖片上傳失敗...(image-ee09f3-1688375998501)]
-
函數返回:云函數執行完成后的返回值。
callback 是一個可選參數,在非異步函數中返回執行結果,參數包括一個 Error 和一個返回。
異步函數將忽略 callback 的返回,必須通過 return、throw exception 或者 promise 來處理返回或錯誤。
SCF 平臺會獲取到云函數執行完成后的返回值,并根據下表中不同的觸發方式進行處理。
觸發方式 | 處理方式 |
---|---|
同步觸發 | 通過 API 網關、云 API 同步 invoke 觸發函數的方式為同步觸發。使用同步方式觸發的函數在執行期間,SCF 平臺不會返回觸發結果。在函數執行完成后,SCF 平臺會將函數返回值封裝為 JSON 格式并返回給調用方。 |
異步觸發 | 使用異步方式觸發的云函數,SCF 平臺接收觸發事件后,會返回觸發請求 ID 。在函數執行完成后,函數的返回值會封裝為 JSON 格式并存儲在日志中。用戶可在函數執行完成后,通過返回的請求 ID 查詢日志獲取該異步觸發函數的返回值。對于異步函數,可以使用 return 和 throw 來發送返回或錯誤。函數必須使用 async 關鍵字。在異步函數中,第三個參數 callback 沒有定義。 |
js異步函數示例:
const httpRequest = url => {
const promise = new Promise(function(resolve, reject) {
https
.get(url, res => {
resolve(res.statusCode)
})
.on('error', e => {
reject(Error(e))
})
})
return promise
}
exports.main_handler = async function(event, context) {
try{
const result = await httpRequest(url)
// 在async函數中callback未定義
// callback(null, result)
return result
}catch(e) {
throw e
}
}
js同步函數示例:
exports.main_handler = function(event, context, callback) {
https.get(url, (res) => {
// 只能通過callback返回,return會被忽略
callback(null, res.statusCode)
}).on('error', (e) => {
callback(Error(e))
})
}
函數配置:
5)創建事件觸發器。環境->訪問服務->新建觸發路徑(關聯資源:云函數)
4. 云函數實戰
-
功能:實現一個定時提醒員工吃飯的企業微信機器人
代碼:
/**************************************************
demo-show 說明
postData里的content需要修改為自己需要的
request里的url需要填寫之前創建的機器人對應的WebHook
***************************************************/
const request = require('request')
exports.main_handler = async (event, context, callback) => {
return new Promise((resolve, reject) => {
const date = dateFormat({
time: +new Date(),
format: 'yyyymmdd'
})
const postData = {
"msgtype": "text",
"text": {
"content": "吃飯了\n",
"mentioned_list":["@all"]
}
}
request({
url: 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=',
method: 'POST',
headers: {
"content-type": "application/json",
},
body: JSON.stringify(postData)
}, function(err, res) {
if (!err && res.statusCode == 200) {
resolve('success')
} else {
reject(err)
}
});
})
}
觸發器設置:
- 創建express項目
-
VSCode開發
下載Tencent Serverless Toolkit for VS Code,登錄賬戶,通過該插件生成云函數,上傳到云端