Apache OpenWhisk學(xué)習(xí)手冊(cè)
定 價(jià):128 元
無(wú)服務(wù)器的計(jì)算可以極大地簡(jiǎn)化軟件開(kāi)發(fā)。開(kāi)發(fā)團(tuán)隊(duì)只需要關(guān)注于應(yīng)用程序本身,與此同時(shí),基于云計(jì)算的無(wú)服務(wù)器平臺(tái)會(huì)管理應(yīng)用的配置和擴(kuò)展性。本實(shí)踐指南將為你逐步展示如何在一個(gè)靈活、多云服務(wù)商、多語(yǔ)言地?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)商的方法。本書(shū)作者演示了如何使用經(jīng)典設(shè)計(jì)模式和適合你任務(wù)的編程語(yǔ)言來(lái)構(gòu)建無(wú)服務(wù)器應(yīng)用程序。你將首先構(gòu)建一個(gè)簡(jiǎn)單的無(wú)服務(wù)器應(yīng)用程序,然后再深入研究OpenWhisk平臺(tái)中更復(fù)雜的方面。
前言本書(shū)是為那些想學(xué)習(xí)使用Apache OpenWhisk 的開(kāi)發(fā)人員編寫(xiě)的。Apache OpenWhisk 是一個(gè)成熟的、多語(yǔ)言的、無(wú)服務(wù)器的開(kāi)發(fā)平臺(tái),它提供了構(gòu)建復(fù)雜、結(jié)構(gòu)良好、多語(yǔ)種的無(wú)服務(wù)器應(yīng)用程序所需的知識(shí),這些應(yīng)用程序可以部署在任何云中,甚至可以部署在內(nèi)部。為什么是無(wú)服務(wù)器?長(zhǎng)期以來(lái),企業(yè)都是自己建立數(shù)據(jù)中心,并購(gòu)買(mǎi)硬件來(lái)安裝他們的網(wǎng)絡(luò)應(yīng)用程序、移動(dòng)后端或數(shù)據(jù)處理管道。但是建立和維護(hù)數(shù)據(jù)中心的高成本使其開(kāi)始從第三方租用服務(wù)器來(lái)降低成本。服務(wù)器經(jīng)常被劃分為虛擬機(jī),允許企業(yè)只為他們需要的東西付費(fèi)(而不是租用整個(gè)服務(wù)器)。終,這個(gè)概念演變成了今天我們通常所說(shuō)的云。云的核心主要是按需服務(wù)器服務(wù),F(xiàn)代云提供商提供廣泛的服務(wù),但也變得越來(lái)越復(fù)雜。特別是,這種復(fù)雜性的一個(gè)來(lái)源是需要調(diào)配和管理服務(wù)器。服務(wù)器就像是不容易飼養(yǎng)的牛,需要持續(xù)地護(hù)理和控制,必須進(jìn)行監(jiān)控、清潔、更新,偶爾還會(huì)被銷(xiāo)毀和重建。就像牛一樣,它們也趨向于快速生長(zhǎng)和繁殖。開(kāi)發(fā)人員希望無(wú)服務(wù)器以云的本地客戶(hù)(云原生)的身份開(kāi)發(fā)他們的應(yīng)用程序。這里的重點(diǎn)是將管理服務(wù)器的負(fù)擔(dān)推到部署在云中的平臺(tái)上。大多數(shù)軟件開(kāi)發(fā)人員希望上傳他們的代碼,并立即啟動(dòng)和運(yùn)行。因此,現(xiàn)在所有主要的云提供商都提供某種形式的功能即服務(wù)(Function as a Service,F(xiàn)aaS),它隱藏了服務(wù)器,只需要運(yùn)行代碼,簡(jiǎn)而言之,就是一種使用他們的無(wú)服務(wù)器云的方式。為什么是Apache OpenWhisk ?亞馬遜網(wǎng)絡(luò)服務(wù)(Amazon Web Services,AWS)及其Lambda 服務(wù)是無(wú)服務(wù)器計(jì)算的先驅(qū)。正如你所料,亞馬遜Lambda 非常適合AWS 產(chǎn)品。然而,無(wú)服務(wù)器計(jì)算并不局限于(也不能局限于)一個(gè)云提供商。自然的結(jié)果是,一些開(kāi)源的無(wú)服務(wù)器項(xiàng)目出現(xiàn)了。如今,有許多可用于無(wú)服務(wù)器計(jì)算的平臺(tái),它們可以在多個(gè)云中運(yùn)行。這本書(shū)的重點(diǎn)之一是Apache OpenWhisk。Apache OpenWhisk 開(kāi)源軟件初是由IBM 公司開(kāi)發(fā)的,但是后來(lái)它的代碼庫(kù)被捐贈(zèng)給Apache 軟件基金會(huì),并在商業(yè)友好的開(kāi)源許可下發(fā)布,即Apache 許可2.0。這使得它嚴(yán)肅地開(kāi)放源碼,不受商業(yè)限制,并對(duì)采用它的商業(yè)企業(yè)友好,長(zhǎng)期保持不變。因?yàn)槿魏蜛pache 項(xiàng)目都必須有一個(gè)工作代碼庫(kù)和一個(gè)活躍的社區(qū),Apache 軟件的采用者可以相信他們不會(huì)獨(dú)自使用它。此外,Apache 支持的軟件有一個(gè)詳細(xì)的合規(guī)性規(guī)則列表,允許每個(gè)人使用發(fā)布的軟件,而不會(huì)像其他一些開(kāi)源許可證一樣陷入非商業(yè)陷阱。除了作為Apache 項(xiàng)目的這些優(yōu)勢(shì)之外,OpenWhisk 還用于生產(chǎn)中,并用于支持IBM 云以及Adobe 公司的輸入/ 輸出運(yùn)行時(shí)云服務(wù)的云功能。Apache OpenWhisk還支持許多編程語(yǔ)言,包括Node.js、Python、Java、Go、Swift、PHP 和Ruby。更多的語(yǔ)言還在開(kāi)發(fā)之中。簡(jiǎn)而言之,它是一個(gè)穩(wěn)定的、成熟的、可用于生產(chǎn)的無(wú)服務(wù)器平臺(tái)。你將學(xué)到什么?本書(shū)是為開(kāi)發(fā)人員編寫(xiě)的,所以你需要熟悉編碼和編程語(yǔ)言。本書(shū)分為兩部分,部分是介紹性的內(nèi)容,第二部分是更高級(jí)的內(nèi)容。在部分中,假設(shè)你只了解JavaScript 編程語(yǔ)言和Web 開(kāi)發(fā)的基礎(chǔ)知識(shí),比如HTML,而沒(méi)有無(wú)服務(wù)器開(kāi)發(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ì)模式。你將了解開(kāi)發(fā)應(yīng)用程序所需的構(gòu)建塊,以及示例和實(shí)踐。在本書(shū)中,我們強(qiáng)調(diào)了測(cè)試的重要性,因此部分以一個(gè)專(zhuān)門(mén)討論單元測(cè)試、模擬和快照測(cè)試的章節(jié)結(jié)束。本書(shū)的第二部分為更高級(jí)的內(nèi)容,這里假設(shè)你了解更多的編程語(yǔ)言。第二部分的前兩章使用Python 編寫(xiě)示例代碼,后兩章則使用Go。我們將討論在這些編程語(yǔ)言中開(kāi)發(fā)OpenWhisk 應(yīng)用程序的特性。在第二部分中,我們還將探討與基礎(chǔ)外部服務(wù),如數(shù)據(jù)庫(kù)(CouchDB)和消息傳遞隊(duì)列(Kafka)的集成。后一章將介紹如何在Kubernetes 中安裝OpenWhisk,包括Kubernetes 本身的安裝。這一章主要針對(duì)系統(tǒng)管理員,但是對(duì)于不熟悉Linux 的人也有幫助,因?yàn)樗峁┝酥鸩降陌惭b說(shuō)明。本書(shū)約定本書(shū)使用如下排版約定:斜體(Italic)表示新術(shù)語(yǔ)、URL、電子郵件地址、文件名和文件擴(kuò)展名。等寬字體(Constant width)表示程序列表,以及在段落中引用程序元素,如變量或函數(shù)名、數(shù)據(jù)庫(kù)、數(shù)據(jù)類(lèi)型和環(huán)境變量、語(yǔ)句和關(guān)鍵字。等寬黑體(Constant width bold)表示需要用戶(hù)逐字輸入的命令或其他文本。等寬斜體(Constant width italic)表示應(yīng)由用戶(hù)提供的值或由上下文確定的值進(jìn)行替換的文本。使用代碼范例可以通過(guò)https://learing-apache-openwhisk.github.io 下載補(bǔ)充材料(代碼示例、練習(xí)等)。本書(shū)是幫你完成具體工作的。一般情況下,如果本書(shū)提供了示例代碼,你可以在程序和文檔中使用它。你不需要獲得我們的許可,除非你是復(fù)制的代碼的重要部分。例如,編寫(xiě)使用本書(shū)中幾個(gè)代碼塊的程序不需要獲得許可。出售或分發(fā)來(lái)自O(shè)Reilly圖書(shū)的示例光盤(pán)確實(shí)需要獲得許可。通過(guò)引用本書(shū)和示例代碼來(lái)回答問(wèn)題不需要獲得許可。將本書(shū)中的大量示例代碼合并到你的產(chǎn)品文檔中確實(shí)需要獲得許可。我們感謝但不要求注明出處。出處通常包括標(biāo)題、作者、出版商和ISBN。例如:Learning Apache OpenWhisk by Michele Sciabarrà (OReilly). Copyright 2019 Michele Sciabarrà, 978-1-492-04616-5。如果你覺(jué)得你對(duì)代碼示例的使用超出了合理使用范圍,或者超出了上面給出的許可范圍,請(qǐng)隨時(shí)通過(guò)permissions@oreilly.com 與我們聯(lián)系。OReilly 在線(xiàn)學(xué)習(xí)平臺(tái)(OReilly Online Learning)近40 年來(lái),OReilly Media 致力于提供技術(shù)和商業(yè)培訓(xùn)、知識(shí)和卓越見(jiàn)解,來(lái)幫助眾多公司取得成功。我們獨(dú)特的專(zhuān)家和創(chuàng)新者網(wǎng)絡(luò)通過(guò)書(shū)籍、文章、會(huì)議和我們的在線(xiàn)學(xué)習(xí)平臺(tái)分享他們的知識(shí)和專(zhuān)長(zhǎng)。OReilly 的在線(xiàn)學(xué)習(xí)平臺(tái)可以讓你按需訪問(wèn)現(xiàn)場(chǎng)培訓(xùn)課程、深度學(xué)習(xí)路徑、交互式編碼環(huán)境,以及來(lái)自O(shè)Reilly 和200 多個(gè)其他出版商的大量文本和視頻。更多信息,請(qǐng)?jiān)L問(wèn)http://oreilly.com。聯(lián)系我們任何有關(guān)本書(shū)的意見(jiàn)或疑問(wèn),請(qǐng)按照以下地址聯(lián)系出版社。美國(guó):OReilly Media, Inc.1005 Gravenstein Highway NorthSebastopol, CA 95472中國(guó):北京市西城區(qū)西直門(mén)南大街2 號(hào)成銘大廈C 座807 室(100035)奧萊利技術(shù)咨詢(xún)(北京)有限公司我們?yōu)楸緯?shū)提供了網(wǎng)頁(yè),該網(wǎng)頁(yè)列出了勘誤表、范例和任何其他附加的信息。網(wǎng)址:http://bit.ly/learn-apache-openwhisk。要詢(xún)問(wèn)技術(shù)問(wèn)題,或者對(duì)本書(shū)提出建議,請(qǐng)發(fā)送電子郵件至:bookquestions@oreilly.com。關(guān)于我們的書(shū)籍、課程、會(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來(lái)修復(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í),終我寫(xiě)了一本關(guān)于Apache OpenWhisk 的書(shū)。我還要感謝審稿人。當(dāng)然,Carlos 和Rodric 是早閱讀初稿的人,Rob Allen、Dragos Dascalita 和Vincent Hou 也提供了寶貴的建議,以改進(jìn)我的寫(xiě)作,并糾正錯(cuò)誤。后,我還要感謝參與OpenWhisk 項(xiàng)目的Apache 社區(qū)的一些成員:Dave Grove、Justin Halsall、James Thomas、Markus Thmmes、Matt Rutkowski、Priti Desai,以及其他所有我忘記在這里提到的人。
Michele Sciabarrà是信息技術(shù)的資深人士,目前是Sciabarra.com的首席執(zhí)行官,這是一家專(zhuān)注于Kubernetes和無(wú)服務(wù)器解決方案的咨詢(xún)公司。他還是Apache OpenWhisk項(xiàng)目的貢獻(xiàn)者,尤其是Go、Swift、Rust、Java和其他編程語(yǔ)言的高性能Action Loop運(yùn)行時(shí)的作者。
目錄序 . 1前言 3部分 OpenWhisk 開(kāi)發(fā)介紹第1 章 無(wú)服務(wù)器和OpenWhisk 體系結(jié)構(gòu) 11OpenWhisk 體系架構(gòu) 12功能和事件12體系架構(gòu)概覽 13OpenWhisk 編程語(yǔ)言 14操作和操作組合 15動(dòng)作鏈接 16OpenWhisk 是如何工作的? 17Nginx 18控制器 19負(fù)載均衡器19調(diào)用者 20客戶(hù)端 21無(wú)服務(wù)執(zhí)行限制 21action 是功能性的 23動(dòng)作是事件驅(qū)動(dòng)的 23操作沒(méi)有本地狀態(tài) 24action 是有時(shí)間限制的 24操作是無(wú)序的 25從Java EE 到無(wú)服務(wù) 25經(jīng)典的Java EE 架構(gòu) 25等效于Java EE 的無(wú)服務(wù) 27小結(jié) 30第2 章 一個(gè)簡(jiǎn)單的OpenWhisk 應(yīng)用程序 33開(kāi)始 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ù)庫(kù)中 47發(fā)送電子郵件 49配置Mailgun 50編寫(xiě)一個(gè)action 來(lái)發(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包含一些你自己的代碼作為庫(kù) 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用戶(hù)交互模式 130組合模式 131訪問(wèn)模式 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使用模擬庫(kù)調(diào)用操作 163模擬操作參數(shù) 165模擬一個(gè)序列 165小結(jié) 167第二部分 先進(jìn)的OpenWhisk 開(kāi)發(fā)應(yīng)用第7 章 用Python 開(kāi)發(fā)OpenWhisk 操作 171Python 運(yùn)行時(shí)間 171Python 運(yùn)行時(shí)間是多少? 172運(yùn)行時(shí)間可用的庫(kù) 174使用第三方庫(kù) 177在zip 文件中打包一個(gè)Python 應(yīng)用程序 177使用virtualenv 180virtualenv 和pip 的工作原理181虛擬環(huán)境自動(dòng)化 182使用yattag 庫(kù) 182建立virtualenv,包括一個(gè)庫(kù) 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如何查詢(xún)CouchDB 206在命令行上探索CouchDB 208CouchDB 工作方式 209創(chuàng)建數(shù)據(jù)庫(kù)209創(chuàng)建 210檢索 211更新 211刪除 212附件 213查詢(xún)CouchDB 216搜索數(shù)據(jù)庫(kù)217索引 218字段 219分頁(yè)支持 220書(shū)簽功能 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包含包的查詢(xún)和視圖 244小結(jié) 246第9 章 Python 中的OpenWhisk Web 應(yīng)用程序 247CRUD 應(yīng)用程序體系結(jié)構(gòu) 247抽象數(shù)據(jù)庫(kù)訪問(wèn) 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用戶(hù)界面 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分頁(yè) 276創(chuàng)建索引 277使用書(shū)簽和限制 277頁(yè)碼 278處理書(shū)簽 279上傳和顯示圖像 280文件上傳表單 281解析文件上傳 282將數(shù)據(jù)保存在數(shù)據(jù)庫(kù)中 284生成一個(gè) 標(biāo)記 284生成一個(gè)URL 來(lái)檢索圖像 285使用HTTP 請(qǐng)求呈現(xiàn)圖像 287小結(jié) 288第10 章 在Go 中開(kāi)發(fā)OpenWhisk 操作 289你的個(gè)Go 語(yǔ)言操作 290多文件包 293import、GOPATH 和vendor 文件夾 294在main 中多個(gè)文件的操作 295多個(gè)包的操作 297使用第三方庫(kù)的操作 299Go 如何使用第三方開(kāi)源庫(kù) 299為庫(kù)選擇一個(gè)給定版本 300預(yù)編譯操作302測(cè)試Go 操作 305編寫(xiě)測(cè)試 305測(cè)試用例 306嵌入的資源 308使用Web 操作提供資源 310在Go 中訪問(wèn)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 章 通過(guò)OpenWhisk 使用Kafka 325介紹Apache Kafka 326Kafka 代理和協(xié)議 327消息和關(guān)鍵字 328主題和劃分328偏移量和客戶(hù)機(jī)組 329在IBM Cloud 中創(chuàng)建Kafka 實(shí)例 329創(chuàng)建一個(gè)實(shí)例 330創(chuàng)建一個(gè)主題 331獲取證書(shū) 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編寫(xiě)發(fā)送者操作 341部署和測(cè)試Producer 343一個(gè)在Go 中的Kafka Consumer 344創(chuàng)建一個(gè)Consumer 345接收一個(gè)消息 347編寫(xiě)一個(gè)接收者操作 349測(cè)試Consumer 351實(shí)現(xiàn)Web 聊天的應(yīng)用程序 352綜述 353用戶(hù)界面 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 的一般過(guò)程 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