作者 | 刘宇(江昱)

前言:OpenWhisk 是一个开源、无服务器的云平台,可以在运行时容器中通过执行扩展的代码响应各种事件,而无须用户关心相关的基础设施架构。

OpenWhisk 简介

OpenWhisk 是基于云的分布式事件驱动的编程服务。OpenWhisk 提供一种编程模型,将事件处理程序注册到云服务中,以处理各种不同的服务。其可以支持数千触发器和调用,可以对不同规模的事件进行响应。

OpenWhisk 是由许多组件构建的,这些组件让 OpenWhisk 成为一款优秀的开源 FaaS 平台。



Apache OpenWhisk 组件结构

OpenWhisk 部署

实验机器操作系统为 Ubuntu 18.04 Desktop。使用 GitHub 上所提供的 incubator-openwhisk 进行安装,如果本机没有安装 Git,需要先安装 Git:

apt install git

接下来克隆 repo 到本地目录:

git clone https://github.com/apache/incubator-openwhisk.git openwhisk

克隆完成之后,显示如图所示。



Apache OpenWhisk 项目 Clone

进入 OpenWhisk 目录,并且执行脚本。OpenWhisk 是由 Scala 开发的,运行需要安装 Java 环境。下面的脚本实现了 Java 环境的安装,以及其他的所需要的软件:

cd openwhisk && cd tools/ubuntu-setup && ./all.sh

Apache OpenWhisk 安装配置如图所示。



Apache OpenWhisk 安装配置

OpenWhisk 使用 ansible 进行部署,环境变量定义在 ansible/environments/group_vars/all 下:

limits:
invocationsPerMinute: "{{ limit_invocations_per_minute | default(60) }}"
concurrentInvocations: "{{ limit_invocations_concurrent | default(30) }}"
concurrentInvocationsSystem: "{{ limit_invocations_concurrent_system | default
(5000) }}"
firesPerMinute: "{{ limit_fires_per_minute | default(60) }}"
sequenceMaxLength: "{{ limit_sequence_max_length | default(50) }}"

上面程序定义了 OpenWhisk 在系统中的限制。

  • invocationsPerMinute 表示同一个 Namespace 每分钟调用 Action 的数量。
  • concurrentInvocations 表示同一个 Namespace 的并发调用数量。
  • concurrentInvocationsSystem 表示系统中所有 Namespace 的并发调用数量。
  • firesPerMinute 表示同一个 Namespace 中每分钟调用 Trigger 的数量。
  • sequenceMaxLength 表示 Action 的最大序列长度。

如果需要修改上述的默认值,可以把修改后的值添加到文件 ansible/environments/local/group_vars/all 的末尾。例如,Action 的最大序列长度为 100,可以将 sequenceMaxLength: 120 添加到文件的末尾。

接下来,为 OpenWhisk 配置一个持久存储的数据库,有 CouchDB 和 Cloudant 可选。以 CouchDB 为例,配置环境:

export OW_DB=CouchDB
export OW_DB_USERNAME=root
export OW_DB_PASSWORD=PASSWORD
export OW_DB_PROTOCOL=http
export OW_DB_HOST=172.17.0.1
export OW_DB_PORT=5984

在 openwhisk/ansible 目录下,运行脚本,如图所示。

ansible-playbook -i environments/local/ setup.yml



执行脚本过程

接下来使用 CouchDB 部署 OpenWhisk,确保本地已经有了 db_local.ini。在 openwhisk/ 目录下执行部署命令:

./gradlew distDocker

如果部署过程中出现问题(如下图所示),可能是没有安装 npm 导致的,此时可以执行如下指令。



部署过程可能报错示例

apt install npm

稍等片刻,可以看到 Build 成功页面,如图所示。



Build 成功示例

接下来进入 openwhisk/ansible 目录:

ansible-playbook -i environments/local/ couchdb.yml
ansible-playbook -i environments/local/ initdb.yml
ansible-playbook -i environments/local/ wipe.yml
ansible-playbook -i environments/local/ apigateway.yml
ansible-playbook -i environments/local/ openwhisk.yml
ansible-playbook -i environments/local/ postdeploy.yml

执行脚本过程如图所示。



图片执行脚本过程

部署成功后,OpenWhisk 会在系统中启动几个 Docker 容器。我们可以通过 docker ps 来查看:

docker ps --format "{{.Image}} \t {{.Names }}"

安装成功后的容器列表如图所示。



安装成功后的容器列表

开发者工具

OpenWhisk 提供了一个统一的命令行接口 wsk。生成的 wsk 在 openwhisk/bin 下。其有两个属性需要配置。

  • API host 用于部署 OpenWhisk 的主机名或 IP 地址的 API。
  • Authorization key(用户名或密码)用来授权操作 OpenWhisk 的 API。

设置 API host,在单机配置中的 IP 应该为 172.17.0.1,如图所示。

./bin/wsk property set --apihost '172.17.0.1'



设置 API host

设置 key:

./bin/wsk property set --auth `cat ansible/files/auth.guest

权限设置如图所示。



图片设置权限

OpenWhisk 将 CLI 的配置信息存储在 ~/.wskprops 中。这个文件的位置也可以通过环境变量 WSK_CONFIG_FILE 来指定。

验证 CLI:

wsk action invoke /whisk.system/utils/echo –p message hello –result
{
"message": "hello"
}

体验测试

创建简单的动作(action),代码如下:

# test.py
def main(args):
num = args.get("number", "30")
return {"fibonacci": F(int(num))}
def F(n):
if n == 0:
return 0
elif n == 1:
return 1
else:
return F(n - 1) + F(n - 2)

创建动作:

/bin/wsk action create myfunction ./test.py  --insecure

函数创建如图所示。



创建函数

触发动作:

./bin/wsk -i action invoke myfunction --result --blocking --param nember 20

得到结果,如图所示。



执行函数

至此,我们完成了 OpenWhisk 项目的部署以及测试。

Serverless 工程实践|自建 Apache OpenWhisk 平台的更多相关文章

  1. Serverless 工程实践 | Serverless 应用优化与调试秘诀

    作者|刘宇   前言:本文将以阿里云函数计算为例,提供了在线调试.本地调试等多种应用优化与调试方案. Serverless 应用调试秘诀 在应用开发过程中,或者应用开发完成,所执行结果不符合预期时,我 ...

  2. Serverless 工程实践 | 零基础上手 Knative 应用

    作者|刘宇 前言:Knative 是一款基于 Kubernetes 的 Serverless 框架.其目标是制定云原生.跨平台的 Serverless 编排标准. Knative 介绍 Knative ...

  3. webpack 从入门到工程实践

    from:https://www.jianshu.com/p/9349c30a6b3e?utm_campaign=maleskine&utm_content=note&utm_medi ...

  4. China .NET Conf 2019-.NET技术架构下的混沌工程实践

    这个月的8号.9号,个人很荣幸参加了China.NET Conf 2019 , 中国.NET开发者峰会,同时分享了技术专题<.NET技术架构下的混沌工程实践>,给广大的.NET开发小伙伴介 ...

  5. 深入理解 ProtoBuf 原理与工程实践(概述)

    ProtoBuf 作为一种跨平台.语言无关.可扩展的序列化结构数据的方法,已广泛应用于网络数据交换及存储.随着互联网的发展,系统的异构性会愈发突出,跨语言的需求会愈加明显,同时 gRPC 也大有取代R ...

  6. 从工具、工具箱到数字化软件工厂——DevOps 设计理念与工程实践专场 | CIF 精彩看点

    西方经典管理理论认为,组织效率可以归为劳动效率.组织效率和人的效率.美国管理学家泰勒所著的<科学管理原理>被德鲁克誉为"20 世纪最伟大的发明",劳动效率说认为分工提升 ...

  7. panguan(判官):一个自研的任务执行引擎的工程实践

    来某厂接近半年了,几乎没写过C++代码,说实话还真的有点手生.最近刚好有一个需求,然而我感觉我也没有办法用C++以外的语言去实现它.于是还是花了几天时间用C++完成编码,这是一个简单的任务执行引擎,它 ...

  8. 公司简介 - CCDI悉地国际-工程实践专业服务的引领者

    公司简介 - CCDI悉地国际-工程实践专业服务的引领者 关于悉地国际         CCDI悉地国际(以下简称"CCDI")创立于1994年,是在城市建设和开发领域从事综合专业 ...

  9. Linux开源模块迁移概述暨交叉编译跨平台移植总结--从《嵌入式Linux驱动模板简洁和工程实践》

    本文摘录<嵌入式Linux驱动模板简洁和工程实践>一本书"开发和调试技术". Linux强大的是,有那么多的开源项目可以使用.通常非常需要可以通过寻找相关的源模块被定义 ...

随机推荐

  1. 3.8学习总结——Android保存信息

    为了保存软件的设置参数,Android平台为我们提供了一个SharedPreferences接口,它是一个轻量级的存储类,特别适合用于保存软件配置参数.使用SharedPreferences保存数据, ...

  2. Mongodb的基本使用及对接多数据源

    mongodb介绍 MongoDB(来自于英文单词"Humongous",中文含义为"庞大")是可以应用于各种规模的企业.各个行业以及各类应用程序的开源数据库. ...

  3. django forms的常用命令及方法(一)

    根据别人网上发布,个人爱好收集 Form表单的功能 自动生成HTML表单元素 检查表单数据的合法性 如果验证错误,重新显示表单(数据不会重置) 数据类型转换(字符类型的数据转换成相应的Python类型 ...

  4. Navicat连接数据库成功,新建查询时提示错误“Cannot create file ……”

    Navicat连接数据库成功,新建查询时提示错误"Cannot create file --" 原因:编辑连接{高级}<设置位置>被修改,该oci.dll不正确 解决方 ...

  5. Python 通过 .cube LUT 文件对图像加滤镜

    Python 通过 .cube LUT 文件对图像加滤镜 一个好用的python给图片加滤镜的代码: https://github.com/CKboss/PyApplyLUT 这个是对C++代码的封装 ...

  6. 初探webpack之编写plugin

    初探webpack之编写plugin webpack通过plugin机制让其使用更加灵活,以适应各种应用场景,当然也大大增加了webpack的复杂性,在webpack运行的生命周期中会广播出许多事件, ...

  7. java/ kotlin下的单例模式

    单例模式属于创建型模式, 顾名思义,就是说整个系统中只有一个该对象的实例. 为什么要使用单例模式? 1, 对于一些需要频繁创建,销毁的对象, 使用单例模式可以节省系统资源 2, 对于全局持有的对象,单 ...

  8. Unity——资源文件夹介绍

    Unity资源文件夹介绍 1.编辑时 在Asset文件下存在Resources和SteamingAsset文件夹: Resources 只读不可修改,打包时直接写死,没有办法通过热更新替换资源: 可以 ...

  9. [AGC023D] Go Home 题解

    题目传送门 Solution 首先排除掉特殊情况:若 \(S\) 在两侧,肯定会顺序/逆序直接走完,答案就是边界减去出发点. 考虑到若 \(P_1\geq P_n\),那么显然 \(1\) 不到家 \ ...

  10. 创建HTML文档

    目录 创建HTML文档 构筑基本的文档结构 DOCTYPE元素 DOCTYPE元素 代码清单1 使用DOCTYPE元素 html元素 html元素 代码清单2 使用html元素 head元素 head ...