1 个不稳定版本

0.11.0 2019年11月12日

#11#func

每月 39 次下载
用于 azure-functions

MIT 许可证

31KB
655

注意

⚠️

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

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

Rust 的 Azure Functions

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

Azure Functions 在 Rust 中的实现框架。

🚩 免责声明
本项目不是官方认可的微软产品,也不代表微软对任何未来产品提供的认可。

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

如果您希望 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()
}

Azure Functions for Rust 也支持 异步 函数

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

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

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

这将在 Azure Functions for Rust 初始化应用程序时自动发生。

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

Azure Functions 核心工具

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

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

安装 Azure Functions for Rust SDK

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

cargo install azure-functions-sdk

这会安装一个名为 func 的新 cargo 命令,可用于创建和运行新的 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

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

将以下内容添加到您的 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 功能,请将 --features 选项传递给 cargo

cargo func run -- --features unstable

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

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

对于之前添加的 hello 函数,可以通过 http://localhost: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支持。Docker

要启用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镜像”。

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

这就完成了!一旦Azure中的函数应用启动,您应该能够查看并运行这些函数。

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
GenericInput 通用输入 in
GenericOutput 通用输出 out
GenericTrigger 通用触发器 in
HttpRequest HTTP触发器 in
HttpResponse 输出HTTP响应 out
QueueMessage 输出队列消息 out
QueueTrigger 队列触发器 in
SendGridMessage SendGrid电子邮件消息 out
ServiceBusMessage 服务总线输出消息 out
ServiceBusTrigger 服务总线触发器 in
SignalRConnectionInfo SignalR 连接信息 in
SignalRGroupAction SignalR 群组操作 out
SignalR 消息 SignalR 消息 out
表格 输入和输出表格 in, out
TimerInfo 定时器触发 in
TwilioSmsMessage Twilio SMS 消息输出 out

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

Rust 中的绑定

Rust 的 Azure 函数自动推断绑定的方向,这取决于绑定在函数声明中的使用方式。

输入绑定

类型为 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
  • QueueMessage
  • SendGridMessage
  • ServiceBusMessage
  • SignalRGroupAction
  • SignalR 消息
  • TwilioSmsMessage

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

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

单元元组 () 可以在元组中使用以“跳过”绑定

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

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

贡献者

感谢这些优秀的人们 (emoji key)


彼得·胡恩

💻 🐛 📖 🤔 🚇 🚧 📦 👀 ⚠️

瑞安·莱维克

💻 🤔 🚧 👀 🚇

托马斯·艾克特

💻 🖋 🎨 📖 🤔 🚇 🚧 👀

R. 泰勒·克劳

💻 📖 👀 🤔

德尼·莫洛卡诺夫

💻 ⚠️ 🎨 🤔

斯科特·莱昂斯

💻 ⚠️ 🎨 🤔

罗汉·普里尼亚

💻

克里斯蒂安·布雷维克

🐛 💻

丹尼·布朗宁

💻 🚧

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


lib.rs:

Rust 的持久函数 HTTP 客户端。

依赖关系

~13MB
~254K SLoC