- 检查OpenWhisk的无服务器架构,包括程序包、操作、序列、触发器、规则和feed的使用。
- 使用命令行或JavaScript API与OpenWhisk进行功能对接。
- 使用常见的四种设计模式进行设计应用。
- 了解如何在无服务器环境中测试和调试代码。
- 了解如何使用JavaScript、Python和Go来开发无服务器应用程序。
- 了解有关CouchDB和Kafka与OpenWhisk的集成。
- 使用完整的分步指南在Kubernetes中安装OpenWhisk。
无服务器的计算可以极大地简化软件开发。开发团队只需要关注于应用程序本身,与此同时,基于云计算的无服务器平台会管理应用的配置和扩展性。本实践指南将为你逐步展示如何在一个灵活、多云服务商、多语言地无服务器环境中,使用Apache OpenWhisk构建和配置复杂应用程序。
你将了解到这个平台如何帮助你使用在Kubernetes中运行的OpenWhisk作为云操作系统,实现追求独立于服务供应商的方法。本书作者演示了如何使用经典设计模式和适合你任务的编程语言来构建无服务器应用程序。你将首先构建一个简单的无服务器应用程序,然后再深入研究OpenWhisk平台中更复杂的方面。
前言
本书是为那些想学习使用Apache OpenWhisk 的开发人员编写的。Apache OpenWhisk 是一个成熟的、多语言的、无服务器的开发平台,它提供了构建复杂、结构良好、多语种的无服务器应用程序所需的知识,这些应用程序可以部署在任何云中,甚至可以部署在内部。
为什么是无服务器?
长期以来,企业都是自己建立数据中心,并购买硬件来安装他们的网络应用程序、移动后端或数据处理管道。但是建立和维护数据中心的高成本使其开始从第三方租用服务器来降低成本。服务器经常被划分为虚拟机,允许企业只为他们需要的东西付费(而不是租用整个服务器)。终,这个概念演变成了今天我们通常所说的云。云的核心主要是按需服务器服务。现代云提供商提供广泛的服务,但也变得越来越复杂。特别是,这种复杂性的一个来源是需要调配和管理服务器。服务器就像是不容易饲养的牛,需要持续地护理和控制,必须进行监控、清洁、更新,偶尔还会被销毁和重建。就像牛一样,它们也趋向于快速生长和繁殖。
开发人员希望无服务器以云的本地客户(云原生)的身份开发他们的应用程序。这里的重点是将管理服务器的负担推到部署在云中的平台上。大多数软件开发人员希望上传他们的代码,并立即启动和运行。
因此,现在所有主要的云提供商都提供某种形式的功能即服务(Function as a Service,FaaS),它隐藏了服务器,只需要运行代码,简而言之,就是一种使用他们的无服务器云的方式。
为什么是Apache OpenWhisk ?
亚马逊网络服务(Amazon Web Services,AWS)及其Lambda 服务是无服务器计算的先驱。正如你所料,亚马逊Lambda 非常适合AWS 产品。然而,无服务器计算并不局限于(也不能局限于)一个云提供商。自然的结果是,一些开源的无服务器项目出现了。如今,有许多可用于无服务器计算的平台,它们可以在多个云中运行。
这本书的重点之一是Apache OpenWhisk。
Apache OpenWhisk 开源软件初是由IBM 公司开发的,但是后来它的代码库被捐赠给Apache 软件基金会,并在商业友好的开源许可下发布,即Apache 许可2.0。这使得它严肃地开放源码,不受商业限制,并对采用它的商业企业友好,长期保持不变。
因为任何Apache 项目都必须有一个工作代码库和一个活跃的社区,Apache 软件的采用者可以相信他们不会独自使用它。此外,Apache 支持的软件有一个详细的合规性规则列表,允许每个人使用发布的软件,而不会像其他一些开源许可证一样陷入非商业陷阱。
除了作为Apache 项目的这些优势之外,OpenWhisk 还用于生产中,并用于支持IBM 云以及Adobe 公司的输入/ 输出运行时云服务的云功能。Apache OpenWhisk还支持许多编程语言,包括Node.js、Python、Java、Go、Swift、PHP 和Ruby。更多的语言还在开发之中。简而言之,它是一个稳定的、成熟的、可用于生产的无服务器平台。
你将学到什么?
本书是为开发人员编写的,所以你需要熟悉编码和编程语言。本书分为两部分,部分是介绍性的内容,第二部分是更高级的内容。
在部分中,假设你只了解JavaScript 编程语言和Web 开发的基础知识,比如HTML,而没有无服务器开发的经验。
在本部分中你将学习如何从头创建OpenWhisk 应用程序。在探索了OpenWhisk 架构之后,将为一个静态网站创建一个简单的联系人表单。
然后,我们将研究OpenWhisk 的CLI 和API,并以一种高度工程化的方式重新构建相同的应用程序,将其分解为协作操作并应用一组设计模式。你将了解开发应用程序所需的构建块,以及示例和实践。
在本书中,我们强调了测试的重要性,因此部分以一个专门讨论单元测试、模拟和快照测试的章节结束。本书的第二部分为更高级的内容,这里假设你了解更多的编程语言。第二部分的前两章使用Python 编写示例代码,后两章则使用Go。我们将讨论在这些编程语言中开发OpenWhisk 应用程序的特性。
在第二部分中,我们还将探讨与基础外部服务,如数据库(CouchDB)和消息传递队列(Kafka)的集成。后一章将介绍如何在Kubernetes 中安装OpenWhisk,包括Kubernetes 本身的安装。这一章主要针对系统管理员,但是对于不熟悉Linux 的人也有帮助,因为它提供了逐步的安装说明。
本书约定
本书使用如下排版约定:
斜体(Italic)
表示新术语、URL、电子邮件地址、文件名和文件扩展名。
等宽字体(Constant width)
表示程序列表,以及在段落中引用程序元素,如变量或函数名、数据库、数据类型和环境变量、语句和关键字。
等宽黑体(Constant width bold)
表示需要用户逐字输入的命令或其他文本。
等宽斜体(Constant width italic)
表示应由用户提供的值或由上下文确定的值进行替换的文本。
使用代码范例
可以通过https://learing-apache-openwhisk.github.io 下载补充材料(代码示例、练习等)。
本书是帮你完成具体工作的。一般情况下,如果本书提供了示例代码,你可以在程序和文档中使用它。你不需要获得我们的许可,除非你是复制的代码的重要部分。例如,编写使用本书中几个代码块的程序不需要获得许可。出售或分发来自OReilly图书的示例光盘确实需要获得许可。通过引用本书和示例代码来回答问题不需要获得许可。将本书中的大量示例代码合并到你的产品文档中确实需要获得许可。
我们感谢但不要求注明出处。出处通常包括标题、作者、出版商和ISBN。例如:Learning Apache OpenWhisk by Michele Sciabarrà (OReilly). Copyright 2019 Michele Sciabarrà, 978-1-492-04616-5。
如果你觉得你对代码示例的使用超出了合理使用范围,或者超出了上面给出的许可范围,请随时通过permissions@oreilly.com 与我们联系。
OReilly 在线学习平台(OReilly Online Learning)
近40 年来,OReilly Media 致力于提供技术和商业培训、知识和卓越见解,来帮助众多公司取得成功。
我们独特的专家和创新者网络通过书籍、文章、会议和我们的在线学习平台分享他们的知识和专长。OReilly 的在线学习平台可以让你按需访问现场培训课程、深度学习路径、交互式编码环境,以及来自OReilly 和200 多个其他出版商的大量文本和视频。更多信息,请访问http://oreilly.com。
联系我们
任何有关本书的意见或疑问,请按照以下地址联系出版社。
美国:
OReilly Media, Inc.
1005 Gravenstein Highway North
Sebastopol, CA 95472
中国:
北京市西城区西直门南大街2 号成铭大厦C 座807 室(100035)
奥莱利技术咨询(北京)有限公司
我们为本书提供了网页,该网页列出了勘误表、范例和任何其他附加的信息。网址:http://bit.ly/learn-apache-openwhisk。
要询问技术问题,或者对本书提出建议,请发送电子邮件至:bookquestions@oreilly.com。
关于我们的书籍、课程、会议和新闻的更多信息,请参阅我们的网站:http://www.oreilly.com。
我们的Facebook:http://facebook.com/oreilly。
我们的Twitter:http://twitter.com/oreillymedia。
我们的YouTube:http://www.youtube.com/oreillymedia。
致谢
我想对Rodric Rabbah 和Carlos Santana 的支持和指导表示感谢。如果不是因为他们,我能做的就是提交一行代码来修复Windows 上的Vagrant 构建,这是我对OpenWhisk 项目的项贡献。在他们的支持和鼓励下,我构建了一个新的action代理,该代理现在支持多个OpenWhisk 运行时,终我写了一本关于Apache OpenWhisk 的书。
我还要感谢审稿人。当然,Carlos 和Rodric 是早阅读初稿的人,Rob Allen、Dragos Dascalita 和Vincent Hou 也提供了宝贵的建议,以改进我的写作,并纠正错误。后,我还要感谢参与OpenWhisk 项目的Apache 社区的一些成员:Dave Grove、Justin Halsall、James Thomas、Markus Thmmes、Matt Rutkowski、Priti Desai,以及其他所有我忘记在这里提到的人。
Michele Sciabarrà是信息技术的资深人士,目前是Sciabarra.com的首席执行官,这是一家专注于Kubernetes和无服务器解决方案的咨询公司。他还是Apache OpenWhisk项目的贡献者,尤其是Go、Swift、Rust、Java和其他编程语言的高性能Action Loop运行时的作者。
目录
序 . 1
前言 3
部分 OpenWhisk 开发介绍
第1 章 无服务器和OpenWhisk 体系结构 11
OpenWhisk 体系架构 12
功能和事件12
体系架构概览 13
OpenWhisk 编程语言 14
操作和操作组合 15
动作链接 16
OpenWhisk 是如何工作的? 17
Nginx 18
控制器 19
负载均衡器19
调用者 20
客户端 21
无服务执行限制 21
action 是功能性的 23
动作是事件驱动的 23
操作没有本地状态 24
action 是有时间限制的 24
操作是无序的 25
从Java EE 到无服务 25
经典的Java EE 架构 25
等效于Java EE 的无服务 27
小结 30
第2 章 一个简单的OpenWhisk 应用程序 33
开始 34
Bash 命令提示行 34
IBM 云 35
创建一个简单的联系人表单 37
表单验证 39
验证地址 40
返回结果 41
保存表单数据 42
调用action 45
存储到数据库中 47
发送电子邮件 49
配置Mailgun 50
编写一个action 来发送邮件 50
创建一个动作序列 53
小结 54
第3 章 OpenWhisk CLI 和JavaScript API 55
wsk 命令 56
配置wsk 命令 57
OpenWhisk 实体名 58
定义包 59
创建操作 61
操作的链式序列 64
包含一些你自己的代码作为库 66
检查激活 69
管理触发器和规则 70
使用反馈 75
通用JavaScript API 78
异步请求 78
使用promise 79
创造promise 80
使用OpenWhisk API 82
调用OpenWhisk 操作 83
触发触发器87
检查激活 89
小结 90
第4 章 OpenWhisk 通用设计模式 91
内置模式 92
单例模式 93
外观模式 94
原型模式 96
装饰模式 98
用操作实现通常模式 103
策略模式 103
责任链 106
命令模式 109
小结 113
第5 章 OpenWhisk 中的集成设计模式 115
集成模式 117
代理模式 117
适配器模式121
桥模式 123
观察模式 125
用户交互模式 130
组合模式 131
访问模式 133
MVC 模式 135
小结 138
第6 章 单元测试OpenWhisk 应用程序 139
使用Jest 测试运行程序 140
使用Jest 140
本地测试 143
Snapshot 测试 150
Mocking 155
什么是mock ? 155
模拟一个HTTPS 请求 156
模拟OpenWhisk API 163
使用模拟库调用操作 163
模拟操作参数 165
模拟一个序列 165
小结 167
第二部分 先进的OpenWhisk 开发应用
第7 章 用Python 开发OpenWhisk 操作 171
Python 运行时间 171
Python 运行时间是多少? 172
运行时间可用的库 174
使用第三方库 177
在zip 文件中打包一个Python 应用程序 177
使用virtualenv 180
virtualenv 和pip 的工作原理181
虚拟环境自动化 182
使用yattag 库 182
建立virtualenv,包括一个库 183
使用OpenWhisk REST API 184
身份验证 185
用curl 连接到API 186
在Python 中使用OpenWhisk REST API 188
Python 中的调用、激活和触发器 190
阻塞操作调用 191
非阻塞触发器调用 193
检索调用的结果 195
测试Python 操作 197
在本地重新创建Python 运行时环境 197
单元测试示例 198
在本地调用OpenWhisk API 201
模拟请求 202
小结 204
第8 章 在OpenWhisk 中使用CouchDB 205
如何查询CouchDB 206
在命令行上探索CouchDB 208
CouchDB 工作方式 209
创建数据库209
创建 210
检索 211
更新 211
删除 212
附件 213
查询CouchDB 216
搜索数据库217
索引 218
字段 219
分页支持 220
书签功能 221
选择器 221
运算符 223
CouchDB 设计文件 225
视图函数 227
用map 函数提取数据 227
用map 函数实现join 230
加入单个文档 233
带有reduce 函数的聚合 234
验证函数 236
使用cloudant 包 238
cloudant 包中的crud 操作 240
包含包的查询和视图 244
小结 246
第9 章 Python 中的OpenWhisk Web 应用程序 247
CRUD 应用程序体系结构 247
抽象数据库访问 250
实现modelinit() 251
实现modelinsert() 251
实现modelfind() 253
测试 insert 和 find 253
实现modelupdate() 和modeldelete() 255
测试update 和 delete 257
用户界面 257
测试 258
使用viewtable 呈现表 260
使用viewform 呈现表单 262
控制器 263
处理操作 264
边界效应 268
高级的Web 操作 269
改进CRUD 应用程序 272
验证和错误报告 274
分页 276
创建索引 277
使用书签和限制 277
页码 278
处理书签 279
上传和显示图像 280
文件上传表单 281
解析文件上传 282
将数据保存在数据库中 284
生成一个 标记 284
生成一个URL 来检索图像 285
使用HTTP 请求呈现图像 287
小结 288
第10 章 在Go 中开发OpenWhisk 操作 289
你的个Go 语言操作 290
多文件包 293
import、GOPATH 和vendor 文件夹 294
在main 中多个文件的操作 295
多个包的操作 297
使用第三方库的操作 299
Go 如何使用第三方开源库 299
为库选择一个给定版本 300
预编译操作302
测试Go 操作 305
编写测试 305
测试用例 306
嵌入的资源 308
使用Web 操作提供资源 310
在Go 中访问OpenWhisk API 315
实用程序 315
HTTP 请求 317
调用OpenWhisk 操作 319
触发触发器321
检索与激活ID 关联的数据 323
小结 324
第11 章 通过OpenWhisk 使用Kafka 325
介绍Apache Kafka 326
Kafka 代理和协议 327
消息和关键字 328
主题和划分328
偏移量和客户机组 329
在IBM Cloud 中创建Kafka 实例 329
创建一个实例 330
创建一个主题 331
获取证书 332
使用消息传递包 333
创建连接和反馈 334
使用一个操作接收消息 334
使用kafkacat 发送消息 335
测试Kafka 代理 336
一个在Go 中的Kafka Producer(生成器) 338
创建一个Producer 338
发送Kafka 消息 340
编写发送者操作 341
部署和测试Producer 343
一个在Go 中的Kafka Consumer 344
创建一个Consumer 345
接收一个消息 347
编写一个接收者操作 349
测试Consumer 351
实现Web 聊天的应用程序 352
综述 353
用户界面 354
初始化 355
加入 356
接收 358
发送 359
小结 359
第12 章 使用Kubernetes 部署OpenWhisk 361
安装Kubernetes 362
安装kubectl 和 Helm 363
在本地安装Kubernetes 365
在云端安装Kubernetes 367
Kubernetes 云部署的架构 368
使用cloud-init 安装Kubernetes 的一般过程 370
在Hetzner Cloud 上安装 374
在AWSA 云上安装 377
在裸金属服务器上安装Kubernetes 381
收集所需软件 382
网络结构 383
安装脚本 384
创建集群 385
安装OpenWhisk 388
配置Kubectl 389
配置Helm 390
在Docker Desktop 上安装 391
在Kubernetes 集群中安装393
配置OpenWhisk 命令行界面 397
不安全地为Docker Desktop 配置wsk 397
创建一个新的命名空间 397
小结 399
总结 399
作者介绍 401
封面介绍 401