25个版本 (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日 |
#13 in #func
在 azure-functions 中使用
250KB
6K SLoC
注意
⚠️
该项目不再由原始作者积极维护。
鼓励进行分叉或衍生作品!
Rust的Azure Functions
一个用于在Rust中实现Azure Functions的框架。
🚩 免责声明
此项目不是微软官方认可的产品,也不代表微软对任何未来产品推出的认可。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
这会在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
中。
安装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
如果您使用的是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应用程序
使用Visual Studio Code和CodeLLDB扩展调试Azure Functions应用程序是最简单的方法。
默认情况下,当您运行cargo func new-app
时,Rust SDK的Azure Functions将创建一个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
使用“Linux(预览)”操作系统在Azure中创建“Function App (Classic)”,在“发布”设置下选择“Docker镜像”。
在“配置容器”部分,选择仓库并输入您推送到那里的镜像。
就是这样!一旦Azure中的Function 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 | 无 |
GenericInput | 通用输入 | in | 无 |
通用输出 | 通用输出 | out | 无 |
通用触发器 | 通用触发器 | in | 无 |
HTTP请求 | HTTP触发器 | in | 无 |
HTTP响应 | 输出HTTP响应 | out | 无 |
队列消息 | 输出队列消息 | out | 是 |
队列触发器 | 队列触发器 | in | 无 |
SendGrid消息 | SendGrid电子邮件消息 | out | 是 |
服务总线消息 | 服务总线输出消息 | out | 是 |
服务总线触发器 | 服务总线触发器 | 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消息
服务总线消息
SignalR组操作
SignalR消息
Twilio短信消息
对于返回单个输出绑定类型的函数,绑定具有特殊名称$return
,并被视为函数的返回值。
对于返回输出绑定类型的元组的函数,元组的第一个值具有绑定名称 $return
,并将其视为函数的返回值。其余值具有绑定名称 output1
、output2
、...、output(N-1)
,其中 N
是元组中类型的数量,并且仅作为输出绑定处理。
单元元组 ()
可以在元组中使用以“跳过”一个绑定
#[func]
...
pub fn example(...) -> ((), Blob) {
...
}
对于上述示例,没有 $return
绑定,Azure Function 不返回任何值。相反,使用一个名为 output1
的单个输出绑定。
贡献者
感谢这些优秀的人们 (emoji key)
Peter Huene 💻 🐛 📖 🤔 🚇 🚧 📦 👀 ⚠️ ✅ |
Ryan Levick 💻 🤔 🚧 👀 🚇 |
Thomas Eckert 💻 🖋 🎨 📖 🤔 🚇 🚧 👀 ✅ |
R. Tyler Croy 💻 📖 👀 🤔 |
Denis Molokanov 💻 ⚠️ 🎨 🤔 |
Scott Lyons 💻 ⚠️ 🎨 🤔 |
Rohan Prinja 💻 |
克里斯蒂安·布雷维克 🐛 💻 ✅ |
丹尼·布朗宁 💻 🚧 |
本项目遵循 all-contributors 规范。欢迎任何形式的贡献!
lib.rs
:
Rust的Azure Functions
此软件包支持为 azure-functions
软件包进行代码生成。
依赖项
约11-14MB
约251K SLoC