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)
23KB
521 行
注意
⚠️
此项目不再由原作者积极维护。
鼓励进行分叉或派生作品!
Rust版的Azure Functions
一个用于在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 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 支持。
要启用 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 {
...
}
函数还可以返回任何输出绑定类型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
队列消息
SendGrid消息
Service Bus消息
SignalR组操作
SignalR消息
Twilio短信消息
对于返回单个输出绑定类型的函数,绑定具有特殊的名称$return
,并被视为函数的返回值。
对于返回输出绑定类型的元组的函数,元组的第一个值是具有绑定名 $return
的,并将其视为函数的返回值。其余值具有绑定名 output1
、output2
、...、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