事件請(qǐng)求處理程序(Event Handler)
本文介紹Custom Container中事件請(qǐng)求處理程序的結(jié)構(gòu)特點(diǎn)、使用示例和常見問題等。
背景介紹
針對(duì)Web Server模式的Custom Container函數(shù),函數(shù)計(jì)算會(huì)將Common Headers、Body、POST方法以及/invoke、/initialize路徑轉(zhuǎn)發(fā)給容器中的HTTP Server。您可以選擇實(shí)現(xiàn)類似官方支持的Runtime(例如Golang Runtime)的context
和event
函數(shù)簽名。您也可以直接使用入?yún)⒄?qǐng)求頭(Headers)和請(qǐng)求體(Body)來編寫函數(shù)的業(yè)務(wù)邏輯。更多信息,請(qǐng)參見Custom Runtime事件函數(shù)調(diào)用。
針對(duì)非Web Server模式的Custom Container函數(shù),函數(shù)計(jì)算會(huì)將Body通過環(huán)境變量的形式添加至容器啟動(dòng)環(huán)境中。您可以通過os.GetEnv("FC_CUSTOM_CONTAINER_EVENT")
獲取事件信息并進(jìn)行任意處理。
函數(shù)調(diào)用說明
當(dāng)Web Server模式函數(shù)是事件請(qǐng)求處理程序時(shí),Http Server僅需實(shí)現(xiàn)Path為/invoke
和Method為POST
的對(duì)應(yīng)邏輯即可。
Path | 輸入請(qǐng)求 | 預(yù)期響應(yīng) |
POST |
| 響應(yīng)體:函數(shù)Handler的返回值,包括響應(yīng)碼和響應(yīng)頭。
通過Headers中的 x-fc-status 響應(yīng),向函數(shù)計(jì)算匯報(bào)本地函數(shù)是否執(zhí)行成功。
說明 在返回的HTTP響應(yīng)中,建議您同時(shí)設(shè)置 StatusCode 和x-fc-status 。 |
Web Server模式代碼示例
在以下Node.js Express示例中,POST方法和/initialize路徑會(huì)在函數(shù)實(shí)例初始化時(shí)被函數(shù)計(jì)算調(diào)用,POST方法和/invoke路徑為函數(shù)計(jì)算被調(diào)用時(shí)的Handler,通過req.headers
以及req.body
獲取context
和event
并將函數(shù)返回結(jié)果通過HTTP Response結(jié)構(gòu)體輸出。
'use strict';
const express = require('express');
// 常量
const PORT = 9000;
const HOST = '0.0.0.0';
const app = express();
// 解析JSON格式的請(qǐng)求體
app.use(express.json({type:['application/json', 'application/octet-stream']}))
// 初始化回調(diào)示例,需要在函數(shù)配置中配置初始化回調(diào)
app.post('/initialize', (req, res) => {
console.log(req.body)
res.send('Hello FunctionCompute, /initialize\n');
});
// 事件函數(shù)調(diào)用
app.post('/invoke', (req, res) => {
console.log(req.body)
res.send('Hello FunctionCompute, event function\n');
});
var server = app.listen(PORT, HOST);
console.log(`Running on http://${HOST}:${PORT}`);
server.timeout = 0; // 設(shè)置從不超時(shí)
server.keepAliveTimeout = 0; // keepalive, never timeout
非Web Server模式代碼示例
在以下Python鏡像示例中,通過FC_CUSTOM_CONTAINER_EVENT
獲取事件觸發(fā)的內(nèi)容。
import os
if __name__ == '__main__':
FC_EVENT = os.environ['FC_CUSTOM_CONTAINER_EVENT']
print("Hello serverless image")
print("FC event is: " + FC_EVENT)
多語言使用示例
使用Serverless Devs工具,您可以將您的應(yīng)用一鍵遷移至函數(shù)計(jì)算。以下示例展示如何通過Serverless Devs工具快速部署和調(diào)用函數(shù),您可以按需修改示例代碼,實(shí)現(xiàn)二次開發(fā)。