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