使用 OpenWhisk 自建 Serverless 服务
时间:2022-04-25
本文章向大家介绍使用 OpenWhisk 自建 Serverless 服务,主要内容包括OpenWhisk 简介、macOS 搭建 OpenWhisk 环境、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
在尝试了使用 AWS 开发 Serverless 应用之后,我便想尝试使用 OpenWhisk 框架来搭建自己的 Serverless 服务。
Apache OpenWhisk(http://openwhisk.org/)是一个由IBM和Adobe驱动的开源项目,它是一个健壮的FaaS平台,可以部署在云或数据中心内。相比其他serverless项目,OpenWhisk是一个健壮的、可扩展的平台,支持数千并发触发器和调用。
OpenWhisk 简介
其系统架构如下所示:
OpenWhisk 流处理流程
对应的组件的功能如下:
- Nginx 暴露HTTP(S)端点给客户端。
- Controller 充当系统的守门员、系统的协调者,它将决定请求最终采取的路径。
- CouchDB 护和管理系统的状态。
- Consul 作为系统每个组件可访问的单一数据源。 同时,consul还提供服务发现功能,使控制器发现调用操作的实体。
- Apache Kafka 用于构建实时数据管道和流应用程序。
- Invoker 使用 Scala实现,它是处理执行过程的最后阶段。
- Docker, 几乎所有的 OpenWhisk 组件都打包和部署为容器。
macOS 搭建 OpenWhisk 环境
官网的指引很简单,但是中间还是遇到一些环境问题。
首先 clone 代码
git clone --depth=1 https://github.com/apache/incubator-openwhisk.git openwhisk
然后于是虚拟机的目录:
cd openwhisk/tools/vagrant
接着执行 hello 命令
$./hello./hello: line 8: vagrant: command not found
便提示 vagrant 没有安装。Vagrant 只是一个虚拟机管理和配置工具,为了安装 vagrant,还需要先安装 virtualbox 虚拟机:
brew cask install virtualbox
然后安装 vagrant,顺便也 可以安装 vagrant-manager
$ brew cask install vagrant vagrant-manager==> Satisfying dependencies==> Downloading https://releases.hashicorp.com/vagrant/2.0.1/vagrant_2.0.1_x86_64.dmg######################################################################## 100.0%==> Verifying checksum for Cask vagrant==> Installing Cask vagrant==> Running installer for vagrant; your password may be necessary.==> Package installers may write to any location; options such as --appdir are ignored.Password:==> installer: Package name is Vagrant==> installer: Installing at base path /==> installer: The install was successful.? vagrant was successfully installed!==> Satisfying dependencies==> Downloading https://github.com/lanayotech/vagrant-manager/releases/download/2.6.0/vagrant-manager-2.6.0.dmg######################################################################## 100.0%==> Verifying checksum for Cask vagrant-manager==> Installing Cask vagrant-manager==> Moving App 'Vagrant Manager.app' to '/Applications/Vagrant Manager.app'.
再次执行:
$ ./helloBringing machine 'default' up with 'virtualbox' provider...==> default: Box 'ubuntu/trusty64' could not be found. Attempting to find and install... default: Box Provider: virtualbox default: Box Version: >= 0==> default: Loading metadata for box 'ubuntu/trusty64' default: URL: https://vagrantcloud.com/ubuntu/trusty64==> default: Adding box 'ubuntu/trusty64' (v20171205.0.1) for provider: virtualbox default: Downloading: https://vagrantcloud.com/ubuntu/boxes/trusty64/versions/20171205.0.1/providers/virtualbox.box default: Progress: 11% (Rate: 2806k/s, Estimated time remaining: 0:04:16)
然后挑个网速好的时间,比如早上(经过测试晚上的下载速度比较慢),等它下载完。下载完后,便自动开始在虚拟机里搭建 OpenWhisk 环境,如安装 Docker、Git 等等的操作。
最麻烦的是等待 Docker 安装拉各种镜像。OpenWhisk系统由许多组件构建而成:
OpenWhisk 组件
直至:
default: +++ cat /home/vagrant/openwhisk/ansible/files/auth.guest default: ++ wsk property set --apihost 192.168.33.13 --namespace guest --auth 23bc46b1-71f6-4ed5-8c54-816aa4f8c502:123zO3xZCLrMN6v2BKK1dXYFpXlPkccOFqm12CdAsMgRU4VrNZ9lyGVCGuMDGIwP default: ok: whisk auth set. Run 'wsk property get --auth' to see the new value. default: ok: whisk API host set to 192.168.33.13 default: ok: whisk namespace set to guest default: ++ wsk action invoke /whisk.system/utils/echo -p message hello --result default: { default: "message": "hello" default: } default: +++ date default: ++ echo 'Mon Dec 11 12:09:23 UTC 2017: build-deploy-end'
我们就顺利地运行了我们的 hello world。
你也可以 ssh 到机器上: vagrant ssh
,然后运行 wsk
命令试试:
$ vagrant@vagrant-ubuntu-trusty-64:~/openwhisk/bin$ wsk ____ ___ _ _ _ _ _ / / _ _ __ ___ _ __ | | | | |__ (_)___| | __ / /__ | | | | '_ / _ '_ | | | | '_ | / __| |/ / / ____ / | |_| | |_) | __/ | | | |/| | | | | __ < / / ___/| .__/ ___|_| |_|__/__|_| |_|_|___/_|_ ___/ tm |_|Usage: wsk [command]Available Commands: action work with actions activation work with activations api work with APIs help Help about any command list list entities in the current namespace namespace work with namespaces package work with packages property work with whisk properties rule work with rules sdk work with the sdk trigger work with triggers
- 全面直观认识深度神经网络
- dedecms清空所有文章怎么操作?sql语句如何写?
- .NET Core 实战笔记2-从命令开始
- 【译】使用Docker Compose一条指令配置Mesos
- 【译】Windows下的Docker Machine - 如何设置你的Docker主机
- 史上最透彻的KMP算法讲解
- 【译】助你成功搭建云应用的12条方法
- 你能用微信小程序打开小程序了【附开发方法】
- Logistic回归实战篇之预测病马死亡率(一)
- 腾讯游戏DBA利刃 - SQL审核工具介绍
- Logistic回归实战篇之预测病马死亡率(二)
- Windows环境下跑通Truffle开发环境
- Logistic回归实战篇之预测病马死亡率(三)
- 如何将finecms链接URL中的list和show去掉
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- C++11 move 语义
- 论函数的设计应如何才好,返回临时变量 | 返回引用 | 传递引用
- Flutter基础widgets教程-CupertinoTabView篇
- 关于time的使用
- class priority_queue<> 简单介绍
- C++ share_prt 简单设计和实现
- 使用函数对象与使用函数的比较
- C++ 函数指针的定义方法及使用
- C++ 线程池的简易实现
- Flutter基础widgets教程-DataTable篇
- 2015-C++研发附加题第一题
- win7 64位 下,进程可申请的堆空间
- 生成N位格雷码
- sort 升序还是降序?priority_queue 大根堆还是小根堆?
- 将2N个整数分成两组,每组有N个数,并且满足,这两组的差的绝对值最小。