对于 Web 应用,您的程序是一个运行在 Native Python 运行时中的 HTTP Server 服务。本文为您介绍开发该 HTTP Server 需要遵循的规范和方法。
在本地开发 HTTP Server 时需要遵循以下规范:
服务本身必须是无状态的
如需状态可存储至远端 redis 或 mysql,服务启动不依赖本地内存 cache 或落盘的数据。
启动命令
服务需要提供启动命令(后续在控制台 创建 Web 应用 时配置启动命令)。
# 注意是在本地执行该命令 # 假设启动脚本为 run.sh chmod a+x run.sh
监听端口
服务需要监听端口。
function_start_timeout function process start timeout: function start timed out (120s) with command `./main --port 3000`, function may not listen on address *:8000, logs: current working directory: /opt/bytefaas Server listen on address: :3000. Please check your log(runtime_log)/code and then retry, or contact oncall
_FAAS_RUNTIME_PORT
来获取指定的监听端口。不鼓励后台进程
不鼓励服务启动后台进程或线程(即请求已经返回了 Response,但后台仍有任务异步执行)。函数服务根据请求量对后端实例进行动态扩缩容,无法保证后台进程、线程的存活性。
在 Native Python 运行时中,函数服务会将请求 Method、Path、Body、Query 以及 Headers 转发给您的 HTTP Server。您可以直接使用入参请求头(Headers)和请求体(Body)来编写函数的业务逻辑。
以 fastapi 框架为例,完整的代码如下。
from fastapi import FastAPI import time # 创建一个 FastAPI 应用实例 app = FastAPI() # 定义根路径 '/' 的 GET 路由 @app.get('/') def index_handler(): return 'Hello FastAPI From FaaS nativepython3 (and bye python2)!' # 定义根路径 '/' 的 POST 路由 @app.post('/') async def root_post_handler(payload: dict): return {"message": "POST request received", "payload": payload}
#!/bin/bash set -ex cd `dirname $0` if [ -d "output" ]; then cd ./output/ fi # 配置监听地址和端口 HOST="0.0.0.0" PORT=${_FAAS_RUNTIME_PORT} TIMEOUT=${_FAAS_FUNC_TIMEOUT} # 解析参数 while [[ $# -gt 0 ]]; do case $1 in --port) PORT="$2" shift 2 ;; --host) HOST="$2" shift 2 ;; *) shift ;; esac done exec python3 -m uvicorn app:app --host $HOST --port $PORT --timeout-graceful-shutdown $TIMEOUT
您可以通过命令行参数传递端口,或者通过环境变量 _FAAS_RUNTIME_PORT
来获取配置的监听端口(默认为 8000),run.sh 文件中的以下代码展示了从环境变量以及命令参数中获取监听地址(HOST)和端口号 (PORT)的逻辑。
注意
服务监听的端口必须与您在控制台配置的监听端口相匹配。
# 配置监听地址和端口。 # 监听地址必须为 0.0.0.0,否则会导致部署失败。 HOST="0.0.0.0" PORT=${_FAAS_RUNTIME_PORT} TIMEOUT=${_FAAS_FUNC_TIMEOUT} # 解析参数 while [[ $# -gt 0 ]]; do case $1 in --port) PORT="$2" shift 2 ;; --host) HOST="$2" shift 2 ;; *) shift ;; esac done
针对 Native Python 运行时的 HTTP Server而言,由于您本身已经实现了一个 HTTP Server,因此您可以在 HTTP Server 的逻辑中对您的请求处理程序进行自定义处理。以下代码展示了简单的请求处理接口。
# 请求处理 @app.get('/') def index_handler(): return 'Hello FastAPI From FaaS nativepython3 (and bye python2)!'
完成代码开发和编译后,您需要在控制台 创建 Web 应用 时配置启动命令与监听端口。本示例中,启动命令为./run.sh
,监听端口为 8000。
对于 Native Python 函数,您可以在控制台配置函数运行时所需的环境变量,并在代码中读取对应的环境变量,用于函数处理逻辑。对于所配置的环境变量,veFaaS 会将其注入到函数运行所在的容器中,程序可以通过语言的内置库进行读取。 例如:若您函数配置中环境变量的键(key)为 envKey
,运行环境读取该环境变量的代码示例如下。
import "os" envValue = os.getenv("envKey")