extism:用于构建与运行WebAssembly应用的框架


使用 WebAssembly (wasm) 进行构建的框架。轻松加载 wasm 模块、移动数据、调用函数以及构建可扩展的应用程序。

Extism 是一个使用 WebAssembly (Wasm) 进行构建的轻量级框架。它支持在服务器、边缘、CLI、物联网、浏览器以及介于两者之间的所有设备上运行 Wasm 代码。Extism 被设计为“通用”,因为它支持通用接口,无论它在哪里运行。

此外,Extism 在标准 Wasm 运行时之上添加了一些额外的实用程序。例如,我们支持持久内存/模块范围变量、无需 WASI 的安全且主机控制的 HTTP、运行时限制器和计时器、更简单的主机函数链接等等。存在主义用户构建:

  • 插件系统
  • FaaS 平台
  • 代码生成器
  • 网络应用程序

Java案例

1、安装 Extism 运行时依赖项
对于这个库,您首先需要安装 Extism Runtime。您可以直接从版本下载共享对象或使用Extism CLI来安装它:

sudo extism lib install latest

#=> Fetching https://github.com/extism/extism/releases/download/v0.5.2/libextism-aarch64-apple-darwin-v0.5.2.tar.gz
#=> Copying libextism.dylib to /usr/local/lib/libextism.dylib
#=> Copying extism.h to /usr/local/include/extism.h

要将 Extism java-sdk 与 Maven 一起使用,您需要将以下依赖项添加到您的pom.xml文件中:

<dependency>
    <groupId>org.extism.sdk</groupId>
    <artifactId>extism</artifactId>
    <version>1.0.0</version>
</dependency>

创建插件
Extism 的主要概念是插件。您可以将插件视为存储在.wasm文件中的代码模块。由于您手头可能没有 Extism 插件来测试,让我们从网络加载一个演示插件:

import org.extism.sdk.manifest.Manifest;
import org.extism.sdk.wasm.UrlWasmSource;
import org.extism.sdk.Plugin;

var url = "https://github.com/extism/plugins/releases/latest/download/count_vowels.wasm";
var manifest = new Manifest(List.of(UrlWasmSource.fromUrl(url)));
var plugin = new Plugin(manifest, false, null);

调用插件的导出
这个插件是用 Rust 编写的,它只做一件事,计算字符串中的元音。因此,它公开了一个“导出”功能:count_vowels. 我们可以使用Plugincall调用导出

var output = plugin.call("count_vowels", "Hello, World!");
System.out.println(output);
// => "{"count": 3, "total": 3, "vowels": "aeiouAEIOU"}"

所有导出都有一个简单的字节输入和字节输出接口。该插件恰好接受一个字符串并返回一个 JSON 编码的字符串以及结果报告。

插入状态
插件可以是有状态的或无状态的。插件可以通过使用变量来维护黑白调用状态。我们的元音计数插件会记住结果中“总计”键中所计数的元音总数。您可以通过对导出进行后续调用来查看这一点:

var output = plugin.call("count_vowels", "Hello, World!");
System.out.println(output);
// => "{"count": 3, "total": 6, "vowels": "aeiouAEIOU"}"

var output = plugin.call("count_vowels", "Hello, World!");
System.out.println(output);
// => "{"count": 3, "total": 9, "vowels": "aeiouAEIOU"}"

这些变量将一直存在,直到该插件被释放或您初始化一个新插件为止。

配置
插件可以选择采用配置对象。这是配置插件的静态方式。我们的计数元音插件采用可选配置来更改哪些字符被视为元音。例子:

var plugin = new Plugin(manifest, false, null);
var output = plugin.call("count_vowels", "Yellow, World!");
System.out.println(output);
// => {"count": 3, "total": 3, "vowels": "aeiouAEIOU"}

// Let's change the vowels config it uses to determine what is a vowel:
var config = Map.of("vowels", "aeiouyAEIOUY");
var manifest2 = new Manifest(List.of(UrlWasmSource.fromUrl(url)), null, config);
var plugin = new Plugin(manifest2, false, null);
var output = plugin.call("count_vowels", "Yellow, World!");
System.out.println(output);
// => {"count": 4, "total": 4, "vowels": "aeiouyAEIOUY"}
// ^ note count changed to 4 as we configured Y as a vowel this time