简介: 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. FFmpeg命令行之 Unknown encoder ‘libx264‘

    在执行下面命令进行摄像头采集时,会报错 Unknown encoder 'libx264' ffmpeg -f dshow -i video="C1E Camera" -vcode ...

  2. awk第一天

    awk第一天 1.用awk 打印整个test.txt (以下操作都是用awk工具实现,针对test.txt) awk '{print}' test.txt [root@master ~]# awk ' ...

  3. springboot如何优雅的获取前端参数

    写在前面 对于初学者来说,困难的不是理论知识,而是如何在程序中具体实现. 现在的项目基本上都是前后端分离的项目,如何打通前后端,接收前端传过来的参数呢? 废话不多说,这篇文章就来说一说接收前端参数的具 ...

  4. JavaScript知识总结 闭包篇

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 1. 对闭包的理解 闭包是指有权访问另一个函数作用域中变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,创建的函数可以访问 ...

  5. Java中使用fastJson

    FastJson简介 Fastjson是阿里巴巴开发的一个开源Java库,用于处理JSON数据,广泛应用于Web服务.API接口.数据交换等多个场景. FastJson的作用 主要作用是用于将Java ...

  6. vue初学核心基础

    一.初识vue 1.vue的使用 导入vue之后创建vue模块,el属性表示控制区域的id名称,data表示该区域内的数据 在vue中我们都是用表中模板的标准语法来传递数据 <head> ...

  7. 取cookie时报错“[object Object]“ is not valid JSON

    做谷粒学苑项目时,在保存登录状态环节出现该问题 取cookie时老师强调要使用JSON.pase()解析cookie为json对象 var userStr = cookie.get("gul ...

  8. .NET周刊【3月第3期 2024-03-24】

    国内文章 Garnet: 力压Redis的C#高性能分布式存储数据库 https://www.cnblogs.com/InCerry/p/18083820/garnet_introduce 微软研究院 ...

  9. apue 文章集锦

    与 apue 相关的一系列文章比较庞杂,按原书目录整理了一下,形成目录,方便系统性阅读. 另外这些文章是在我快读完的时候开始写的,之前的一些章节还多有遗漏,后面慢慢补上. chapter 1: UNI ...

  10. #线性筛,质数#LOJ 6165 一道水题

    题目 \((lcm_{i=1}^ni)\bmod 10^8+7,n\leq 10^8\) 分析 考虑对于某个质数\(p\),在\(n\)范围内做出的最大贡献为\(p^k(p^k\leq n)\), 线 ...