作者 | 刘宇(江昱)

前言: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 0elif n == 1:return 1else: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 工程实践 | 自建 Apache OpenWhisk 平台

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

  2. Serverless 工程实践 | 快速搭建 Kubeless 平台

    简介:Kubeless 是基于 Kubernetes 的原生无服务器框架.其允许用户部署少量的代码(函数),而无须担心底层架构. 快速搭建 Kubeless 平台 Kubeless 简介 Kubele ...

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

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

  4. Serverless 工程实践 | Serverless 应用开发观念的转变

    前言:在 Serverless 架构下,虽然更多精力是关注业务代码,但是实际上对一些配置和成本也是需要关注的,并且必要的时候还需要根据配置与成本对 Serverless 应用进行配置和代码优化. Se ...

  5. Serverless 工程实践 | 细数 Serverless 的配套服务

    简介:上文说到云计算的十余年发展让整个互联网行业发生了翻天覆地的变化,Serverless 作为云计算的产物,或者说是云计算在某个时代的表现,被很多人认为是真正意义上的云计算,关于"Serv ...

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

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

  7. apache服务 功能错误_如何使用Apache OpenWhisk开发功能即服务

    apache服务 功能错误 Apache OpenWhisk是一个无服务器的开源云平台,允许您执行代码以响应各种规模的事件. Apache OpenWhisk为开发人员提供了基于四个概念的简单编程模型 ...

  8. 《国家地理信息公共服务平台“天地图”的关键技术与工程实践》摘

    2017年前辈们写的文章,今天读来依然感受颇深,文章介绍了国家天地图的建设背景. 关键技术.建设成果和工作展望,以及国家天地图在维护国家主权.支持政府决策管理和推动地理信息产业发展所做的努力.想想这些 ...

  9. 从入门到深入:移动平台模型裁剪与优化的技术探索与工程实践

    可以看到,通过机器学习技术,软件或服务的功能和体验得到了质的提升.比如,我们甚至可以通过启发式引擎智能地预测并调节云计算分布式系统的节点压力,以此改善服务的弹性和稳定性,这是多么美妙. 而对移动平台来 ...

最新文章

  1. Lock和synchronized比较详解
  2. Windows下的网卡Teaming
  3. 百度超级搜索技巧集锦
  4. yaml数组解析_yaml格式详解
  5. MSSQL-最佳实践-Always Encrypted
  6. 天津知青网6周年网庆-京剧-智取威虎山片段
  7. CSS中可以通过哪些属性定义,使得一个DOM元素不显示在浏览器可视范围内?
  8. PostgreSQL SELECT INTO和INSERT INTO SELECT 两种表复制语句
  9. linux 线程的基本知识
  10. 条码标签打印软件如何设置圆形标签
  11. 【渝粤题库】陕西师范大学202131组织行为学作业(高起本、专升本)
  12. 大数据常用的架构有哪些
  13. autojs之QQ 群发消息(挖坑)
  14. 一个安全架构师需要做什么?有什么能力要求?
  15. 数字音频处理--延时与混响音效 Matlab
  16. JAVA-实现接入企业微信发送消息(最详细代码讲解!)
  17. 微信小程序商城如何打印快递单
  18. 分享32套精美的免费 PSD 网页界面设计素材
  19. 面试经历-201106
  20. Programming Contest Ranking(题解)

热门文章

  1. java判断文件或者文件夹
  2. 【MySQL】 日 常 整 理 记 录 分 享
  3. 【生活】 戴尔XPS 插上耳机之后,说话没声音,麦克风失效 window10 系统
  4. 【PAT乙级】1025 反转链表 (25 分)
  5. Linux上安装Nginx
  6. 计算机图形学学习报告,计算机图形学学习报告.pdf
  7. neo4j 知识图谱_知识图谱里的知识存储:neo4j的介绍和使用
  8. 深入理解Java虚拟机(第三弹)- JVM 内存分配与回收策略原理,从此告别 JVM 内存分配文盲
  9. Java提升篇:对象克隆(复制)
  10. Java中switch语句支持的类型