简介: 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=CouchDBexport OW_DB_USERNAME=rootexport OW_DB_PASSWORD=PASSWORDexport OW_DB_PROTOCOL=httpexport OW_DB_HOST=172.17.0.1export 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.ymlansible-playbook -i environments/local/ initdb.ymlansible-playbook -i environments/local/ wipe.ymlansible-playbook -i environments/local/ apigateway.ymlansible-playbook -i environments/local/ openwhisk.ymlansible-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.pydef 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 工程实践|自建 Apache OpenWhisk 平台

    作者 | 刘宇(江昱) 前言:OpenWhisk 是一个开源.无服务器的云平台,可以在运行时容器中通过执行扩展的代码响应各种事件,而无须用户关心相关的基础设施架构. OpenWhisk 简介 Open ...

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

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

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

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

  4. webpack 从入门到工程实践

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. Feign调用远程服务时传递Cookie信息

    @Configuration public class TtpfFeignConfig { @Bean public RequestInterceptor requestInterceptor(){/ ...

  2. Android JNI静态和动态注册 、Java Reflect(C或C++层反射和JAVA层反射)、Java 可变参数(JNI实现)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  3. 关于linux在笔记本下耗电的解决方案(只写我实践的部分)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文发布于 2014-09-22 12:02:54 ...

  4. 三维模型3DTile格式轻量化在三维展示效果上的重要性分析

    三维模型3DTile格式轻量化在三维展示效果上的重要性分析 三维模型3DTile格式轻量化在三维展示效果上扮演着至关重要的角色.随着计算机图形学和虚拟现实技术的不断发展,我们已经可以创建和渲染非常精细 ...

  5. 如何从容的打包上传图片对象--File,Blob,BASE64详解及转换方法

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 File() File() 构造器创建新的 File 对象实例. 语法 var myFile = new File(bits, name[ ...

  6. C++ pieces

    standard lib fmax double fmax (double x, double y); float fmax (float x, float y); long double fmax ...

  7. module的定义及端口的作用

    模型功能 module是verilog中层次划分的基本单元 通过module之间的调用,可以实现硬件描述层次的提高 端口列表则是module的输入输出,和数字电路的走线连接等效 基于module的不断 ...

  8. archlinux调整分区及ext4文件系统大小

    参照 https://wiki.archlinuxcn.org/wiki/Parted 1.防止数据丢失 有重要数据的话先备份,防止系统崩了数据没了 可以的话先在虚拟机练习一下 2.注意点 修改分区的 ...

  9. #dp#C 公共子序列

    题目 给定两个字符串\(s1,s2\),求它们的\(LCS\) 满足\(|s1|\leq 10^6,|s2|\leq 10^3\) 分析 考场写了\(O(|s1|*|s2|)\)成功TLE, 考虑突破 ...

  10. OpenHarmony Meetup 深圳站招募令

      OpenHarmony Meetup城市巡回深圳站火热来袭!! 日期:2023年10月15日14:00 地点:深圳市福田区上步路中路1003号 深圳市科学馆 与OpenHarmony技术大咖近距离 ...