ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

在 Apache OpenWhisk 中创建与调用 Rust Action:从单文件函数到 zip 打包依赖

在 Apache OpenWhisk 中创建与调用 Rust Action:从单文件函数到 zip 打包依赖 云原生后端微服务【免费下载链接】openwhiskApache OpenWhisk is an open source serverless cloud platform项目地址https://gitcode.com/gh_mirrors/op/openwhisk点击查看免费下载Apache OpenWhisk 支持以 Rust 语言编写无服务器 Action动作。本文以仓库中的 docs/actions-rust.md 为核心完整讲解 Rust Action 的创建、入口函数约定、JSON 对象/数组返回值、wskCLI 调用方式以及当需要引入第三方 crate 依赖时如何将源码与 Cargo 清单打包成 zip 交付给运行时。读完本文你将能够从零编写一个可运行的 Rust Action并掌握多文件工程化打包的完整流程。创建 Rust Action 的基础一个顶层函数与 OpenWhisk 其他语言的 Action 基础 一致Rust Action 的创建过程与其他语言类似你只需要导出一个顶层函数函数接收 JSON 输入、返回 JSON 输出OpenWhisk 平台负责调度、隔离与结果回传。例如创建文件hello.rs内容如下extern crate serde_json; use serde_derive::{Deserialize, Serialize}; use serde_json::{Error, Value}; #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] struct Input { #[serde(default stranger)] name: String, } #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] struct Output { greeting: String, } fn stranger() - String { stranger.to_string() } pub fn main(args: Value) - ResultValue, Error { let input: Input serde_json::from_value(args)?; let output Output { greeting: format!(Hello, {}, input.name), }; serde_json::to_value(output) }这段代码体现了 Rust Action 的两个核心约定入口函数mainRust Action 的主体是一个main函数它接收一个 JSONserde_json::Value作为输入返回一个包含 JSONserde_json::Value的Result。强类型的参数解析借助serde_derive的Deserialize运行时传入的 JSON 对象被反序列化进自定义的Input结构体通过#[serde(default stranger)]为name字段提供默认值——当调用方未传name参数时stranger()函数会返回stranger作为兜底。返回值同理Output结构体经Serialize后由serde_json::to_value转回 JSON。返回 JSON 数组Action 不止支持对象Action 的返回值不仅支持 JSON 对象同样支持 JSON 数组。这与仓库中 proposals/POEM-support-array-result.md 记录的增强方向一致OpenWhisk 允许 Action 返回数组这一合法的 JSON 值并支持序列SequenceAction 中的传递。一个最简单的返回数组示例extern crate serde_json; use serde_derive::{Deserialize, Serialize}; use serde_json::{Error, Value}; pub fn main(args: Value) - ResultValue, Error { let output [a, b]; serde_json::to_value(output) }你也可以创建序列 Action——只要序列中的 Action 能接收数组参数并返回数组结果。下面的示例演示如何解析入参当入参是数组时原样返回否则返回默认数组extern crate serde_json; use serde_derive::{Deserialize, Serialize}; use serde_json::{Error, Value}; pub fn main(args: Value) - ResultValue, Error { let inputParam args.as_array(); let defaultOutput [c, d]; match inputParam { None serde_json::to_value(defaultOutput), Some(x) serde_json::to_value(x), } }这里args.as_array()返回OptionVecValue通过match分别处理「入参不是数组」与「入参是数组」两种情况是编写可复用序列组件的常用写法。关于序列 Action 的完整语义前一个 Action 的结果成为后一个 Action 的输入等可参考 docs/actions.md。指定入口函数--mainAction 的入口方法默认是main但与其他 Action 类型一样你可以在创建 Action 时通过wskCLI 的--main显式指定其他函数作为入口。也就是说一个.rs源文件中可以包含多个pub fn只要在创建时用--main 函数名指明哪一个才是调用入口即可。创建并调用 Rust Action有了hello.rs之后用wskCLI 创建名为helloRust的 Actionwsk action create helloRust --kind rust:1.34 hello.rsCLI 会根据源文件扩展名自动推断 Action 类型对于.rs源文件Action 将运行在 Rust v1.34 运行时上--kind rust:1.34可省略也可以显式写出以锁定运行时版本。从仓库中的运行时清单 ansible/files/runtimes.json 可以看到rust语言族目前只登记了一个 kind——rust:1.34且被标记为default: true对应的镜像为openwhisk/action-rust-v1.34tag: nightlyattached配置表明源码以codefile附件text/plain形式上送。这意味着当前仓库所锚定的 Rust 运行时即 v1.34编写代码时请以该版本的 Rust 工具链与 crate 生态为准。Rust Action 的调用方式与任何其他 Action 完全相同wsk action invoke --result helloRust --param name World返回结果{ greeting: Hello World! }--result让 CLI 只展示 Action 的返回结果而非完整激活记录--param name World以键值对形式传入参数。关于参数传递的更多细节默认参数、序列中的参数流等可参考 docs/parameters.md 一节。将 Rust Action 打包成 zip引入第三方依赖当你的 Action 需要外部依赖即 Cargo 管理的第三方 crate时仅提供单个.rs文件就不够了你需要提供一个 zip 文件其中包含源码和带全部依赖声明的 Cargo 清单。打包时有两条硬性约定包含入口函数如main的源文件名必须是lib.rs目录结构必须如下|- Cargo.toml |- src |- lib.rs一个示例Cargo.toml[package] name actions version 0.1.0 authors [John Doe johndoe.com] edition 2018 [dependencies] serde_json 1.0 serde 1.0 serde_derive 1.0其中edition 2018与 Rust 1.34 运行时相匹配serde_json、serde、serde_derive是编写 OpenWhisk Rust Action 最常用的一组依赖serde_json负责Value的解析与序列化serde_derive负责结构体的派生宏。打包 zipzip -r helloRust.zip Cargo.toml src然后创建 Action注意此时传入的是 zip 文件而非单个.rswsk action create helloRust --kind rust:1.34 helloRust.zip运行时容器会解压该 zip按照Cargo.toml声明的依赖编译src/lib.rs并以其中main或--main指定的函数作为调用入口。源码与测试印证除了 docs/actions-rust.md 本身仓库中还提供了 Rust Action 的实际运行验证材料测试数据 tests/dat/actions/unicode.tests/rust-1.34.txt 中的 Rust 示例展示了另一种典型写法通过Input结构体解析delimiter参数并在main中用format!拼接含 Unicode 字符☃的输出最后打印并返回Output结构体——这验证了 Rust Action 支持非 ASCII 字符输入输出的能力也印证了「结构体反序列化入参 结构体序列化出参」这一标准模式。运行时注册信息 ansible/files/runtimes.json 确认了rust:1.34是当前唯一的 Rust kind 且为默认运行时镜像名为action-rust-v1.34。小结在 Apache OpenWhisk 中使用 Rust 编写 Action 的关键点可归纳为四条一是用pub fn main(args: Value) - ResultValue, Error作为入口可用--main替换二是入参与返回值都用serde_json::Value承载且返回值既可以是 JSON 对象也可以是 JSON 数组序列 Action 依赖后者三是单文件直接用wsk action create --kind rust:1.34 hello.rs创建四是涉及第三方 crate 时必须打包为Cargo.tomlsrc/lib.rs结构的 zip 后上传。掌握这四点你就能把 Rust 的高性能与内存安全特性无缝接入 OpenWhisk 的无服务器事件处理链路。赞分享云原生后端微服务【免费下载链接】openwhiskApache OpenWhisk is an open source serverless cloud platform项目地址https://gitcode.com/gh_mirrors/op/openwhisk点击查看免费下载相关推荐3 步修复华硕笔记本屏幕发白G-Helper 色彩配置文件快速修复指南3 步修复华硕笔记本屏幕发白G Helper 色彩配置文件快速修复指南 打了一晚上夜店地图画面却像蒙了层白雾黑不够黑、红不够红。你在系统里来回切换 sRG云原生后端微服务Apache Pulsar函数依赖管理Python/Java依赖打包方案Apache Pulsar函数依赖管理Python/Java依赖打包方案 在分布式消息系统Apache Pulsar中函数Function是处理流数据的消息队列后端tiny11builder一条脚本生成精简版 Windows 11 安装镜像tiny11builder一条脚本生成精简版 Windows 11 安装镜像 tiny11builder 是 NTDevLabs 开发的 PowerShell操作系统上一篇还在给壁纸交钱这款免费开源的创意工坊下载器了解一下下一篇OBS多路推流终极指南免费插件实现多平台同时直播的完整教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进