使用 Functions 框架运行函数
Cloud Run 函数使用开源 Functions 框架库将已部署的函数封装在永久性 HTTP 应用中。
Functions 框架还可以在支持语言本身的任何其他平台(包括本地机器、本地服务器、Compute Engine 和 Cloud Run)上运行。
安装依赖项
在函数的目录中,安装您所用语言的 Cloud Functions 框架库:
如需了解详情,请参阅 Java Functions 框架库。
Node.js
npm install --save-dev @google-cloud/functions-framework
Python
pip3 install functions-framework
Go
go install github.com/GoogleCloudPlatform/functions-framework-go/funcframework
Java
Maven
如果您使用的是 Maven,请将以下代码添加到您的 pom.xml
文件中:
Gradle
如果您使用的是 Gradle,请将以下代码添加到您的 build.gradle
文件中:
C#
以下命令使用 .NET 模板以 .NET Functions 框架库作为依赖项创建新的 .NET Cloud Run functions 函数代码库:
# HTTP functions dotnet new gcf-http # CloudEvent functions dotnet new gcf-event
Ruby
在 Ruby 中,Functions 框架必须添加到函数的依赖项中,以便将其部署到 Cloud Run functions:
bundle add functions_framework
PHP
composer require google/cloud-functions-framework
配置 Functions 框架
在使用 Functions 框架运行函数之前,您需要先指定要运行的函数的类型和名称。这些特性可指定为命令行界面 (CLI) 标志或环境变量。
支持的函数类型
Functions 框架支持 Cloud Run 函数支持的两种类型的函数。所有语言运行时都支持 http
和 cloudevent
签名类型。
函数类型 | 签名类型 | 说明 | 支持运行时 |
---|---|---|---|
HTTP 触发的函数 |
http
|
接收和响应 HTTP 请求的函数。 | 所有运行时 |
CloudEvent 函数 |
cloudevent
|
业界标准的事件格式 | 所有运行时 |
指定要运行的函数
在使用 Functions 框架运行函数之前,您必须先指定应在代码中运行的函数。对于大多数语言,您可以如下表所示指定目标函数的方法名称来执行此操作。(下面还显示了此规则的例外情况,例如 Java 和 .NET。)
针对每种语言的说明
如需查看每种语言所支持的配置选项列表,请参阅下表。
Node.js
CLI 参数 | 环境变量 | 说明 |
---|---|---|
--port
|
PORT
|
要侦听请求的端口。(默认值:8080 ) |
--target
|
FUNCTION_TARGET
|
要调用的 export 函数的名称。(默认值:function ) |
--signature-type
|
FUNCTION_SIGNATURE_TYPE
|
函数使用的签名类型。包括 http (默认值)、cloudevent 或 。 |
Python
CLI 参数 | 环境变量 | 说明 |
---|---|---|
--port
|
PORT
|
要侦听请求的端口。(默认值:8080 ) |
--target
|
FUNCTION_TARGET
|
要调用的 export 函数的名称。(默认值:function ) |
--signature-type
|
FUNCTION_SIGNATURE_TYPE
|
函数使用的签名类型。包括 http (默认值)、cloudevent 或 。 |
Go
环境变量 | 说明 |
---|---|
PORT
|
要侦听请求的端口。(默认值:8080 ) |
Java
参数名称 | 环境变量 | 说明 |
---|---|---|
run.port
|
PORT
|
要侦听请求的端口。(默认值:8080 ) |
run.functionTarget
|
FUNCTION_TARGET
|
要调用的 export 函数的名称。(默认值:function ) |
C#
CLI 参数 | 环境变量 | 说明 |
---|---|---|
--port
|
PORT
|
要侦听请求的端口。(默认值:8080 ) |
--target (或仅参数) |
FUNCTION_TARGET
|
要调用的函数的类名称。(默认值:function ) |
Ruby
CLI 参数 | 环境变量 | 说明 |
---|---|---|
--port
|
PORT
|
要侦听请求的端口。(默认值:8080 ) |
--target
|
FUNCTION_TARGET
|
要调用的 export 函数的名称。(默认值:function ) |
PHP
环境变量 | 说明 |
---|---|
FUNCTION_TARGET
|
要调用的函数的名称。(默认值:function ) |
FUNCTION_SIGNATURE_TYPE
|
函数使用的签名类型。包括 http (默认值)、cloudevent 或 。 |
请按照以下说明配置并运行 Functions 框架:
Node.js
借助 Node.js Functions 框架,您可以将函数的名称和签名类型指定为命令行参数或环境变量。
您还可以通过添加带有必需 CLI 参数的 start
脚本,在 package.json
构建文件中指定这些值,如以下示例所示。
"scripts": { "start": "npx functions-framework --target=YOUR_FUNCTION_NAME [--signature-type=YOUR_SIGNATURE_TYPE]" }
您也可以使用环境变量执行相同的操作:
"scripts": { "start": "FUNCTION_TARGET=YOUR_FUNCTION_NAME FUNCTION_SIGNATURE_TYPE=YOUR_SIGNATURE_TYPE npx functions-framework" }
如上表所示,将 YOUR_FUNCTION_NAME 替换为函数的方法名称,并将 YOUR_SIGNATURE_TYPE(如果适用)替换为函数的签名类型。
Python
借助 Python Functions 框架,您可以将函数的名称和签名类型指定为命令行参数或环境变量。在运行框架时必须指定命令行参数。
Go
Go Functions 框架使用 funcframework.RegisterHTTPFunctionContext
指定函数目标和签名类型。
Java
Java Functions 框架按以下优先级顺序(从最具体到最宽泛)接受来自三种不同来源的配置数据:
- 命令行参数
- 构建文件
- 环境变量
命令行参数
Maven
您可以通过向 mvn
命令添加以下命令行界面 (CLI) 标志来指定要运行的函数:
-Drun.functionTarget=YOUR_FUNCTION_NAME
您还可以通过类似方式添加以下 CLI 标志来指定目标端口:
-Drun.port=12345
Gradle
Gradle 的 CLI 标志与 Maven 的 CLI 标志几乎完全相同。Gradle 唯一所做的更改是将每个标志中的前导 -D
替换为 -P
,如以下示例所示:
# Maven version -Drun.functionTarget=... # Gradle version -Prun.functionTarget=...
构建文件
您还可以指定要在项目的构建文件中运行的函数。虽然 Maven 和 Gradle 的 CLI 标志类似,但其构建文件子句有显著的区别。
Maven
Maven 构建文件命名为 pom.xml
。将以下子句添加到该文件可指定目标函数:
将 <functionTarget>
替换为函数的类名称。(例如,functions
包中类名称为 HelloCloudFunctions
的函数将有一个类名称 functions.HelloCloudFunctions
。它相对于父级构建文件 - pom.xml
或 build.gradle
。)
Gradle
Gradle 构建文件命名为 build.gradle
。将以下子句添加到该文件可指定目标函数:
C#
如果您使用 dotnet new
和上面指定的模板之一创建项目,则 .NET Functions 框架将自动检测函数。
如果您的项目包含多个函数,请参阅运行框架部分,了解如何运行特定函数。
Ruby
借助 Ruby Cloud Functions 框架,您可以将函数的名称和签名类型指定为命令行参数或环境变量。在运行框架时必须指定命令行参数。
PHP
PHP Cloud Functions 框架允许您将环境变量指定为命令行参数。
您还可以通过添加 start
脚本在 composer.json
构建文件中指定这些值,如以下示例所示。
"scripts": { "start": [ "Composer\\Config::disableProcessTimeout", "FUNCTION_TARGET=YOUR_FUNCTION_NAME php -S localhost:${PORT:-8080} vendor/bin/router.php" ] }
将 YOUR_FUNCTION_NAME 替换为您的函数名称,并将 YOUR_SIGNATURE_TYPE(如果适用)替换为您的函数的签名类型,如上表所示。
运行 Functions 框架
使用以下命令可以通过 Functions 框架运行函数。默认情况下,除非您明确指定 PORT
值,否则可通过 localhost:8080
访问函数。
Node.js
npm start
Python
使用命令行参数:
functions-framework --target=YOUR_FUNCTION_NAME
使用环境变量
FUNCTION_TARGET=YOUR_FUNCTION_NAME functions-framework
将 YOUR_FUNCTION_NAME 替换为函数的方法名称。
Go
cd cmd go build ./cmd
使用环境变量:
cd cmd go build PORT=8080 ./cmd
Java
Maven
使用以下命令可运行 pom.xml
中指定的函数:
mvn function:run
使用以下命令可运行命令行参数中指定的函数:
mvn function:run -Drun.functionTarget=YOUR_FUNCTION_NAME
使用以下命令可运行指定为环境变量的函数:
FUNCTION_TARGET=YOUR_FUNCTION_NAME mvn function:run
将 YOUR_FUNCTION_NAME 替换为函数的类名称。
Gradle
使用以下命令可运行 build.gradle
中指定的函数:
./gradlew runFunction
使用以下命令可运行命令行参数中指定的函数:
./gradlew runFunction -Prun.functionTarget=YOUR_FUNCTION_NAME
使用以下命令可运行指定为环境变量的函数:
FUNCTION_TARGET=YOUR_FUNCTION_NAME ./gradlew runFunction
将 YOUR_FUNCTION_NAME 替换为函数的类名称。
C#
如果当前 .NET 项目中只存在一个函数,则使用以下命令可运行函数。(这是使用模板创建的项目的默认结构。)
dotnet run
如果 .NET 项目包含多个函数,请使用以下命令运行特定函数。将 YOUR_FUNCTION_CLASSNAME 替换为函数的类名称,包括命名空间。
dotnet run YOUR_FUNCTION_CLASSNAME
如果您要同时运行多个函数,则需要运行多个 Functions 框架实例。为避免正在运行的框架实例之间发生冲突,每个实例应使用不同的 PORT
值。以下命令展示了如何使用值为 8080
的 PORT
运行函数。
使用命令行参数:
dotnet run --target YOUR_FUNCTION_CLASSNAME --port 8080
使用环境变量:
FUNCTION_TARGET=YOUR_FUNCTION_CLASSNAME PORT=8080 dotnet run
Ruby
使用命令行参数:
bundle exec functions-framework-ruby --target YOUR_FUNCTION_NAME
使用环境变量:
FUNCTION_TARGET=YOUR_FUNCTION_NAME bundle exec functions-framework-ruby
将 YOUR_FUNCTION_NAME 替换为函数的方法名称。
PHP
export FUNCTION_TARGET=YOUR_FUNCTION_NAME php -S localhost:8080 vendor/bin/router.php
将 YOUR_FUNCTION_NAME 替换为函数的名称。
调用函数
如需了解如何与本地运行的函数进行交互,请参阅调用本地函数页面。
清理
函数运行完毕后,可以按 Ctrl+C 停止正在运行的框架实例。