#azure #function #bindings #generation #shared #func #azure-sdk

azure-functions-shared-codegen

Rust版的Azure Functions共享代码生成支持

22个版本 (10个重大更新)

0.11.0 2019年11月12日
0.10.0 2019年7月15日
0.9.0 2019年6月11日
0.6.0 2019年3月19日
0.1.5 2018年7月28日

#14 in #func


3个crate使用(通过azure-functions-shared

MIT协议

23KB
521

注意

⚠️

此项目不再由原作者积极维护。

鼓励进行分叉或派生作品!

Rust版的Azure Functions

crates-status docs-status all-contributors-status gitter-status build-status dependabot-status license-status

一个用于在Rust中实现Azure Functions的框架。

🚩 免责声明
此项目不是Microsoft官方认可的产品,也不是对Microsoft未来产品提供的认可。

Microsoft和Azure是Microsoft公司的注册商标。

如果您希望Azure Functions团队考虑支持Rust,请为此反馈项投票

示例

一个简单的HTTP触发的Azure Function

use azure_functions::{
    bindings::{HttpRequest, HttpResponse},
    func,
};

#[func]
pub fn greet(req: HttpRequest) -> HttpResponse {
    format!(
        "Hello from Rust, {}!\n",
        req.query_params().get("name").map_or("stranger", |x| x)
    )
    .into()
}

Rust版的Azure Functions也支持异步函数

use azure_functions::{
    bindings::{HttpRequest, HttpResponse},
    func,
};
use futures::future::ready;

#[func]
pub async fn greet_async(req: HttpRequest) -> HttpResponse {
    // Use ready().await to simply demonstrate the async/await feature
    ready(format!(
        "Hello from Rust, {}!\n",
        req.query_params().get("name").map_or("stranger", |x| x)
    ))
    .await
    .into()
}

有关更多信息,请参阅构建异步Azure Functions应用程序

入门

目录

安装

要求

.NET Core SDK

同步 Azure Functions Host 绑定扩展需要 .NET Core SDK。

例如,使用 Cosmos DB 绑定需要为 Azure Functions Host 安装以下扩展:Microsoft.Azure.WebJobs.Extensions.CosmosDB

当应用程序初始化时,Azure Functions for Rust 会自动完成此操作。

请按照 2.2 .NET Core SDK 的下载说明 进行安装,适用于 Windows、macOS 或您的 Linux 发行版。

Azure Functions Core Tools

安装 Azure Functions Core Tools 的 2 或更高版本。

如果您使用的是 Windows,必须将 %ProgramFiles%\nodejs\node_modules\azure-functions-core-tools\bin(其中 func.exe 位于此处)添加到 PATH 环境变量中。

安装Rust版的Azure Functions SDK

使用 cargo install 安装 Azure Functions for Rust SDK。

cargo install azure-functions-sdk

这将安装一个新的 cargo 命令 func,可用于创建和运行新的 Azure Functions 应用程序。

创建新的Azure Functions应用程序

使用 cargo func new-app 命令创建一个新的 Azure Functions 应用程序。

cargo func new-app hello

这将创建一个名为 ./hello 的目录,并在其中创建一个名为 functions 的模块,其中预期放置导出的 Azure Functions。

添加简单的HTTP触发应用程序

使用 cargo func new 命令创建一个新的名为 hello 的 HTTP 触发 Azure Function。

cargo func new http -n hello

函数的源代码将在 src/functions/hello.rs 中。

构建Azure Functions应用程序

要构建您的 Azure Functions 应用程序,只需使用 cargo build

cargo build

如果您使用的是 nightly 编译器,可以在编译期间启用改进的错误消息。

将以下内容添加到您的 Cargo.toml

[features]
unstable = ["azure-functions/unstable"]

构建您的应用程序

cargo build --features unstable

这使 Azure Functions for Rust 能够在属性内输出包含错误位置的诊断消息。

构建异步Azure Functions应用程序

要构建支持异步 Azure Functions 的应用程序,请将以下内容添加到您的 Cargo.toml

[dependencies]
futures-preview = "0.3.0-alpha.19"

然后进行构建

cargo build

运行Azure Functions应用程序

要构建和运行您的 Azure Functions 应用程序,请使用 cargo func run

cargo func run

如果需要启用 unstable 功能,请向 cargo 传递 --features 选项。

cargo func run -- --features unstable

cargo func run 命令会在本地使用由 Azure Functions Core Tools 安装的 Azure Function Host 构建并运行您的应用程序。

默认情况下,主机将配置为监听 0.0.0.0:8080

对于之前添加的 hello 函数,它可以通过 https://127.0.0.1:8080/api/hello 调用。

调试Azure Functions应用程序

调试 Azure Functions 应用程序最简单的方法是使用Visual Studio CodeCodeLLDB扩展。

默认情况下,Azure Functions for Rust SDK 会在您运行cargo func new-app时创建一个 Visual Studio Code 启动配置。

这将启用一个Debug启动配置,它会在将lldb调试器附加到Rust工作进程之前,在本地构建并运行您的应用程序。

部署Azure Functions应用程序

将来,将会有一个cargo func deploy命令,可以直接将 Azure Functions 应用程序部署到 Azure。

在此之前,您必须手动构建并将 Docker 镜像推送到 Azure 可访问的仓库。

注意:这需要至少18.06版本的Docker以支持实验性的 BuildKit 支持。

要启用 BuildKit 支持,在运行docker build之前将环境变量DOCKER_BUILDKIT设置为1

首先,使用docker build -t $TAG_NAME .构建您的镜像。

docker build -t $TAG_NAME .

其中$TAG_NAME是要使用的标签名称(例如username/my-functions-app)。

使用docker push将镜像推送到 Azure Functions 可访问的仓库。

docker push $TAG_NAME

Azure中使用“Linux(预览)”操作系统创建“函数应用(经典)”。在“发布”设置下,选择“Docker Image”。

在“配置容器”部分,选择仓库并输入您推送的镜像。

就这样!一旦 Azure 中的 Functions App 启动,您应该能够查看并运行函数。

Azure Functions绑定

Azure Functions 支持各种输入和输出绑定,这些绑定可以被函数使用。

在 C# 等语言中,参数可以用描述参数如何绑定的属性进行注解。

Rust 不支持参数上的属性,因此应用于具有与参数标识符匹配名称的函数的#[binding]属性。属性的参数取决于绑定类型。

使用#[func]属性可以将一个普通的 Rust 函数转换成 Azure Function。它是通过检查函数的参数和返回类型,并自动将它们映射到相应的绑定来实现的。

支持的绑定列表

Rust 类型 Azure Functions 绑定 方向 Vec<T>
Blob 输入和输出 Blob in, inout, out
BlobTrigger Blob 触发器 in, inout
CosmosDbDocument 输入和输出 Cosmos DB 文档 in, out
CosmosDbTrigger Cosmos DB 触发器 in
DurableActivityContext 持久性活动触发器 in
DurableOrchestrationClient 持久性编排客户端 in
DurableOrchestrationContext 持久性编排触发器 in
EventGridEvent 事件网格触发器 in
EventHubMessage 事件中心输出消息 out
EventHubTrigger 事件中心触发器 in
通用输入 通用输入 in
通用输出 通用输出 out
通用触发器 通用触发器 in
HTTP请求 HTTP触发器 in
HTTP响应 输出HTTP响应 out
队列消息 输出队列消息 out
队列触发器 队列触发器 in
SendGrid消息 SendGrid电子邮件消息 out
Service Bus消息 Service Bus输出消息 out
Service Bus触发器 Service Bus触发器 in
SignalR连接信息 SignalR连接信息 in
SignalR组操作 SignalR组操作 out
SignalR消息 SignalR消息 out
输入和输出表 in, out
定时器信息 定时器触发器 in
Twilio短信消息 Twilio短信消息输出 out

未来将实现更多绑定,包括支持从自定义绑定中检索数据。

Rust中的绑定

Azure Functions for Rust自动根据绑定在函数声明中的使用方式推断绑定的方向。

输入绑定

类型为T&T的参数,其中T是触发器或输入绑定类型,被推断为具有in方向的绑定。

#[func]
...
pub fn example(..., blob: Blob) {
    ...
}
#[func]
...
pub fn example(..., blob: &Blob) {
    ...
}

此外,一些输入绑定类型支持类型为Vec<T>&Vec<T>的参数,其中T是输入绑定类型

#[func]
...
pub fn example(..., documents: Vec<CosmosDbDocument>) {
    ...
}

以下输入绑定支持类型为Vec<T>

  • CosmosDbDocument

输入-输出(inout)绑定

类型为&mut T的参数,其中T是支持inout方向的触发器或输入绑定类型,被推断为具有inout方向的绑定。

#[func]
...
pub fn example(..., blob: &mut Blob) {
    ...
}

注意:目前除C#以外的语言尚未实现inout方向的绑定。

有关Azure Functions Host的此问题,请参阅此问题

输出绑定

返回类型为T的函数,其中T是输出绑定类型,或输出绑定类型的元组,被推断为具有out方向的绑定。

#[func]
...
pub fn example(...) -> Blob {
    ...
}

函数还可以返回任何输出绑定类型TOption<T>None值将跳过输出值。

#[func]
...
pub fn example(...) -> Option<Blob> {
    ...
}
#[func]
...
pub fn example(...) -> (HttpResponse, Option<Blob>) {
    ...
}

此外,一些输出绑定类型支持返回Vec<T>,其中T是输出绑定类型

#[func]
...
pub fn example(...) -> Vec<CosmosDbDocument>) {
    ...
}

以下输出绑定支持返回类型Vec<T>

  • CosmosDbDocument
  • EventHubMessage
  • 队列消息
  • SendGrid消息
  • Service Bus消息
  • SignalR组操作
  • SignalR消息
  • Twilio短信消息

对于返回单个输出绑定类型的函数,绑定具有特殊的名称$return,并被视为函数的返回值。

对于返回输出绑定类型的元组的函数,元组的第一个值是具有绑定名 $return 的,并将其视为函数的返回值。其余值具有绑定名 output1output2、...、output(N-1),其中 N 是元组中类型的数量,并且仅作为输出绑定处理。

单元元组 () 可用于元组中以“跳过”一个绑定

#[func]
...
pub fn example(...) -> ((), Blob) {
    ...
}

对于上述示例,没有 $return 绑定,Azure Function 不返回任何值。相反,使用单个名为 output1 的输出绑定。

贡献者

感谢这些优秀的人们(表情符号键


彼得·胡恩

💻 🐛 📖 🤔 🚇 🚧 📦 👀 ⚠️

莱恩·莱维克

💻 🤔 🚧 👀 🚇

托马斯·艾克特

💻 🖋 🎨 📖 🤔 🚇 🚧 👀

R. 泰勒·克洛伊

💻 📖 👀 🤔

德尼·莫洛卡诺夫

💻 ⚠️ 🎨 🤔

斯科特·莱昂斯

💻 ⚠️ 🎨 🤔

Rohan Prinja

💻

Christian Brevik

🐛 💻

Danny Browning

💻 🚧

此项目遵循 all-contributors 规范。欢迎各种形式的贡献!


lib.rs:

Rust版的Azure Functions

此crate支持为azure-functions-shared crate生成代码。

依赖

~1.5MB
~35K SLoC