WasmEngine是一个轻量级的WebAssembly函数引擎,基于WebAssembly沙箱级安全隔离模型,提供高并发函数执行、毫秒级函数极速冷启动能力。
WasmEngine架构图
业界流行的FaaS框架一般采用HTTP协议的Restful的API接口,对接后端的函数执行引擎。WasmEngine引擎也采用类似方案,提供了一组Restful风格的faas-provider API接口,提供函数的增删改查功能以及函数调用功能接口。
详细的接口定义如下:
deploy函数部署接口
delete删除函数接口
list查询所有函数接口
query函数查询接口
query函数查询接口
WasmEngine采用Rust语言开发,因此依赖于Rust语言的编译工具链进行编译构建。
Rust语言环境安装 Rust安装部署可参考官方文档说明
WasmEngine编译
$ cd WasmEngine
$ cargo build --release
Compiling libc v0.2.126
Compiling proc-macro2 v1.0.36
Compiling unicode-xid v0.2.2
Compiling syn v1.0.84
Compiling cfg-if v1.0.0
...
Finished release [optimized] target(s) in 3m 41s
# 编译生成的二进制文件存放的路径如下
$ ls target/release/
build deps examples incremental libwasm_engine.d libwasm_engine.rlib wasm_engine wasm_engine.d
Rust Wasm编译工具链安装
Rust编译工具链支持编译成wasm相关的target目标格式有:
rustup target list | grep wasm
wasm32-unknown-emscripten
wasm32-unknown-unknown
wasm32-wasi
这三种不同target目标格式的区别:
在服务器场景下,当前只支持wasm32-unknown-unknown
和wasm32-wasi
这两种目标格式。
具体的安装方法如下:
$ rustup target add wasm32-unknown-unknown wasm32-wasi
# 安装完成之后,对应target之后会有(installed)标识
$ rustup target list | grep wasm
wasm32-unknown-emscripten
wasm32-unknown-unknown (installed)
wasm32-wasi (installed)
gcd
, echo_string
和authentication
三种不同测试函数的wat格式文件# wasm_engine应用需要root权限才能执行
$ su root
# 设置RUST_LOG输出的crate和日志级别
$ export RUST_LOG=wasm_engine=debug
# wasm_engine默认监听在主机的10000端口上
$ ./wasm_engine
2022-07-28T12:32:10.007200Z INFO wasm_engine::function_store::local_store: no persist json file exist, restore end
2022-07-28T12:32:10.007255Z INFO wasm_engine: WasmEngine listening on http://0.0.0.0:10000, waiting for request...
# 编译experiments目录中给定的函数样例
$ make apps
Building: fibonacci
Finished release [optimized] target(s) in 0.00s
Building: hello
Finished release [optimized] target(s) in 0.00s
Building: authentication
Finished release [optimized] target(s) in 0.28s
Building: authentication-wasi
Finished release [optimized] target(s) in 0.00s
编译完成之后,就可以在experiments/application/的各个函数源码目录下面的target目录下找到生成的wasm函数。
例如,authentication
函数编译生成的wasm文件路径为target/wasm32-unknown-unknown/release/authentication.wasm
将编译生成的Wasm函数二进制文件打包成容器镜像格式,并上传到函数镜像仓库中,等待WasmEngine部署时进行拉取
Wasm函数镜像的制作方法,可以参考下面Wasm 函数镜像制作小节的介绍说明。
WasmEngine 提供Restful API接口说明
下面以authentication
和hello
函数为例函数部署、查询、删除、调用的介绍
部署authentication函数
$ curl --location --request POST 'localhost:10000/function/deploy' \
--header 'Content-Type: application/json' \
--header 'Content-Type: text/plain' \
--data-raw '{
"function_name": "authentication",
"function_image": "127.0.0.1:5000/authentication-wasm:v4",
"wasi_cap": false
}'
status code: 200, message: deploy function authentication successfully!
部署hello函数
$ curl --location --request POST 'localhost:10000/function/deploy' \
--header 'Content-Type: application/json' \
--header 'Content-Type: text/plain' \
--data-raw '{
"function_name": "hello",
"function_image": "127.0.0.1:5000/hello-wasm:v2",
"wasi_cap": true
}'
status code: 200, message: deploy function hello successfully!
查询全部已部署函数
$ curl --location --request GET 'localhost:10000/function/list' \
--header 'Content-Type: application/json' \
--header 'Content-Type: text/plain'
status code: 200, message: all deployed function info: [{func_name: authentication, func_image_name: 127.0.0.1:5000/authentication-wasm:v4, wasi_cap: false}, {func_name: hello, func_image_name: 127.0.0.1:5000/hello-wasm:v2, wasi_cap: true}]
查询authentication函数信息
$ curl --location --request POST 'localhost:10000/function/query' \
--header 'Content-Type: application/json' \
--header 'Content-Type: text/plain' \
--data-raw '{
"function_name": "authentication"
}'
status code: 200, message: queried function info: FunctionEntry { func_name: "authentication", func_image_name: "127.0.0.1:5000/authentication-wasm:v4", func_local_path: "/var/lib/wasmengine/functions/authentication/authentication.wasm", wasi_cap: false }
调用authentication函数
$ curl --location --request POST 'localhost:10000/function/invoke' \
--header 'Content-Type: application/json' \
--header 'Content-Type: text/plain' \
--data-raw '{
"function_name": "authentication",
"args": {"arg_uri": "yes", "arg_body": "yes", "arg_secret": "12345"}
}'
status code: 200, message: {"status":"403","body":"<html><h1>Auth Forbidden!</h1><p>hash c5187dd86a648a819f527c7a8a4f7bf4 secret 12345</p></html>"}
删除已部署的hello函数
$ curl --location --request POST 'localhost:10000/function/delete' \
--header 'Content-Type: application/json' \
--header 'Content-Type: text/plain' \
--data-raw '{
"function_name": "hello"
}'
status code: 200, message: delete function hello successfully!
WasmEngine加载运行的Wasm函数同样需要类似容器镜像的管理和分发能力,因此WasmEngine复用了容器镜像仓库统一管理和分发的能力。开发者将Wasm函数制作成容器镜像,WasmEngine从远端镜像仓库拉取。
开发者可以通过openEuler上的isula build或者docker build容器镜像构建工具来进行容器镜像构建。
$ mkdir build && cd build
$ cp target/wasm32-unknown-unknown/release/authentication.wasm .
$ cat Dockerfile
FROM scratch
ADD authentication.wasm /
$ sudo docker build --tag 127.0.0.1:5000/authentication-wasm:v2 .
Sending build context to Docker daemon 1.787MB
Step 1/2 : FROM scratch
--->
Step 2/2 : ADD authentication.wasm /
---> 897a9e7a1ce6
Successfully built 897a9e7a1ce6
Successfully tagged 127.0.0.1:5000/authentication-wasm:v2
如果用于本地开发验证,开发者可以通过registry
镜像在本地启动一个容器镜像仓库服务。
$ sudo docker run -itd -v /home/flyflypeng/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry:latest
push容器镜像到容器镜像仓库:
$ sudo docker push 127.0.0.1:5000/authentication-wasm:v2
The push refers to repository [127.0.0.1:5000/authentication-wasm]
720b9e537c85: Pushed
v2: digest: sha256:a7b8e58e4b9c2abba6a39636dbc904e01c4cfa7e1d4cc6a97f8e955e148af41e size: 527
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
1. 开源生态
2. 协作、人、软件
3. 评估模型