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