You need to enable JavaScript to run this app.
导航
开发方法
最近更新时间:2024.09.06 19:27:23首次发布时间:2024.09.02 17:46:42

对于 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")