從零構(gòu)建Rust生產(chǎn)級服務(wù)
定 價:168 元
- 作者:(美)Luca Palmieri(盧卡·帕爾米耶里)
- 出版時間:2024/9/1
- ISBN:9787121487071
- 出 版 社:電子工業(yè)出版社
- 中圖法分類:TP312
- 頁碼:560
- 紙張:
- 版次:01
- 開本:16開
本書是一本面向 Rust 后端開發(fā)人員的入門參考書,通過實際項目引導(dǎo)讀者從 0 到 1 構(gòu)建一個功能齊全的電子郵件通信API。本書涵蓋了廣泛的主題,包括 Rust 生態(tài)系統(tǒng)的利用、應(yīng)用結(jié)構(gòu)的設(shè)計、測試的編寫、用戶認(rèn)證和授權(quán)、錯誤處理策略的實施、應(yīng)用狀態(tài)的觀察,以及持續(xù)集成和部署管道的建立等。本書不僅介紹了具體的工具和庫,還深入探討了系統(tǒng)設(shè)計、可觀測性和易操作性等重要概念,能夠幫助讀者掌握專業(yè)的開發(fā)方法。 本書適合初學(xué)者,是開啟 Rust 開發(fā)之旅的理想起點,即使沒有 Rust 或后端開發(fā)經(jīng)驗,相信你也能夠輕松跟上、快速入門。
Luca Palmieri是Rust London用戶組的聯(lián)合組織者、開源貢獻者和公眾演講者,擁有多年在生產(chǎn)環(huán)境中運行數(shù)十個Rust服務(wù)的經(jīng)驗,也是幾個Rust編程的積極推廣者和Rust研討會作者。
溫祖彤,電子信息專業(yè)碩士在讀。曾于字節(jié)跳動進行后端開發(fā)實習(xí),于清華大學(xué)開源操作系統(tǒng)訓(xùn)練營擔(dān)任Rust基礎(chǔ)/算法講師,在Rust以及相關(guān)領(lǐng)域有一定的經(jīng)驗和見解;曾參與多項編程/算法相關(guān)競賽,是一名資深的開源技術(shù)以及編程愛好者,還制作過多項人工智能/算法競賽領(lǐng)域相關(guān)的開源課程。李力,畢業(yè)于西安理工大學(xué),Java技術(shù)專家,從業(yè)9年,曾在網(wǎng)易、Chainup、新東方在線等知名企業(yè)從事研發(fā)工作,現(xiàn)就職于西安騰訊云,從事于大模型知識引擎LKE開發(fā),實踐經(jīng)驗豐富。對分布式系統(tǒng)、架構(gòu)設(shè)計、存儲系統(tǒng)充滿興趣!禨cala編程實戰(zhàn)》(第2版)譯者。楊楚天,畢業(yè)于華東師范大學(xué),任職于諾基亞,從事通信系統(tǒng)開發(fā)工作,有多年的 C++ 技術(shù)開發(fā)經(jīng)驗。在業(yè)余時間修煉 Rust,對云原生架構(gòu)與開發(fā)很感興趣。
第1章 準(zhǔn)備工作 1
1.1 安裝Rust工具鏈 1
1.1.1 編譯目標(biāo) 1
1.1.2 發(fā)布渠道 2
1.1.3 我們需要什么樣的工具鏈 2
1.2 項目初始化 3
1.3 集成開發(fā)環(huán)境 3
1.3.1 rust-analyzer 4
1.3.2 IntelliJ Rust 4
1.3.3 應(yīng)該如何選擇IDE 4
1.4 內(nèi)部開發(fā)循環(huán) 5
1.4.1 更快的鏈接 5
1.4.2 cargo-watch 6
1.5 持續(xù)集成 7
1.5.1 持續(xù)集成的步驟 8
1.5.2 準(zhǔn)備就緒的持續(xù)集成流水線 10
第2章 構(gòu)建郵件簡報 12
2.1 引導(dǎo)示例 12
2.1.1 基于問題的學(xué)習(xí) 12
2.1.2 幫助完善本書 13
2.2 郵件簡報服務(wù)應(yīng)該做什么 13
2.2.1 捕捉需求:用戶故事 13
2.3 循序漸進,不斷迭代 14
2.3.1 準(zhǔn)備開始 15
第3章 注冊新的訂閱者 16
3.1 前期準(zhǔn)備工作 16
3.2 選擇一個Web框架 17
3.3 實現(xiàn)第一個端點:健康檢查 17
3.3.1 使用actix-web編寫代碼 18
3.3.2 actix-web應(yīng)用程序剖析 19
3.3.3 實現(xiàn)健康檢查處理器 24
3.4 第一次集成測試 27
3.4.1 如何對端點進行測試 27
3.4.2 應(yīng)該將測試放在哪里 28
3.4.3 改變項目結(jié)構(gòu)以便于測試 30
3.5 實現(xiàn)第一個集成測試 33
3.5.1 優(yōu)化 36
3.6 重新聚焦 40
3.7 處理HTML表單 40
3.7.1 提煉需求 40
3.7.2 以測試的形式捕捉需求 41
3.7.3 從POST請求中解析表單數(shù)據(jù) 44
3.8 存儲數(shù)據(jù):數(shù)據(jù)庫 52
3.8.1 選擇數(shù)據(jù)庫 52
3.8.2 選擇數(shù)據(jù)庫包 53
3.8.3 帶有副作用的集成測試 55
3.8.4 數(shù)據(jù)庫初始化 56
3.8.5 編寫第一個查詢 62
3.9 持久化一個新的訂閱者 70
3.9.1 actix-web中的應(yīng)用程序狀態(tài) 70
3.9.2 actix-web工作進程 72
3.9.3 Data提取器 74
3.9.4 INSERT語句 74
3.10 更新測試 78
3.10.1 測試隔離 81
3.11 總結(jié) 85
第4章 遙測 86
4.1 未知的未知 86
4.2 可觀測性 87
4.3 日志 88
4.3.1 log包 89
4.3.2 actix-web的Logger中間件 89
4.3.3 外觀模式 90
4.4 插樁POST /subscriptions 92
4.4.1 與外部系統(tǒng)的交互 93
4.4.2 像用戶一樣思考 94
4.4.3 日志應(yīng)當(dāng)易于關(guān)聯(lián) 96
4.5 結(jié)構(gòu)化日志 98
4.5.1 tracing包 99
4.5.2 從log遷移到tracing 99
4.5.3 tracing中的跨度 100
4.5.4 插樁future 102
4.5.5 tracing的Subscriber 104
4.5.6 tracing-subscriber 105
4.5.7 tracing-bunyan-formatter 105
4.5.8 tracing-log 107
4.5.9 刪除未使用的依賴 109
4.5.10 清理初始化流程 109
4.5.11 集成測試中的日志 112
4.5.12 清理插樁代碼——tracing::instrument 116
4.5.13 保護隱私——secrecy 119
4.5.14 請求ID 121
4.5.15 借力tracing生態(tài)系統(tǒng) 124
4.6 總結(jié) 124
第5章 上線 125
5.1 我們必須討論部署問題 125
5.2 選擇工具 126
5.2.1 虛擬化:Docker 126
5.2.2 托管:DigitalOcean 127
5.3 應(yīng)用程序的Dockerfile 127
5.3.1 Dockerfile 127
5.3.2 構(gòu)建上下文 128
5.3.3 sqlx離線模式 129
5.3.4 運行鏡像 131
5.3.5 網(wǎng)絡(luò) 132
5.3.6 層次化配置 133
5.3.7 數(shù)據(jù)庫連接 138
5.3.8 優(yōu)化Docker鏡像 139
5.4 部署到DigitalOcean應(yīng)用平臺 144
5.4.1 安裝 144
5.4.2 應(yīng)用規(guī)范 144
5.4.3 如何使用環(huán)境變量注入加密信息 147
5.4.4 連接到DigitalOcean的Postgres實例 149
5.4.5 應(yīng)用配置中的環(huán)境變量 152
5.4.6 最后一步,推送 153
第6章 拒絕無效的訂閱者(第一部分) 155
6.1 需求 156
6.1.1 姓名約束 156
6.1.2 安全約束 156
6.2 第一次實現(xiàn) 158
6.3 漏洞百出的驗證 159
6.4 類型驅(qū)動開發(fā) 160
6.5 所有權(quán)遇見不變量 164
6.5.1 AsRef 167
6.6 panic 169
6.7 Result——將錯誤作為值 171
6.7.1 使解析函數(shù)返回Result類型 171
6.8 精確的斷言錯誤:claim 174
6.9 單元測試 175
6.10 處理 Result 177
6.10.1 match 177
6.10.2 “?”操作符 178
6.10.3 400的請求錯誤 179
6.11 電子郵件地址格式 179
6.12 SubscriberEmail類型 180
6.12.1 拆分domain子模塊 180
6.12.2 新類型的框架 181
6.13 屬性測試 184
6.13.1 使用fake生成隨機測試數(shù)據(jù) 184
6.13.2 quickcheck與proptest 185
6.13.3 quickcheck入門 185
6.13.4 實現(xiàn)Arbitrary特質(zhì) 186
6.14 請求體驗證 188
6.14.1 使用TryFrom重構(gòu) 192
6.15 總結(jié) 195
第7章 拒絕無效的訂閱者(第二部分) 196
7.1 確認(rèn)郵件 196
7.1.1 訂閱者的同意 196
7.1.2 確認(rèn)用戶的流程 197
7.1.3 實現(xiàn)策略 198
7.2 郵件發(fā)送組件——EmailClient 198
7.2.1 如何發(fā)送電子郵件 198
7.2.2 如何使用reqwest編寫REST客戶端 201
7.2.3 如何測試REST客戶端 208
7.2.4 EmailClient::send_email的初版實現(xiàn) 213
7.2.5 加強正常的測試 221
7.2.6 處理失敗情況 228
7.3 可維護測試套件的骨架和原則 237
7.3.1 為什么要編寫測試 238
7.3.2 為什么不編寫測試 238
7.3.3 測試代碼也是代碼 238
7.3.4 測試套件 239
7.3.5 測試發(fā)現(xiàn) 240
7.3.6 每個測試文件都是一個包 241
7.3.7 共享測試輔助函數(shù) 241
7.3.8 共享啟動邏輯 244
7.3.9 構(gòu)建API客戶端 252
7.3.10 小結(jié) 256
7.4 重新聚焦 256
7.5 零停機部署 257
7.5.1 可靠性 257
7.5.2 部署策略 258
7.6 數(shù)據(jù)庫遷移 261
7.6.1 狀態(tài)存在于應(yīng)用程序之外 261
7.6.2 部署與遷移 261
7.6.3 多步遷移 262
7.6.4 新的必填字段 262
7.6.5 新表 263
7.7 發(fā)送確認(rèn)郵件 264
7.7.1 固定的電子郵件地址 264
7.7.2 固定的確認(rèn)鏈接 269
7.7.3 等待確認(rèn) 272
7.7.4 GET /subscriptions/confirm的骨架 276
7.7.5 整合 278
7.7.6 訂閱令牌 287
7.8 數(shù)據(jù)庫事務(wù) 294
7.8.1 全部成功,或者全部失敗 294
7.8.2 Postgres中的事務(wù) 295
7.8.3 sqlx中的事務(wù) 295
7.9 總結(jié) 299
第8章 錯誤處理 300
8.1 錯誤處理的目的 300
8.1.1 系統(tǒng)內(nèi)部錯誤 301
8.1.2 系統(tǒng)交互錯誤 303
8.1.3 小結(jié) 305
8.2 為操作人員提供錯誤報告 305
8.2.1 跟蹤錯誤的根本原因 308
8.2.2 Error特質(zhì) 313
8.3 控制流與錯誤處理 316
8.3.1 控制流的分層 316
8.3.2 使用枚舉對錯誤建模 317
8.3.3 只有錯誤類型還不夠 319
8.3.4 使用thiserror減少樣板代碼 323
8.4 防止“大泥球”型的錯誤枚舉 324
8.4.1 使用anyhow擦除錯誤類型 329
8.4.2 使用anyhow還是thiserror 331
8.5 錯誤日志由誰來記 331
8.6 總結(jié) 333
第9章 投遞郵件簡報 334
9.1 用戶故事在變化 334
9.2 不要向未確認(rèn)的訂閱者發(fā)送 335
9.2.1 使用公共API設(shè)置狀態(tài) 336
9.2.2 scoped mock 337
9.2.3 綠色測試 338
9.3 所有已確認(rèn)的訂閱者都會收到新內(nèi)容 339
9.3.1 組合測試輔助函數(shù) 339
9.4 實現(xiàn)策略 341
9.5 請求體的內(nèi)容 341
9.5.1 測試無效輸入 342
9.6 獲取已確認(rèn)的訂閱者列表 344
9.7 發(fā)送郵件簡報 346
9.7.1 context與with_context 347
9.8 驗證存儲的數(shù)據(jù) 348
9.8.1 責(zé)任界限 352
9.8.2 關(guān)注編譯器 353
9.8.3 移除樣板代碼 355
9.9 簡單方法的局限性 356
9.10 總結(jié) 357
第10章 API的安全性 358
10.1 認(rèn)證 358
10.1.1 缺點 359
10.1.2 多因素身份驗證 359
10.2 基于密碼的身份驗證 359
10.2.1 基本身份驗證 360
10.2.2 密碼驗證——簡單的方法 365
10.2.3 密碼存儲 368
10.2.4 不要阻塞異步執(zhí)行器 384
10.2.5 用戶枚舉 390
10.3 這安全嗎 395
10.3.1 傳輸層安全性 395
10.3.2 密碼重置 395
10.3.3 交互類型 395
10.3.4 機器對機器 396
10.3.5 使用瀏覽器的用戶 396
10.3.6 機器對機器(機器代表人) 397
10.4 插曲:下一步計劃 397
10.5 登錄表單 398
10.5.1 提供HTML頁面 398
10.6 登錄 401
10.6.1 HTML表單 401
10.6.2 登錄成功后的重定向 404
10.6.3 處理表單數(shù)據(jù) 405
10.6.4 上下文錯誤 412
10.7 會話 443
10.7.1 基于會話的身份驗證 443
10.7.2 會話存儲 444
10.7.3 選擇會話存儲 444
10.7.4 actix-session 445
10.7.5 管理儀表板 448
10.8 種子用戶 459
10.8.1 數(shù)據(jù)庫遷移 459
10.8.2 密碼重置 460
10.9 重構(gòu) 477
10.9.1 如何實現(xiàn)一個actix-web中間件 478
10.10 總結(jié) 484
第11章 容錯的工作流 486
11.1 重溫POST /admin/newsletters 486
11.2 我們的目標(biāo) 488
11.3 失敗模式 488
11.3.1 無效輸入 488
11.3.2 網(wǎng)絡(luò)I/O 489
11.3.3 應(yīng)用程序崩潰 490
11.3.4 作者的操作 490
11.4 冪等簡介 490
11.4.1 冪等實踐:支付 491
11.4.2 冪等鍵 492
11.4.3 并發(fā)請求 493
11.5 測試需求(第一部分) 493
11.6 實現(xiàn)策略 495
11.6.1 有狀態(tài)的冪等:保存和重放 495
11.6.2 無狀態(tài)的冪等:確定性的鍵生成 495
11.6.3 時間問題有些棘手 495
11.6.4 做出選擇 496
11.7 冪等存儲 496
11.7.1 應(yīng)該使用哪種數(shù)據(jù)庫 496
11.7.2 數(shù)據(jù)庫模式 497
11.8 保存和重放 498
11.8.1 讀取冪等鍵 498
11.8.2 查詢已保存的響應(yīng) 502
11.8.3 保存響應(yīng) 505
11.9 并發(fā)請求 512
11.9.1 測試需求(第二部分) 512
11.9.2 同步 513
11.10 處理錯誤 520
11.10.1 分布式事務(wù) 522
11.10.2 后向恢復(fù) 522
11.10.3 前向恢復(fù) 523
11.10.4 異步處理 523
11.11 后記 539