- 檢查OpenWhisk的無服務器架構,包括程序包、操作、序列、觸發(fā)器、規(guī)則和feed的使用。
- 使用命令行或JavaScript API與OpenWhisk進行功能對接。
- 使用常見的四種設計模式進行設計應用。
- 了解如何在無服務器環(huán)境中測試和調(diào)試代碼。
- 了解如何使用JavaScript、Python和Go來開發(fā)無服務器應用程序。
- 了解有關CouchDB和Kafka與OpenWhisk的集成。
- 使用完整的分步指南在Kubernetes中安裝OpenWhisk。
無服務器的計算可以極大地簡化軟件開發(fā)。開發(fā)團隊只需要關注于應用程序本身,與此同時,基于云計算的無服務器平臺會管理應用的配置和擴展性。本實踐指南將為你逐步展示如何在一個靈活、多云服務商、多語言地無服務器環(huán)境中,使用Apache OpenWhisk構建和配置復雜應用程序。
你將了解到這個平臺如何幫助你使用在Kubernetes中運行的OpenWhisk作為云操作系統(tǒng),實現(xiàn)追求獨立于服務供應商的方法。本書作者演示了如何使用經(jīng)典設計模式和適合你任務的編程語言來構建無服務器應用程序。你將首先構建一個簡單的無服務器應用程序,然后再深入研究OpenWhisk平臺中更復雜的方面。
前言
本書是為那些想學習使用Apache OpenWhisk 的開發(fā)人員編寫的。Apache OpenWhisk 是一個成熟的、多語言的、無服務器的開發(fā)平臺,它提供了構建復雜、結(jié)構良好、多語種的無服務器應用程序所需的知識,這些應用程序可以部署在任何云中,甚至可以部署在內(nèi)部。
為什么是無服務器?
長期以來,企業(yè)都是自己建立數(shù)據(jù)中心,并購買硬件來安裝他們的網(wǎng)絡應用程序、移動后端或數(shù)據(jù)處理管道。但是建立和維護數(shù)據(jù)中心的高成本使其開始從第三方租用服務器來降低成本。服務器經(jīng)常被劃分為虛擬機,允許企業(yè)只為他們需要的東西付費(而不是租用整個服務器)。終,這個概念演變成了今天我們通常所說的云。云的核心主要是按需服務器服務,F(xiàn)代云提供商提供廣泛的服務,但也變得越來越復雜。特別是,這種復雜性的一個來源是需要調(diào)配和管理服務器。服務器就像是不容易飼養(yǎng)的牛,需要持續(xù)地護理和控制,必須進行監(jiān)控、清潔、更新,偶爾還會被銷毀和重建。就像牛一樣,它們也趨向于快速生長和繁殖。
開發(fā)人員希望無服務器以云的本地客戶(云原生)的身份開發(fā)他們的應用程序。這里的重點是將管理服務器的負擔推到部署在云中的平臺上。大多數(shù)軟件開發(fā)人員希望上傳他們的代碼,并立即啟動和運行。
因此,現(xiàn)在所有主要的云提供商都提供某種形式的功能即服務(Function as a Service,F(xiàn)aaS),它隱藏了服務器,只需要運行代碼,簡而言之,就是一種使用他們的無服務器云的方式。
為什么是Apache OpenWhisk ?
亞馬遜網(wǎng)絡服務(Amazon Web Services,AWS)及其Lambda 服務是無服務器計算的先驅(qū)。正如你所料,亞馬遜Lambda 非常適合AWS 產(chǎn)品。然而,無服務器計算并不局限于(也不能局限于)一個云提供商。自然的結(jié)果是,一些開源的無服務器項目出現(xiàn)了。如今,有許多可用于無服務器計算的平臺,它們可以在多個云中運行。
這本書的重點之一是Apache OpenWhisk。
Apache OpenWhisk 開源軟件初是由IBM 公司開發(fā)的,但是后來它的代碼庫被捐贈給Apache 軟件基金會,并在商業(yè)友好的開源許可下發(fā)布,即Apache 許可2.0。這使得它嚴肅地開放源碼,不受商業(yè)限制,并對采用它的商業(yè)企業(yè)友好,長期保持不變。
因為任何Apache 項目都必須有一個工作代碼庫和一個活躍的社區(qū),Apache 軟件的采用者可以相信他們不會獨自使用它。此外,Apache 支持的軟件有一個詳細的合規(guī)性規(guī)則列表,允許每個人使用發(fā)布的軟件,而不會像其他一些開源許可證一樣陷入非商業(yè)陷阱。
除了作為Apache 項目的這些優(yōu)勢之外,OpenWhisk 還用于生產(chǎn)中,并用于支持IBM 云以及Adobe 公司的輸入/ 輸出運行時云服務的云功能。Apache OpenWhisk還支持許多編程語言,包括Node.js、Python、Java、Go、Swift、PHP 和Ruby。更多的語言還在開發(fā)之中。簡而言之,它是一個穩(wěn)定的、成熟的、可用于生產(chǎn)的無服務器平臺。
你將學到什么?
本書是為開發(fā)人員編寫的,所以你需要熟悉編碼和編程語言。本書分為兩部分,部分是介紹性的內(nèi)容,第二部分是更高級的內(nèi)容。
在部分中,假設你只了解JavaScript 編程語言和Web 開發(fā)的基礎知識,比如HTML,而沒有無服務器開發(fā)的經(jīng)驗。
在本部分中你將學習如何從頭創(chuàng)建OpenWhisk 應用程序。在探索了OpenWhisk 架構之后,將為一個靜態(tài)網(wǎng)站創(chuàng)建一個簡單的聯(lián)系人表單。
然后,我們將研究OpenWhisk 的CLI 和API,并以一種高度工程化的方式重新構建相同的應用程序,將其分解為協(xié)作操作并應用一組設計模式。你將了解開發(fā)應用程序所需的構建塊,以及示例和實踐。
在本書中,我們強調(diào)了測試的重要性,因此部分以一個專門討論單元測試、模擬和快照測試的章節(jié)結(jié)束。本書的第二部分為更高級的內(nèi)容,這里假設你了解更多的編程語言。第二部分的前兩章使用Python 編寫示例代碼,后兩章則使用Go。我們將討論在這些編程語言中開發(fā)OpenWhisk 應用程序的特性。
在第二部分中,我們還將探討與基礎外部服務,如數(shù)據(jù)庫(CouchDB)和消息傳遞隊列(Kafka)的集成。后一章將介紹如何在Kubernetes 中安裝OpenWhisk,包括Kubernetes 本身的安裝。這一章主要針對系統(tǒng)管理員,但是對于不熟悉Linux 的人也有幫助,因為它提供了逐步的安裝說明。
本書約定
本書使用如下排版約定:
斜體(Italic)
表示新術語、URL、電子郵件地址、文件名和文件擴展名。
等寬字體(Constant width)
表示程序列表,以及在段落中引用程序元素,如變量或函數(shù)名、數(shù)據(jù)庫、數(shù)據(jù)類型和環(huán)境變量、語句和關鍵字。
等寬黑體(Constant width bold)
表示需要用戶逐字輸入的命令或其他文本。
等寬斜體(Constant width italic)
表示應由用戶提供的值或由上下文確定的值進行替換的文本。
使用代碼范例
可以通過https://learing-apache-openwhisk.github.io 下載補充材料(代碼示例、練習等)。
本書是幫你完成具體工作的。一般情況下,如果本書提供了示例代碼,你可以在程序和文檔中使用它。你不需要獲得我們的許可,除非你是復制的代碼的重要部分。例如,編寫使用本書中幾個代碼塊的程序不需要獲得許可。出售或分發(fā)來自OReilly圖書的示例光盤確實需要獲得許可。通過引用本書和示例代碼來回答問題不需要獲得許可。將本書中的大量示例代碼合并到你的產(chǎn)品文檔中確實需要獲得許可。
我們感謝但不要求注明出處。出處通常包括標題、作者、出版商和ISBN。例如:Learning Apache OpenWhisk by Michele Sciabarrà (OReilly). Copyright 2019 Michele Sciabarrà, 978-1-492-04616-5。
如果你覺得你對代碼示例的使用超出了合理使用范圍,或者超出了上面給出的許可范圍,請隨時通過permissions@oreilly.com 與我們聯(lián)系。
OReilly 在線學習平臺(OReilly Online Learning)
近40 年來,OReilly Media 致力于提供技術和商業(yè)培訓、知識和卓越見解,來幫助眾多公司取得成功。
我們獨特的專家和創(chuàng)新者網(wǎng)絡通過書籍、文章、會議和我們的在線學習平臺分享他們的知識和專長。OReilly 的在線學習平臺可以讓你按需訪問現(xiàn)場培訓課程、深度學習路徑、交互式編碼環(huán)境,以及來自OReilly 和200 多個其他出版商的大量文本和視頻。更多信息,請訪問http://oreilly.com。
聯(lián)系我們
任何有關本書的意見或疑問,請按照以下地址聯(lián)系出版社。
美國:
OReilly Media, Inc.
1005 Gravenstein Highway North
Sebastopol, CA 95472
中國:
北京市西城區(qū)西直門南大街2 號成銘大廈C 座807 室(100035)
奧萊利技術咨詢(北京)有限公司
我們?yōu)楸緯峁┝司W(wǎng)頁,該網(wǎng)頁列出了勘誤表、范例和任何其他附加的信息。網(wǎng)址:http://bit.ly/learn-apache-openwhisk。
要詢問技術問題,或者對本書提出建議,請發(fā)送電子郵件至:bookquestions@oreilly.com。
關于我們的書籍、課程、會議和新聞的更多信息,請參閱我們的網(wǎng)站: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代理,該代理現(xiàn)在支持多個OpenWhisk 運行時,終我寫了一本關于Apache OpenWhisk 的書。
我還要感謝審稿人。當然,Carlos 和Rodric 是早閱讀初稿的人,Rob Allen、Dragos Dascalita 和Vincent Hou 也提供了寶貴的建議,以改進我的寫作,并糾正錯誤。后,我還要感謝參與OpenWhisk 項目的Apache 社區(qū)的一些成員:Dave Grove、Justin Halsall、James Thomas、Markus Thmmes、Matt Rutkowski、Priti Desai,以及其他所有我忘記在這里提到的人。
Michele Sciabarrà是信息技術的資深人士,目前是Sciabarra.com的首席執(zhí)行官,這是一家專注于Kubernetes和無服務器解決方案的咨詢公司。他還是Apache OpenWhisk項目的貢獻者,尤其是Go、Swift、Rust、Java和其他編程語言的高性能Action Loop運行時的作者。
目錄
序 . 1
前言 3
部分 OpenWhisk 開發(fā)介紹
第1 章 無服務器和OpenWhisk 體系結(jié)構 11
OpenWhisk 體系架構 12
功能和事件12
體系架構概覽 13
OpenWhisk 編程語言 14
操作和操作組合 15
動作鏈接 16
OpenWhisk 是如何工作的? 17
Nginx 18
控制器 19
負載均衡器19
調(diào)用者 20
客戶端 21
無服務執(zhí)行限制 21
action 是功能性的 23
動作是事件驅(qū)動的 23
操作沒有本地狀態(tài) 24
action 是有時間限制的 24
操作是無序的 25
從Java EE 到無服務 25
經(jīng)典的Java EE 架構 25
等效于Java EE 的無服務 27
小結(jié) 30
第2 章 一個簡單的OpenWhisk 應用程序 33
開始 34
Bash 命令提示行 34
IBM 云 35
創(chuàng)建一個簡單的聯(lián)系人表單 37
表單驗證 39
驗證地址 40
返回結(jié)果 41
保存表單數(shù)據(jù) 42
調(diào)用action 45
存儲到數(shù)據(jù)庫中 47
發(fā)送電子郵件 49
配置Mailgun 50
編寫一個action 來發(fā)送郵件 50
創(chuàng)建一個動作序列 53
小結(jié) 54
第3 章 OpenWhisk CLI 和JavaScript API 55
wsk 命令 56
配置wsk 命令 57
OpenWhisk 實體名 58
定義包 59
創(chuàng)建操作 61
操作的鏈式序列 64
包含一些你自己的代碼作為庫 66
檢查激活 69
管理觸發(fā)器和規(guī)則 70
使用反饋 75
通用JavaScript API 78
異步請求 78
使用promise 79
創(chuàng)造promise 80
使用OpenWhisk API 82
調(diào)用OpenWhisk 操作 83
觸發(fā)觸發(fā)器87
檢查激活 89
小結(jié) 90
第4 章 OpenWhisk 通用設計模式 91
內(nèi)置模式 92
單例模式 93
外觀模式 94
原型模式 96
裝飾模式 98
用操作實現(xiàn)通常模式 103
策略模式 103
責任鏈 106
命令模式 109
小結(jié) 113
第5 章 OpenWhisk 中的集成設計模式 115
集成模式 117
代理模式 117
適配器模式121
橋模式 123
觀察模式 125
用戶交互模式 130
組合模式 131
訪問模式 133
MVC 模式 135
小結(jié) 138
第6 章 單元測試OpenWhisk 應用程序 139
使用Jest 測試運行程序 140
使用Jest 140
本地測試 143
Snapshot 測試 150
Mocking 155
什么是mock ? 155
模擬一個HTTPS 請求 156
模擬OpenWhisk API 163
使用模擬庫調(diào)用操作 163
模擬操作參數(shù) 165
模擬一個序列 165
小結(jié) 167
第二部分 先進的OpenWhisk 開發(fā)應用
第7 章 用Python 開發(fā)OpenWhisk 操作 171
Python 運行時間 171
Python 運行時間是多少? 172
運行時間可用的庫 174
使用第三方庫 177
在zip 文件中打包一個Python 應用程序 177
使用virtualenv 180
virtualenv 和pip 的工作原理181
虛擬環(huán)境自動化 182
使用yattag 庫 182
建立virtualenv,包括一個庫 183
使用OpenWhisk REST API 184
身份驗證 185
用curl 連接到API 186
在Python 中使用OpenWhisk REST API 188
Python 中的調(diào)用、激活和觸發(fā)器 190
阻塞操作調(diào)用 191
非阻塞觸發(fā)器調(diào)用 193
檢索調(diào)用的結(jié)果 195
測試Python 操作 197
在本地重新創(chuàng)建Python 運行時環(huán)境 197
單元測試示例 198
在本地調(diào)用OpenWhisk API 201
模擬請求 202
小結(jié) 204
第8 章 在OpenWhisk 中使用CouchDB 205
如何查詢CouchDB 206
在命令行上探索CouchDB 208
CouchDB 工作方式 209
創(chuàng)建數(shù)據(jù)庫209
創(chuàng)建 210
檢索 211
更新 211
刪除 212
附件 213
查詢CouchDB 216
搜索數(shù)據(jù)庫217
索引 218
字段 219
分頁支持 220
書簽功能 221
選擇器 221
運算符 223
CouchDB 設計文件 225
視圖函數(shù) 227
用map 函數(shù)提取數(shù)據(jù) 227
用map 函數(shù)實現(xiàn)join 230
加入單個文檔 233
帶有reduce 函數(shù)的聚合 234
驗證函數(shù) 236
使用cloudant 包 238
cloudant 包中的crud 操作 240
包含包的查詢和視圖 244
小結(jié) 246
第9 章 Python 中的OpenWhisk Web 應用程序 247
CRUD 應用程序體系結(jié)構 247
抽象數(shù)據(jù)庫訪問 250
實現(xiàn)modelinit() 251
實現(xiàn)modelinsert() 251
實現(xiàn)modelfind() 253
測試 insert 和 find 253
實現(xiàn)modelupdate() 和modeldelete() 255
測試update 和 delete 257
用戶界面 257
測試 258
使用viewtable 呈現(xiàn)表 260
使用viewform 呈現(xiàn)表單 262
控制器 263
處理操作 264
邊界效應 268
高級的Web 操作 269
改進CRUD 應用程序 272
驗證和錯誤報告 274
分頁 276
創(chuàng)建索引 277
使用書簽和限制 277
頁碼 278
處理書簽 279
上傳和顯示圖像 280
文件上傳表單 281
解析文件上傳 282
將數(shù)據(jù)保存在數(shù)據(jù)庫中 284
生成一個 標記 284
生成一個URL 來檢索圖像 285
使用HTTP 請求呈現(xiàn)圖像 287
小結(jié) 288
第10 章 在Go 中開發(fā)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
調(diào)用OpenWhisk 操作 319
觸發(fā)觸發(fā)器321
檢索與激活ID 關聯(lián)的數(shù)據(jù) 323
小結(jié) 324
第11 章 通過OpenWhisk 使用Kafka 325
介紹Apache Kafka 326
Kafka 代理和協(xié)議 327
消息和關鍵字 328
主題和劃分328
偏移量和客戶機組 329
在IBM Cloud 中創(chuàng)建Kafka 實例 329
創(chuàng)建一個實例 330
創(chuàng)建一個主題 331
獲取證書 332
使用消息傳遞包 333
創(chuàng)建連接和反饋 334
使用一個操作接收消息 334
使用kafkacat 發(fā)送消息 335
測試Kafka 代理 336
一個在Go 中的Kafka Producer(生成器) 338
創(chuàng)建一個Producer 338
發(fā)送Kafka 消息 340
編寫發(fā)送者操作 341
部署和測試Producer 343
一個在Go 中的Kafka Consumer 344
創(chuàng)建一個Consumer 345
接收一個消息 347
編寫一個接收者操作 349
測試Consumer 351
實現(xiàn)Web 聊天的應用程序 352
綜述 353
用戶界面 354
初始化 355
加入 356
接收 358
發(fā)送 359
小結(jié) 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
網(wǎng)絡結(jié)構 383
安裝腳本 384
創(chuàng)建集群 385
安裝OpenWhisk 388
配置Kubectl 389
配置Helm 390
在Docker Desktop 上安裝 391
在Kubernetes 集群中安裝393
配置OpenWhisk 命令行界面 397
不安全地為Docker Desktop 配置wsk 397
創(chuàng)建一個新的命名空間 397
小結(jié) 399
總結(jié) 399
作者介紹 401
封面介紹 401