You need to enable JavaScript to run this app.
文档中心
函数服务

函数服务

复制全文
下载 pdf
Native Python 运行时
开发方法
复制全文
下载 pdf
开发方法
对于 Web 应用,您的程序是一个运行在 Native Python 运行时中的 HTTP Server 服务。本文为您介绍开发该 HTTP Server 需要遵循的规范和方法。​
服务规范​
在本地开发 HTTP Server 时需要遵循以下规范:​
  • 服务本身必须是无状态的​
  • 如需状态可存储至远端 redis 或 mysql,服务启动不依赖本地内存 cache 或落盘的数据。​
  • 启动命令​
  • 服务需要提供启动命令(后续在控制台 创建 Web 应用 时配置启动命令)。​
  • 对于简单的启动命令,在控制台直接配置即可。​
  • 如果启动过程比较复杂,支持在项目中提供一个启动脚本,并在控制台配置启动命令时指定该启动脚本。​
  • ​
    # 注意是在本地执行该命令​
    # 假设启动脚本为 run.sh​
    chmod a+x run.sh​
    ​
  • 监听端口​
  • 服务需要监听端口。​
  • 请确保服务代码监听的端口与控制台配置的端口一致(后续在控制台 创建 Web 应用 时配置监听端口),否则会导致函数发布时冷启动失败并出现以下错误。​
  • ​
    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 框架为例,完整的代码如下。​
  • app.py:​
​
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}​
​
  • run.sh (启动脚本):​
​
#!/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。​
​alt​​
使用环境变量​
对于 Native Python 函数,您可以在控制台配置函数运行时所需的环境变量,并在代码中读取对应的环境变量,用于函数处理逻辑。对于所配置的环境变量,veFaaS 会将其注入到函数运行所在的容器中,程序可以通过语言的内置库进行读取。 例如:若您函数配置中环境变量的键(key)为 envKey,运行环境读取该环境变量的代码示例如下。​
​
import "os"​
envValue = os.getenv("envKey")​
​
​
最近更新时间:2025.03.11 17:02:16
这个页面对您有帮助吗?
有用
有用
无用
无用