后端API网关微服务【免费下载链接】shenyuApache ShenYu is a Java native API Gateway for service proxy, protocol conversion and API governance.项目地址https://gitcode.com/gh_mirrors/sh/shenyu点击查看免费下载本文以 ShenYu 仓库中shenyu-plugin-wasm-base模块的 Rust 测试样例rust-plugin-data-handler为主体完整讲解该样例的 wasm 文件构建流程安装工具链、cargo build --target wasm32-wasi、产物命名与重命名规则并结合仓库源码剖析 Java 侧如何通过 Wasmtime 加载 wasm、通过shenyu导入模块实现 Rust 与 Java 的双向数据交换。读完本文你可以独立完成一次完整的 “Rust 编写数据处理器 → 编译为 wasm → 以类名规则重命名 → 作为 classpath 资源被 Java 测试加载运行” 的闭环操作。一、这个 README 在整个 wasm 插件体系中处于什么位置ShenYu 对插件的扩展提供了 WebAssembly 支持核心代码集中在两个模块shenyu-plugin-wasm-api提供 WasmLoader 加载器负责定位.wasm文件、实例化模块、把 Java 函数以导入import形式暴露给 wasmshenyu-plugin-wasm-base提供三类AbstractWasm*Handler抽象基类其中 AbstractWasmPluginDataHandler 对应插件、选择器、规则的数据同步回调handlerPlugin/removePlugin/handlerSelector/removeSelector/handlerRule/removeRule。本 README 所在的 rust-plugin-data-handler 目录就是为验证AbstractWasmPluginDataHandler而编写的 Rust 侧配套工程。目录内的文件分工如下文件作用src/lib.rsRust 插件逻辑导出 6 个数据同步回调函数并导入 Java 侧的get_args/put_resultCargo.toml声明crate-type [cdylib]使构建产物为可被 Wasmtime 加载的共享库形态 wasmAbstractWasmPluginDataHandlerTest.javaJava 测试类内部类TestWasmPluginDataHandler继承抽象基类并定义回调到 Java 的函数src/test/resources 下的 .wasm 文件编译并改名后的 wasm 二进制作为 classpath 资源供测试加载二、构建前置安装 Rust 工具链README 给出的前两步是安装 rustup 与 Rust。补充一点实操细节构建命令指定了--target wasm32-wasi而该目标并不随 Rust 默认工具链安装需要通过 rustup 显式添加rustup target add wasm32-wasi这是执行下文构建命令的前提条件README 未展开此步属于构建wasm32-wasi目标的通用要求。三、生成 wasm 文件构建命令与产物路径README 中的核心构建命令为cd {shenyu}/shenyu-plugin/shenyu-plugin-wasm-base/src/test/rust-plugin-data-handler cargo build --target wasm32-wasi --release其中{shenyu}为 ShenYu 仓库根目录的实际路径。构建完成后README 指出产物位于{shenyu}/shenyu-plugin/shenyu-plugin-wasm-base/src/test/rust-plugin-data-handler/target/wasm32-wasi/release/rust_wasm_data_handler_plugin.wasm这里有一个值得注意的源码级事实当前 Cargo.toml 中包名为rust-plugin-data-handler且crate-type为cdylib。按照 Cargo 对 cdylib 的命名约定实际产物文件名应为librust_plugin_data_handler.wasm带lib前缀、连字符转下划线。这说明 README 中记录的rust_wasm_data_handler_plugin.wasm对应的是较早版本包名执行改名步骤时应以target/wasm32-wasi/release/目录下实际生成的.wasm文件为准不要机械照抄旧文件名。四、重命名规则为什么 wasm 文件名必须叫...Test$TestWasmPluginDataHandler.wasmREADME 第 4 步要求把产物重命名为org.apache.shenyu.plugin.wasm.base.handler.AbstractWasmPluginDataHandlerTest$TestWasmPluginDataHandler.wasm这个看似奇怪的命名含$、长得像一个 Java 类名并非随意规定而是由加载器的资源定位逻辑决定的。查看 WasmLoader 构造函数this.wasmName clazz.getName() .wasm; // locate .wasm lib. URL resource clazz.getClassLoader().getResource(wasmName); if (Objects.isNull(resource)) { throw new ShenyuWasmInitException(Cant find wasm file: wasmName); }要点有三文件名 类的全限定名 .wasm。AbstractWasmPluginDataHandler继承WasmLoader并走默认构造this(null, null)此时clazz即当前实例的运行时类——测试中的内部类TestWasmPluginDataHandler。Java 内部类的Class.getName()用$连接外层类名所以得到org.apache.shenyu.plugin.wasm.base.handler.AbstractWasmPluginDataHandlerTest$TestWasmPluginDataHandler这正是 README 要求的目标文件名wasm 文件必须位于 classpath 根路径下。getClassLoader().getResource(wasmName)是按类路径资源查找的因此改名后的.wasm要放到 src/test/resources 目录下随测试 classpath 一起生效。仓库中已存在该文件即为一次构建改名后的入库产物找不到即快速失败抛出ShenyuWasmInitException。如果跳过 README 第 4 步的重命名或放错目录测试会在构造TestWasmPluginDataHandler时直接报 Cant find wasm file 异常这也是该步骤不可省略的原因。同一约定也适用于模块内另外三个 Rust 样例rust-discovery-handler、rust-meta-data-handler、rust-shenyu-wasm-plugin的 README 均采用相同流程且src/test/resources下对应存在四个.wasm资源文件命名均与各自测试的内部类名一一对应。五、源码纵深Rust 与 Java 之间的双向调用协议理解“为什么要构建这个 wasm”需要看懂两侧代码如何配合。5.1 Rust 侧导入 Java 函数 导出 6 个回调lib.rs 开头声明了对外部模块shenyu的导入#[link(wasm_import_module shenyu)] extern C { fn get_args(arg_id: i64, addr: i64, len: i32) - i32; fn put_result(arg_id: i64, addr: i64, len: i32) - i32; }get_args用于从 Java 侧线性内存读取参数如序列化后的 PluginData 内容put_result用于把 Rust 处理结果写回 Java 侧内存。随后通过#[no_mangle]导出 6 个与AbstractWasmPluginDataHandler常量完全对应的回调handlerPlugin、removePlugin、handlerSelector、removeSelector、handlerRule、removeRulelib.rs L38-L72每个回调内部都会调用impls(arg_id)演示一次完整的数据往返。5.2 Java 侧shenyu导入模块由 WasmLoader 统一命名shenyu这个导入模块名在 Java 侧的常量是 WasmLoader 中的IMPORT_WASM_MODULE_NAME shenyu。测试类通过覆写initWasmCallJavaFunc把get_args/put_result两个 Java 闭包注册进wasmCallJavaFuncMap由Linker定义到shenyu模块下。测试中的实现AbstractWasmPluginDataHandlerTest.java L146-L171get_args把字符串hello from java argId逐字节写入 wasm 线性内存通过super.getBuffer()拿到ByteBuffer断言收到的argId为0put_result按地址从线性内存读回字节断言内容为 Rust 写回的rust result。两侧断言互为镜像Java 写hello from java 0Rust 断言读取成功Rust 写rust resultJava 断言读取成功——构成一次端到端的内存交换验证。5.3 参数如何跨越 wasm 边界argId间接寻址模式Wasm 与 Java 之间无法像 JNI 那样直接传对象引用AbstractWasmPluginDataHandler 的 callWASI 因此采用了间接寻址final Long argumentId getPluginArgumentId(pluginData); PLUGIN_ARGUMENTS.put(argumentId, pluginData); WasmFunctions.consumer(super.getStore(), execute.func(), WasmValType.I64) .accept(argumentId); PLUGIN_ARGUMENTS.remove(argumentId);Java 先把PluginData按Long型 ID 存入静态ConcurrentHashMap再向 wasm 函数只传一个 I64 参数wasm 侧拿到 ID 后回调get_args(arg_id, addr, len)Java 闭包凭 ID 从 Map 中取回真实对象并序列化进内存。测试中getPluginArgumentId保持基类默认值0L这正解释了测试里对hello from java 0的断言。六、完整操作清单与验证方式综合 README 与源码一次完整的操作顺序如下# 1. 安装 rustup 与 Rust略按官方方式安装 # 2. 确保 wasm32-wasi 目标已安装 rustup target add wasm32-wasi # 3. 构建{shenyu} 替换为仓库根目录实际路径 cd {shenyu}/shenyu-plugin/shenyu-plugin-wasm-base/src/test/rust-plugin-data-handler cargo build --target wasm32-wasi --release # 4. 将 target/wasm32-wasi/release/ 下实际生成的 .wasm # 重命名为 org.apache.shenyu.plugin.wasm.base.handler.AbstractWasmPluginDataHandlerTest$TestWasmPluginDataHandler.wasm # 并放入 src/test/resources 目录与仓库中已入库的同名文件位置一致随后运行该模块的测试即可触发完整链路mvn test -pl shenyu-plugin/shenyu-plugin-wasm-base验证点测试通过即代表 wasm 加载、shenyu模块导入绑定、6 个回调调用、双向内存交换全部成功由于 WasmLoader 中WasiCtxBuilder().inheritStdout().inheritStderr()继承了标准错误流Rust 侧的eprintln!如rust side- recv:hello from java 0与 Java 侧日志java side-hello from java 0会出现在测试输出中可用于人工确认数据往返方向。七、适用前提与注意事项本文流程针对当前仓库2.7.0-SNAPSHOT 版本线下shenyu-plugin-wasm-base的测试样例shenyu-plugin-wasm-base的 pom.xml 依赖shenyu-plugin-wasm-api与shenyu-plugin-base构建测试前需保证依赖可解析仓库中已提交改名后的.wasm二进制文件若仅运行 Java 测试而无需改动 Rust 代码可跳过构建步骤只有修改了 lib.rs 逻辑后才需要重新执行第二至四节并覆盖src/test/resources下的同名.wasm文件README 中记录的产物文件名与当前 Cargo 包名不一致实际执行时以构建目录中真实生成的文件为准见第三节说明wasm 文件名与类名的绑定关系由WasmLoader的clazz.getName() .wasm约定强制约束若你为自己的测试类新增内部 Handler 类需同步保证资源文件名与其全限定名一致否则会抛出ShenyuWasmInitException。赞分享后端API网关微服务【免费下载链接】shenyuApache ShenYu is a Java native API Gateway for service proxy, protocol conversion and API governance.项目地址https://gitcode.com/gh_mirrors/sh/shenyu点击查看免费下载相关推荐Apache ShenYu Wasm 插件开发构建 Rust 测试 Wasm 文件与 Java 侧加载机制解析Apache ShenYu Wasm 插件开发构建 Rust 测试 Wasm 文件与 Java 侧加载机制解析 本篇技术指南以 shenyu plugin w后端API网关微服务Apache ShenYu Wasm 插件实战编译 Rust 实现的 Discovery Handlerwasm32-wasi 构建与类路径命名规范Apache ShenYu Wasm 插件实战编译 Rust 实现的 Discovery Handlerwasm32 wasi 构建与类路径命名规范 本篇后端API网关微服务Apache DataFusion WebAssembly 实战用 wasm-pack 将 Rust 查询引擎编译到浏览器Apache DataFusion WebAssembly 实战用 wasm pack 将 Rust 查询引擎编译到浏览器 Apache DataFusion大数据数据分析后端上一篇告别复杂API调用Laravel HTTP客户端让外部请求如此简单下一篇Dream GraphQL集成指南构建现代化API服务的完整方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考