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

image-20230209102504607

1.What is WebAssembly?

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

image-20230209104158257

image-20230209104813110

  • 其它说明:
    • 由于WASM主要的应用场景是在浏览器领域,所以JavaScript是比较主流的Host编程语言。
    • 其它Host编程语言还有Rust、Go、Python、C#、Java等等。

2.WASM与Spring可以结合的应用场景

  • Serverless(无服务器)架构是云原生领域比较受欢迎的理念,其核心目的是增效降本。如下图:

image-20230209111925644

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

image-20230209112437086

  • 通过对Serverless/FAAS的介绍,我们可以看到可以基于Spring+WASM快速实现FAAS
    • STEP1.用户用自己擅长的编程语言实现的Guest代码
    • STEP2.用户提交这段Guest代码,提交时被编译为WASM
    • STEP3.Spring实现的云端微服务执行STEP2的WASM

3.一个简单的Demo

  • 演讲者编写了1个简单的WASM
    • WASM实现了1个名为add的函数
    • add函数包含2个入参,入参都是整型(i32)
    • add函数返回整型(i32)
    • add函数的内部实现是将2个入参相加

image-20230209142449065

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

image-20230209142856947

4.WASMGuest端可选的编程语言

4.1.C语言

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

image-20230209143034320

  • 编译后得到的WASM

image-20230209143359629

4.2.AssemblyScript

  • 使用TypeScript编写如下代码:

image-20230209143514050

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

image-20230209144136043

4.3.Rust

  • 使用Rust编写的代码如下:

image-20230209144304144

4.4.Java

  • 使用Java编写的代码如下:

image-20230209144431808

  • 可选的编译器如下:
    • TeamVM
    • JSweet
    • J2cl

5.WASMHost端可选的编程语言

5.1.JavaScript

  • 使用JavaScript执行WASM的代码如下:

image-20230209144643281

5.2.Java

  • 使用Java执行WASM的代码如下:

image-20230209144755430

6.小结

  • WASM还在发展阶段,有的人看好,有的人认为是伪命题,但WASM肯定会是未来3~5年的热点。

  • WASM可应用的场景绝对不是在浏览器里运行对GPU有要求的游戏,云原生领域也可能应用。

  • Spring团队也在探索性地将某些模块使用WASM