SpringOne 2022第4个议题《Running Untrusted Code in Spring Using WebAssembly》,主要在介绍WebAssembly的Host和Guest,引申出Spring结合WebAssembly的一些展望,演讲者:Dave Syer。

1.What is WebAssembly?
- WebAssembly有两个概念
Host和Guest:Host可以认为是能够执行WebAssembly的容器,比如:浏览器。Guest就是WASM(WebAssembly),我们可以直接编写WASM,也可以用C/C#/AssemblyScript/Rust这些语言去写再编译成WASM。

- WebAssembly的语言规范在此:

- 其它说明:
- 由于
WASM主要的应用场景是在浏览器领域,所以JavaScript是比较主流的Host编程语言。 - 其它
Host编程语言还有Rust、Go、Python、C#、Java等等。
- 由于
2.WASM与Spring可以结合的应用场景
- Serverless(无服务器)架构是云原生领域比较受欢迎的理念,其核心目的是增效降本。如下图:

- Serverless架构提供一种更加"代码碎片化"的软件架构范式——
FAAS(Function as a Services),以Amazon Lambda为例:AWS Lambda可以作为Host执行用户提交的函数——这个可以认为是Guest侧的代码。

- 通过对
Serverless/FAAS的介绍,我们可以看到可以基于Spring+WASM快速实现FAAS:- STEP1.用户用自己擅长的编程语言实现的
Guest代码 - STEP2.用户提交这段
Guest代码,提交时被编译为WASM - STEP3.
Spring实现的云端微服务执行STEP2的WASM
- STEP1.用户用自己擅长的编程语言实现的
3.一个简单的Demo
- 演讲者编写了1个简单的
WASM,- 此
WASM实现了1个名为add的函数 add函数包含2个入参,入参都是整型(i32)add函数返回整型(i32)- add函数的内部实现是将2个入参相加
- 此

- 演讲者的使用MDN提供的测试工具作为
Host执行上述WASM,JavaScript代码如下:

4.WASM的Guest端可选的编程语言
4.1.C语言
- 使用C语言编写如下代码:
- 函数
echo返回整型,内部实现是调用函数get。
- 函数
- 将C语言编译成
WASM的可选工具如下:- Emscripten
- Wasi SDK
- Binaryen
- LLVM/Clang

- 编译后得到的
WASM:

4.2.AssemblyScript
- 使用TypeScript编写如下代码:

- 编译后得到的
WASM很长,在此仅展示部分。

4.3.Rust
- 使用Rust编写的代码如下:

4.4.Java
- 使用Java编写的代码如下:

- 可选的编译器如下:
- TeamVM
- JSweet
- J2cl
5.WASM的Host端可选的编程语言
5.1.JavaScript
- 使用JavaScript执行
WASM的代码如下:

5.2.Java
- 使用Java执行
WASM的代码如下:

6.小结
WASM还在发展阶段,有的人看好,有的人认为是伪命题,但WASM肯定会是未来3~5年的热点。WASM可应用的场景绝对不是在浏览器里运行对GPU有要求的游戏,云原生领域也可能应用。Spring团队也在探索性地将某些模块使用
WASM。