目錄
前言 .1
第0 章 Serverless 介紹 7
0.1 什么是Serverless? .8
0.1.1 Serverless 的歷史 .9
0.1.2 云服務提供商概況 . 10
0.1.3 可靠性,可用性,災難恢復 . 11
0.2 Serverless 的優(yōu)勢 . 12
0.2.1 增加的可伸縮性、安全性和可靠性 13
0.2.2 只支付你使用的東西 13
0.2.3 節(jié)省管理服務器的時間和金錢 13
0.2.4 提高開發(fā)人員的生產力 14
0.2.5 降低管理職責 14
0.2.6 集成的便利 15
0.3 Serverless 的弱點 . 15
0.3.1 冷(啟動)戰(zhàn) 16
0.3.2 計算時間. 16
0.3.3 VPC/ 網絡問題 17
0.3.4 應用程序的大小 . 17
0.3.5 可能會更貴 17
0.3.6 廠商鎖定. 18
0.3.7 復雜的調試 19
0.4 什么時候使用Serverless 有意義? . 19
0.5 Serverless 的計算機什么時候不適合你? 21
0.6 讓我們開始 . 22
部分 生產之路 .23
第1 章 分布式系統(tǒng) .25
1.1 什么是分布式系統(tǒng)? . 25
1.2 為什么我們需要一個分布式系統(tǒng)? 27
1.3 分布式系統(tǒng)的嚴酷現實 27
1.3.1 物理世界. 28
1.3.2 失蹤的消息 29
1.3.3 不可靠的時鐘 30
1.3.4 級聯故障. 31
1.3.5 更新產生的意外 . 32
1.3.6 冪等性 . 32
1.4 我負責什么? 33
1.5 在設計分布式系統(tǒng)時,你需要考慮哪些? 34
1.5.1 松耦合(或解耦) . 34
1.5.2 容錯 35
1.5.3 生成的(主)鍵 35
1.5.4 規(guī)劃冪等性 36
1.5.5 兩階段的更新 36
1.6 延伸閱讀 37
1.7 結論 38
第2 章 微服務 39
2.1 為什么要使用微服務? 40
2.1.1 提高開發(fā)速度 40
2.1.2 增加開發(fā)人員的自由 41
2.2 微服務的問題 42
2.2.1 增加了復雜性 43
2.2.2 需要適當的DevOps 實踐和資源 43
2.2.3 本地開發(fā)和測試的挑戰(zhàn) 44
2.3 如何有效地使用微服務? 45
2.3.1 一致的接口 45
2.3.2 松散耦合. 46
2.4 微服務有多微??? 47
2.5 選擇單體應用還是微服務 48
2.5.1 什么時候應該使用單體應用? 49
2.5.2 什么時候需要使用微服務? . 51
2.6 結論 52
第3 章 Serverless 架構和模式 53
3.1 架構師的角色 54
3.2 要成為一名架構師,你需要知道哪些? . 55
3.3 決策 55
3.3.1 什么樣的決策? . 56
3.3.2 記錄你的決策 57
3.3.3 我們如何做決策? . 57
3.3.4 我們什么時候做決策? 58
3.4 云服務提供商組件 59
3.4.1 流 60
3.4.2 隊列 60
3.4.3 桶 61
3.4.4 計算 62
3.4.5 數據存儲. 62
3.4.6 身份認證服務 63
3.4.7 API 網關 . 64
3.4.8 GraphQL . 64
3.4.9 網絡 64
3.4.10 狀態(tài)機 65
3.4.11 日志記錄 65
3.4.12 監(jiān)測和報警 . 66
3.5 來自云服務提供商的事件 67
3.6 模式 68
3.6.1 示例1:Serverless 單體應用 69
3.6.2 示例2:傳入Webhook 69
3.6.3 示例3:使用云服務提供商進行用戶身份驗證 70
3.6.4 示例4:通用的后臺任務模式 . 71
3.6.5 示例5:流提取、轉換、加載 . 71
3.6.6 示例6:創(chuàng)建自己的輪詢集成 . 72
3.6.7 示例7:處理文件和圖像 72
3.6.8 示例8:遷移服務模式 73
3.6.9 示例9:散開 74
3.7 結論 75
第4 章 接口 77
4.1 接口:需要一些組裝 . 78
4.1.1 消息 78
4.1.2 協(xié)議 78
4.1.3 約定 79
4.2 Serverless 接口 . 79
4.2.1 自動重試和死信隊列 80
4.2.2 有限與無限規(guī)模 . 81
4.3 設計接口 81
4.3.1 消息/ 載荷 . 82
4.3.2 會話和用戶/ 身份驗證 83
4.3.3 避免無約束的請求 . 83
4.3.4 接口與實現 84
4.3.5 帶邏輯的線 85
4.4 設計不愉快的路徑 86
4.4.1 驗證輸入. 86
4.4.2 失敗 86
4.5 與其他服務集成的策略 89
4.5.1 超時 89
4.5.2 重試 90
4.5.3 指數補償. 90
4.5.4 網絡鉤子. 91
4.5.5 評估外部服務 92
4.5.6 速度限制. 93
4.6 結論 93
第二部分 工具 95
第5 章 Serverless 框架 97
5.1 為什么使用Serverless 框架? 98
5.2 什么時候Serverless 框架不適合你 100
5.2.1 AWS 是的一等公民 100
5.2.2 AWS 的云服務模板也并不完美 100
5.2.3 你的基礎設施依賴陌生人 101
5.3 開始之前你需要知道些什么 102
5.3.1 YAML 102
5.3.2 Node.js 104
5.3.3 云資源和權限 104
5.3.4 基礎架構模板 106
5.3.5 生產的機密 . 106
5.3.6 .gitignore 文件 107
5.4 serverless.yml 文件的組成 107
5.4.1 提供者 108
5.4.2 環(huán)境 109
5.4.3 函數 110
5.4.4 資源 111
5.4.5 包 . 111
5.4.6 插件 112
5.4.7 自定義 113
5.4.8 用于健全和安全的命名空間 114
5.5 使用Serverless 命令 114
5.5.1 安裝Serverless . 114
5.5.2 使用憑證設置Serverless . 115
5.5.3 使用Serverless install 拉入模板 116
5.5.4 檢查示例項目的包(里面有什么) 116
5.5.5 部署 117
5.5.6 調用函數,并查看日志 117
5.5.7 回滾 118
5.5.8 銷毀服務 118
5.5.9 部署軟件包 . 119
5.6 現實世界serverless.yml . 119
5.6.1 設置環(huán)境變量 120
5.6.2 修改權限 120
5.7 結論 . 121
第6 章 監(jiān)控、可觀察性和警報 123
6.1 監(jiān)控是什么? . 123
6.1.1 我們?yōu)槭裁葱枰O(jiān)控? 124
6.1.2 監(jiān)控與Serverless 有什么關系? . 125
6.1.3 自動化的入口 125
6.2 我有什么選擇? 126
6.2.1 托管SaaS 產品 . 126
6.2.2 自托管和開放源碼 127
6.3 監(jiān)控的組成部分 128
6.3.1 監(jiān)控指標 128
6.3.2 圖表和圖形 . 132
6.3.3 儀表板 133
6.3.4 警報/ 警告 134
6.4 選擇先進的實踐 136
6.4.1 心跳 136
6.4.2 冒煙測試和/ 或金絲雀 . 137
6.4.3 世界上重要的度量標準 137
6.4.4 避免廠商鎖定 139
6.4.5 隨著時間的推移清除度量和警報 140
6.5 結論 . 140
第7 章 日志 141
7.1 日志是什么? . 142
7.2 為什么需要日志? 143
7.3 何時依賴日志而不是監(jiān)控指標 144
7.4 應該記錄什么? 145
7.5 你不應該記錄什么? 147
7.6 日志是如何工作的? 148
7.6.1 確保你的日志可伸縮 . 149
7.6.2 結構化的日志 150
7.6.3 更有效的日志調試 150
7.6.4 搜索日志 151
7.6.5 異常日志(Sentry) 151
7.7 收集其他日志 . 152
7.8 合規(guī) . 153
7.9 分布式跟蹤 154
7.10 加密日志以保證隱私和遵從性 154
7.11 那么你應該怎么做呢? 154
7.11.1 只加密敏感字段的值 155
7.11.2 加密整個日志語句 155
7.12 結論 156
第8 章 變更、自動化和部署流水線 157
8.1 應對變化 158
8.2 自動化的作用 . 158
8.3 使你的代碼為部署到生產系統(tǒng)做好準備 160
8.4 基礎設施即代碼 161
8.5 數據庫更改(遷移) 163
8.6 配置管理 164
8.7 什么是流水線? 164
8.8 關于流水線的決策 165
8.9 金絲雀和藍/ 綠部署 166
8.10 為什么需要流水線? 168
8.11 部署流水線的關鍵階段 168
8.11.1 步驟1:執(zhí)行標準 . 169
8.11.2 步驟2:構建和打包 169
8.11.3 步驟3:測試 170
8.11.4 步驟4:發(fā)布Artifact . 170
8.11.5 步驟5:部署到目標環(huán)境 171
8.11.6 步驟6:驗證部署 . 171
8.11.7 步驟7:必要時(可能)回滾 172
8.12 流水線故障處理 172
8.13 結論 173
第三部分 概念 175
第9 章 安全性、權限和隱私 . 177
9.1 每個人都有責任,但你尤其有責任 . 179
9.2 做好被黑的準備 180
9.2.1 了解你的威脅和攻擊者 181
9.2.2 設計的安全 . 181
9.3 限制,跟蹤和審查所有秘密和訪問 . 183
9.4 準備更新 185
9.4.1 深度防御 186
9.4.2 限制爆炸半徑 187
9.4.3 信任,但要核查 188
9.5 驗證所有用戶輸入并對設置重復檢查 190
9.5.1 監(jiān)控系統(tǒng)中的異常情況 192
9.5.2 測試你的安全 192
9.5.3 仔細選擇依賴項并保持軟件的 193
9.5.4 優(yōu)先保護你的數據和客戶數據的隱私 195
9.5.5 不要干擾生產 196
9.6 確保你的電腦安全 197
9.7 繼續(xù)學習 197
9.8 結論 . 198
第10 章 質量、測試和模擬 201
10.1 代碼質量的作用 202
10.1.1 代碼風格 203
10.1.2 代碼校驗 204
10.2 測試 206
10.2.1 測試什么,不測試什么 . 207
10.2.2 測試類型 207
10.2.3 代碼覆蓋率 212
10.2.4 加強你的測試 . 214
10.3 模擬 214
10.4 結論 218
第11 章 為失敗做計劃 219
11.1 簡介:理解它,即使你不能管理它 219
11.2 識別風險 . 221
11.3 做好準備 . 222
11.4 做一個運行手冊 223
11.5 計劃宕機 . 225
11.6 監(jiān)控你的云服務提供商 226
11.7 了解你的(服務)限制 227
11.8 結論 228
第12 章 總結 . 229
12.1 在供應商之間做取舍 230
12.2 社區(qū) 231
12.3 尋求其他人的建議 . 232
12.4 陷入困境時該如何做 233
12.5 邁出職業(yè)生涯的下一步 233