1 个不稳定版本
0.11.0 | 2019年11月12日 |
---|
#11 在 #func
每月 39 次下载
用于 azure-functions
31KB
655 行
注意
⚠️
该项目不再由原始作者积极维护。
鼓励进行分支或派生作品!
Rust 的 Azure Functions
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 Code 的 CodeLLDB 扩展。
默认情况下,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 {
...
}
函数还可以返回任何输出绑定类型 T
的 Option<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
并被视为函数的返回值。剩余的值具有绑定名称 output1
、output2
、...、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