WebAssembly for Proxies (GoLang host implementation)
The GoLang implementation for proxy-wasm, enabling developer to run proxy-wasm extensions in Go.
Run Example
cd example
## 编译gohttp.wasm
tinygo build -scheduler=none -no-debug -target=wasi -o gohttp.wasm ./gohttp.go
go run .
curl http://127.0.0.1:2045/
receive request /
print header from server host, User-Agent -> [curl/7.64.1]
print header from server host, Accept -> [*/*]
[http_wasm_example.cc:33]::onRequestHeaders() print from wasm, onRequestHeaders, context id: 2
[http_wasm_example.cc:38]::onRequestHeaders() print from wasm, Accept -> */*
[http_wasm_example.cc:38]::onRequestHeaders() print from wasm, User-Agent -> curl/7.64.1
references
参考资料
个人理解
宿主程序通过import向wasm导入函数实现,exprot导出wasm的函数,wasm通过proxywasm包对象获取宿主函数对象的操作权限, 处理完成的数据也可以调用函数回传, proxy-wasm作为协议是规定了具体的方法,根据实际情况,对应增加import 和 export
在 Proxy-Wasm 中,Wasm VM(虚拟机)、Wasm 模块(Module)和 Wasm 实例(Instance)之间的关系是一对多的关系.
一个 Wasm VM 可以加载和运行多个 Wasm 模块.Wasm VM 是整个系统的核心,负责创建和管理 Wasm 模块的实例.
每个 Wasm 模块代表一个独立的 WebAssembly 模块文件,它包含了一组函数、内存、表格等定义.同一个 Wasm VM 可以加载并运行多个不同的 Wasm 模块.
每个 Wasm 模块实例化为一个 Wasm 实例,它是 Wasm VM 运行时的具体实例.每个 Wasm 实例都有自己的内存空间和运行时状态,它们在 Wasm VM 中相互隔离并独立运行.
因此,一个 Wasm VM 可以同时管理多个 Wasm 模块的实例,每个 Wasm 模块实例都是独立的,它们之间不会相互影响或共享状态.这种一对多的关系使得 Proxy-Wasm 可以同时加载和运行多个不同的 Wasm 模块,并在运行时进行管理和交互.
-------------------------+
| |
| Wasm VM (Wasm Runtime) |
| |
----------+--------------+
|
----------v--------------+
| |
| Wasm Module (Wasm Image)|
| |
----------+--------------+
|
----------v--------------+
| |
|Wasm Instance (Wasm Container) |
| |
-------------------------+