Openwhisk是属于Apache基金会的开源Faas计算平台,由IBM在2016年公布并贡献给开源社区。IBM Cloud本身也提供完全托管的OpenWhisk Faas服务IBM Cloud Function。从业务逻辑来看,OpenWhisk同AWS Lambda一样,为用户提供基于事件驱动的无状态的计算模型,并直接支持多种编程语言。
OpenWhisk特点:
• 高性能,高扩展性的分布式FaaS计算平台
• 函数的代码及运行时全部在Docker容器中运行,利用Docker engine实现FaaS函数运行的管理、负载均衡、扩展.
• OpenWhisk所有其他组件(如:API网关,控制器,触发器等)也全部运行在 Docker容器中。这使得OpenWhisk全栈可以很容易的部署在任意IaaS/PaaS平台上。
• 相比其他FaaS实现(比如OpenFaaS),OpenWhisk更像是一套完整的Serverless 解决方案,除了容器的调用和函数的管理,OpenWhisk 还包括了用户身份验证/鉴权、函数异步触发等功能。
目前支持的语言: Nodejs, Python, Java, php, Ruby, Go, Rust, dotnet, Ballerina, blackBoxes。
安装
整个安装需要提前安装java跟nodejs。
• 安装java
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
$ tar -zxvf jdk-8u171-linux-x64.tar.gz
#切换到当前用户目录下面,编辑配置文件
$ cd ~
$ vim .bash_profile
JAVA_HOME=/home/tomcat/jdk1.8.0_171
CLASSPATH=$JAVA_HOME/lib:$JAVA_HOME/jre/lib
PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin
export JAVA_HOME CLASSPATH PATH
#验证
$ java -version
• 安装nodejs
wget https://nodejs.org/dist/v10.15.3/node-v10.15.3-linux-x64.tar.xz
#解压文件
tar xvf node-v10.15.3-linux-x64.tar.xz
ln -s /home/node-v10.15.3-linux-x64.tar.xz/bin/node /usr/local/bin/node
ln -s /home/node-v10.15.3-linux-x64.tar.xz/bin/npm /usr/local/bin/npm
node -v
npm -v
• 编译openwhisk
yum install git
git clone https://github.com/apache/incubator-openwhisk.git openwhisk
$ ./gradlew :core:standalone:build
• 配置OpenWhisk Cli工具:下载https://github.com/apache/openwhisk-cli
wsk property set --apihost http://172.17.0.1:3233
wsk property set --auth 789c46b1-71f6-4ed5-8c54-816aa4f8c502
wsk property get --auth
• 在.\bin目录下面会有相应的可执行文件。
java -jar openwhisk-standalone.jar
会有如下输出:
____ ___ _ _ _ _ _
/\ \ / _ \ _ __ ___ _ __ | | | | |__ (_)___| | __
/\ /__\ \ | | | | '_ \ / _ \ '_ \| | | | '_ \| / __| |/ /
/ \____ \ / | |_| | |_) | __/ | | | |/\| | | | | \__ \ <
\ \ / \/ \___/| .__/ \___|_| |_|__/\__|_| |_|_|___/_|\_\
\___\/ tm |_|
Running pre flight checks ...
Local Host Name: 172.17.0.1
Local Internal Name: 172.17.0.1
[ OK ] 'docker' cli found. (Docker version 19.03.6, build 369ce74a3c)
[ OK ] 'docker' version 19.3.6 is newer than minimum supported 18.3.0
[ OK ] 'docker' is running.
[ OK ] 'wsk' cli found. (2019-09-23T17:46:38.323+0000)
[ WARN ] Configure wsk via below command to connect to this server as [guest]
wsk property set --apihost 'http://172.17.0.1:3233' --auth '23bc46b1-71f6-4ed5-8c54-816aa4f8c502:123zO3xZCLrMN6v2BKK1dXYFpXlPkccOFqm12CdAsMgRU4VrNZ9lyGVCGuMDGIwP'
[ OK ] Server port [3233] is free
服务起来后设置提示的命令:设置apihost和auth
wsk property set --apihost 'http://172.17.0.1:3233' --auth '23bc46b1-71f6-4ed5-8c54-816aa4f8c502:123zO3xZCLrMN6v2BKK1dXYFpXlPkccOFqm12CdAsMgRU4VrNZ9lyGVCGuMDGIwP'
• 运行Hello world
/**
* Hello world as an OpenWhisk action.
*/
function main(params) {
var name = params.name || 'World';
return {payload: 'Hello, ' + name + '!'};
}
$ wsk action create hellotest hello.js
ok: created action hellotest
$ wsk action invoke hellotest --result
{
"playload": "hello world"
}
系统流程
先介绍一下 OpenWhisk 中从事件触发到函数执行完毕的流程。 OpenWhisk 中,代码是基于事件(Event)触发的。事件产生于事件源(feed),可以用于触发函数的事件多种多样:可以是IoT设备传感器发出的信号,可以是一个 Github repo的push,也可以是最简单的一个前端HTTP 请求。事件与对应的函数代码,通过规则(Rule)绑定。通过匹配事件对应的规则,OpenWhisk会触发对应的行为(Action)。值得注意的是,多个Action 可以串联,完成复杂的操作。
整体架构
参考链接:https://github.com/apache/openwhisk/blob/master/docs/about.md
{
"activationId": "31809ddca6f64cfc9de2937ebd44fbb9",
"response": {
"statusCode": 0,
"result": {
"hello": "world"
}
},
"end": 1474459415621,
"logs": [
"2016-09-21T12:03:35.619234386Z stdout: Hello World"
],
"start": 1474459415595,
}
保存结果包括用户函数的返回值,及日志记录。对异步触发用户,可以通过步骤6中返回的activationID取回函数运行结果。同步触发的的结果和异步触发一样保存在 CouchDB里,控制器在得到触发结束的确认后,从CouchDB 中取得运行结果,直接返回给用户。