前 言
我們成為開發(fā)人員已經(jīng)超過10年了。從20世紀(jì)90年代的第一臺(tái)計(jì)算機(jī)開始,我們就自己開發(fā)了第一個(gè)用Pascal和BASIC編寫的函數(shù),甚至還參加了編程競(jìng)賽。但是當(dāng)網(wǎng)絡(luò)出現(xiàn)時(shí),一切都改變了。我們立即著手構(gòu)建第一個(gè)使用靜態(tài)HTML和CSS的Web應(yīng)用及網(wǎng)頁。當(dāng)JavaScript和jQuery成為新標(biāo)準(zhǔn)時(shí)我們幾乎立即轉(zhuǎn)向它們(即使有人還在使用Flash和ActionScript)。隨著Node.js的出現(xiàn),我們正在使用的語言(如Python和C#)被它替換是理所應(yīng)當(dāng)?shù)摹<词刮覀冇袝r(shí)仍然使用這些語言編寫一些函數(shù),但我們轉(zhuǎn)向Node.js是必然的。
大約三年前,我們將注意力轉(zhuǎn)向無服務(wù)器架構(gòu)。Gojko Adzic通過他最初使用Claudia.js作為部署工具完成的工作向我們介紹了AWS Lambda。我們驚訝于開發(fā)和部署無服務(wù)器架構(gòu)應(yīng)用的速度和容易程度,以及擴(kuò)展它們是那么簡(jiǎn)單,我們開始與他一起創(chuàng)建Claudia Bot Builder。
日復(fù)一日,我們對(duì)構(gòu)建和維護(hù)Web應(yīng)用的觀點(diǎn)完全被無服務(wù)器架構(gòu)改變。后端服務(wù)被無服務(wù)器函數(shù)取代,而不需要編寫bash腳本、登錄服務(wù)器以及規(guī)劃容量,我們不再關(guān)注這些問題,而是更多地關(guān)注業(yè)務(wù)邏輯和應(yīng)用價(jià)值。
我們將第一個(gè)無服務(wù)器架構(gòu)Web應(yīng)用發(fā)布到生產(chǎn)環(huán)境中,并開發(fā)了數(shù)百個(gè)聊天機(jī)器人。我們的產(chǎn)量增加了近五倍。這太不可思議了。花幾個(gè)月時(shí)間學(xué)習(xí)如何使用bash、ssh、rsync等配置和維護(hù)應(yīng)用服務(wù)器已經(jīng)不再重要了。一切都變了。從我們的出發(fā)點(diǎn)看,無服務(wù)器架構(gòu)生態(tài)走了很長(zhǎng)的一段路——無服務(wù)器架構(gòu)提供商現(xiàn)在更容易使用,而且每年有越來越多的無服務(wù)器架構(gòu)應(yīng)用組件可用(Amazon re:Invent)。
無服務(wù)器架構(gòu)在近幾年內(nèi)日新月異——我們已經(jīng)把它作為自己的事業(yè)。我們開始討論無服務(wù)器架構(gòu),舉辦研討會(huì)和提供無服務(wù)器架構(gòu)業(yè)務(wù)咨詢。我們嘗試總結(jié)經(jīng)驗(yàn)和知識(shí),結(jié)合多個(gè)其他來源,并以易于學(xué)習(xí)和理解的方式將它們組合在一起。
第Ⅰ部分 無服務(wù)器比薩店
第1章 使用Claudia的無服務(wù)器架構(gòu)介紹 3
1.1 服務(wù)器和洗衣機(jī) 4
1.2 核心概念 4
1.3 無服務(wù)器的工作方式 6
1.4 無服務(wù)器實(shí)踐 6
1.4.1 Maria姨媽的無服務(wù)器比薩店應(yīng)用 7
1.4.2 一種常見的方法 7
1.4.3 無服務(wù)器方法 9
1.5 無服務(wù)器基礎(chǔ)設(shè)施——AWS 10
1.6 什么是Claudia,應(yīng)如何配置 14
1.7 何時(shí)以及在何處使用無服務(wù)器 16
1.8 本章小結(jié) 17
第2章 構(gòu)建你的第一個(gè)無服務(wù)器API 18
2.1 制作比薩原料: 構(gòu)建API 18
2.1.1 能買到哪種比薩 20
2.1.2 構(gòu)建你的API 24
2.1.3 創(chuàng)建比薩訂單 28
2.2 Claudia如何部署 你的API 32
2.3 流量控制:API Gateway 的工作原理 34
2.4 當(dāng)無服務(wù)器API不是解決 方案時(shí) 35
2.5 試一試 35
2.5.1 練習(xí) 35
2.5.2 解決方案 36
2.6 本章小結(jié) 40
第3章 實(shí)現(xiàn)異步工作很容易,我們有.promise()方法 41
3.1 存儲(chǔ)訂單 41
3.2 承諾在30分鐘內(nèi)交付 46
3.3 試用你的API 49
3.4 從數(shù)據(jù)庫(kù)獲取訂單 54
3.5 試一試 56
3.5.1 練習(xí) 56
3.5.2 解決方案 57
3.6 本章小結(jié) 60
第4章 比薩遞送:外部連接 61
4.1 連接外部服務(wù) 61
4.2 連接到遞送API 62
4.2.1 Some Like It Hot
Delivery API 63
4.2.2 創(chuàng)建第一個(gè)交付請(qǐng)求 64
4.3 異步通信的潛在問題 70
4.3.1 忘記返回Promise 71
4.3.2 不傳遞Promise的值 72
4.3.3 不將外部服務(wù)包裝在Promise中 72
4.3.4 長(zhǎng)異步操作的超時(shí)問題 73
4.4 試一試 75
4.4.1 練習(xí) 75
4.4.2 解決方案 75
4.5 本章小結(jié) 77
第5章 程序出錯(cuò) 79
5.1 調(diào)試無服務(wù)器應(yīng)用 79
5.2 調(diào)試Lambda函數(shù) 81
5.3 剖析應(yīng)用 84
5.4 試一試 87
5.4.1 練習(xí) 88
5.4.2 解決方案 88
5.5 本章小結(jié) 88
第6章 升級(jí)你的API 89
6.1 無服務(wù)器認(rèn)證和授權(quán) 89
6.2 創(chuàng)建用戶池和標(biāo)識(shí)池 93
6.3 試一試 99
6.3.1 練習(xí) 99
6.3.2 解決方案 100
6.4 本章小結(jié) 102
第7章 處理文件 103
7.1 在無服務(wù)器應(yīng)用中存儲(chǔ)靜態(tài)文件 103
7.2 生成縮略圖 107
7.3 試一試 114
7.3.1 練習(xí) 115
7.3.2 解決方案 115
7.4 本書第Ⅰ部分結(jié)束:特殊練習(xí) 117
7.5 本章小結(jié) 117
第Ⅱ部分 來聊天吧
第8章 訂購(gòu)比薩只需要一條信息:聊天機(jī)器人 121
8.1 瀏覽器之外的比薩訂購(gòu) 121
8.2 來自Facebook Messenger的問候 122
8.3 你們有什么比薩 125
8.4 加快部署速度 128
8.5 Messenger模板 129
8.6 Claudia Bot Builder的工作方式 132
8.7 試一試 133
8.7.1 練習(xí) 134
8.7.2 解決方案 134
8.8 本章小結(jié) 134
第9章 異步和延遲響應(yīng) 135
9.1 使聊天機(jī)器人具有交互性 135
9.2 增強(qiáng)聊天機(jī)器人結(jié)構(gòu)的可擴(kuò)展性 141
9.3 將聊天機(jī)器人連接到DynamoDB數(shù)據(jù)庫(kù) 146
9.4 從聊天機(jī)器人獲取用戶位置 149
9.5 安排交付 153
9.6 集成簡(jiǎn)單的NLP 158
9.7 試一試 159
9.7.1 練習(xí) 159
9.7.2 解決方案 159
9.7.3 高級(jí)練習(xí) 161
9.8 本章小結(jié) 162
第10章 Jarvis,我的意思是Alexa,請(qǐng)幫我點(diǎn)一份比薩 163
10.1 現(xiàn)在不能說話:用Twilio發(fā)送SMS短信 164
10.1.1 SMS比薩列表 165
10.1.2 訂購(gòu)比薩 167
10.2 使用Alexa 172
10.2.1 準(zhǔn)備skill 176
10.2.2 使用Alexa點(diǎn)比薩 180
10.3 試一試 183
10.3.1 練習(xí) 183
10.3.2 解決方案 184
10.4 第Ⅱ部分結(jié)束:特殊練習(xí) 184
10.5 本章小結(jié) 185
第Ⅲ部分 下一步
第11章 測(cè)試 189
11.1 測(cè)試服務(wù)器托管應(yīng)用和無服務(wù)器應(yīng)用 189
11.2 如何測(cè)試無服務(wù)器應(yīng)用 191
11.3 前期準(zhǔn)備 192
11.4 單元測(cè)試 195
11.5 模擬無服務(wù)器函數(shù) 199
11.6 集成測(cè)試 205
11.7 其他類型的自動(dòng)化測(cè)試 209
11.8 更進(jìn)一步:編寫可測(cè)試的無服務(wù)器函數(shù) 210
11.9 試一試 214
11.9.1 練習(xí) 214
11.9.2 解決方案 215
11.10 本章小結(jié) 216
第12章 為比薩付款 217
12.1 付款交易 217
12.2 實(shí)現(xiàn)支付服務(wù) 222
12.3 有人能攻擊支付服務(wù)嗎 228
12.3.1 標(biāo)準(zhǔn) 229
12.3.2 權(quán)限 230
12.4 試一試 230
12.4.1 練習(xí) 230
12.4.2 解決方案 230
12.5 本章小結(jié) 232
第13章 將現(xiàn)有的Express.js應(yīng)用程序遷移到AWS Lambda 233
13.1 Roberto叔叔的出租車應(yīng)用 234
13.2 在AWS Lambda中運(yùn)行Express.js應(yīng)用 234
13.2.1 代理集成 237
13.2.2 serverless-express模塊的工作方式 238
13.3 提供靜態(tài)內(nèi)容 239
13.4 連接到MongoDB 241
13.5 無服務(wù)器Express.js應(yīng)用的限制 245
13.6 試一試 246
13.6.1 練習(xí) 247
13.6.2 解決方案 247
13.7 本章小結(jié) 248
第14章 遷移到無服務(wù)器 249
14.1 分析當(dāng)前的無服務(wù)器應(yīng)用 249
14.2 將現(xiàn)有應(yīng)用遷移到無服務(wù)器 251
14.3 擁抱平臺(tái) 253
14.3.1 提供靜態(tài)文件 254
14.3.2 存儲(chǔ)狀態(tài) 254
14.3.3 日志 255
14.3.4 持續(xù)集成 256
14.3.5 管理環(huán)境:生產(chǎn)和開發(fā) 257
14.3.6 分享機(jī)密 258
14.3.7 VPC(虛擬私有云) 260
14.4 優(yōu)化應(yīng)用 261
14.4.1 捆綁或單用途功能 261
14.4.2 為L(zhǎng)ambda函數(shù)選擇合適的內(nèi)存大小 261
14.5 面對(duì)挑戰(zhàn) 262
14.5.1 處理超時(shí) 262
14.5.2 冷啟動(dòng) 263
14.5.3 DDoS攻擊 264
14.5.4 廠商綁定 265
14.6 試一試 266
14.7 本章小結(jié) 266
第15章 實(shí)際案例研究 267
15.1 CodePen 267
15.1.1 無服務(wù)器之前 268
15.1.2 無服務(wù)器遷移 269
15.1.3 基礎(chǔ)設(shè)施成本 271
15.1.4 測(cè)試與挑戰(zhàn) 272
15.2 MindMup 272
15.2.1 無服務(wù)器之前 273
15.2.2 無服務(wù)器遷移 275
15.2.3 基礎(chǔ)設(shè)施成本 277
15.2.4 測(cè)試、日志和挑戰(zhàn) 277
15.3 本章小結(jié) 279
附錄A 安裝和配置 281
附錄B 配置Facebook Messenger、Twilio和Alexa 287
附錄C 設(shè)置Stripe和MongoDB 309