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
。