使用 WebAssembly,您可以安全地运行用其他语言编写并编译的代码。运行时执行 WebAssembly 模块(Wasm),这些模块通常是带有 .wasm
扩展名的二进制文件。
Wasm 绑定允许您通过传递命令行参数或环境变量来调用编译为 Wasm 的程序,就像使用普通子进程一样。例如,即使 Dapr 是用 Go 编写的并运行在没有安装 Python 的平台上,您也可以使用 Python 满足调用需求!
Wasm 二进制文件必须是使用 WebAssembly 系统接口(WASI)编译的程序。二进制文件可以是您编写的程序,例如用 Go 编写的,或者是您用来运行内联脚本的解释器,例如 Python。
至少,您需要指定一个使用标准 WASI 版本 wasi_snapshot_preview1
(又名 wasip1
)编译的 Wasm 二进制文件,通常缩写为 wasi
。
注意: 如果在 Go 1.21+ 中编译,这是
GOOS=wasip1 GOARCH=wasm
。在 TinyGo、Rust 和 Zig 中,这是目标wasm32-wasi
。
您还可以重用现有的二进制文件。例如,Wasm 语言运行时分发已经编译为 WASI 的解释器(包括 PHP、Python 和 Ruby)。
Wasm 二进制文件可以从 URL 加载。例如,URL file://rewrite.wasm
会从进程的当前目录加载 rewrite.wasm
。在 Kubernetes 上,请参阅如何:将 Pod 卷挂载到 Dapr sidecar以配置可以包含 Wasm 二进制文件的文件系统挂载。也可以从远程 URL 获取 Wasm 二进制文件。在这种情况下,URL 必须准确指向一个 Wasm 二进制文件。例如:
http://example.com/rewrite.wasm
,或https://example.com/rewrite.wasm
。Dapr 使用 wazero 来运行这些二进制文件,因为它没有依赖项。这允许使用 WebAssembly 而无需安装过程,除了 Dapr 本身。
Wasm 输出绑定支持使用 wasi-http 规范进行 HTTP 客户端调用。您可以在此处找到用多种语言进行 HTTP 调用的示例代码:
要配置 Wasm 绑定,请创建一个类型为 bindings.wasm
的组件。请参阅本指南了解如何创建和应用绑定配置。
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
name: wasm
spec:
type: bindings.wasm
version: v1
metadata:
- name: url
value: "file://uppercase.wasm"
字段 | 详情 | 必需 | 示例 |
---|---|---|---|
url | 包含要实例化的 Wasm 二进制文件的资源 URL。支持的方案包括 file:// 、http:// 和 https:// 。file:// URL 的路径相对于 Dapr 进程,除非它以 / 开头。 | true | file://hello.wasm , https://example.com/hello.wasm |
此组件支持具有以下操作的输出绑定:
execute
如果存在,data
字段将是程序的 STDIN。您可以选择性地为每个请求传递元数据属性:
args
任何 CLI 参数,逗号分隔。这不包括程序名称。例如,考虑将 url
绑定到 Ruby 解释器,例如来自 webassembly-language-runtimes:
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
name: wasm
spec:
type: bindings.wasm
version: v1
metadata:
- name: url
value: "https://github.com/vmware-labs/webassembly-language-runtimes/releases/download/ruby%2F3.2.0%2B20230215-1349da9/ruby-3.2.0-slim.wasm"
假设您想在端口 3500 启动 Dapr 并使用 Wasm 绑定,您可以运行:
$ dapr run --app-id wasm --dapr-http-port 3500 --resources-path components
以下请求响应 Hello "salaboy"
:
$ curl -X POST http://localhost:3500/v1.0/bindings/wasm -d'
{
"operation": "execute",
"metadata": {
"args": "-ne,print \"Hello \"; print"
},
"data": "salaboy"
}'