聚沙成塔:Go語言構建高性能、分佈式爬蟲項目

鄭建勛

  • 出版商: 電子工業
  • 出版日期: 2023-08-01
  • 定價: $954
  • 售價: 8.5$811
  • 語言: 簡體中文
  • 頁數: 456
  • ISBN: 7121460408
  • ISBN-13: 9787121460401
  • 相關分類: Web-crawler 網路爬蟲
  • 立即出貨

買這商品的人也買了...

商品描述

本書是頗具創新性的 Go 語言實戰指南,巧妙地將理論知識與實踐案例串聯起來,為讀者搭建了一套完整的知識體系和方法論。本書以爬蟲項目為基礎,全面闡述了 Go 語言在網絡服務開發中的卓越性能,並深入探討瞭如何利用 Go 語言打造高並發的爬蟲系統、高性能的分佈式系統,以及可擴展的領域驅動的微服務系統。本書有助於 Go 語言開發者根據編碼規範,編寫出簡潔、高效、健壯且易於擴展的代碼。同時,本書可以作為高等院校電腦和軟件工程等相關專業師生的參考資料。

目錄大綱

第1篇 項目準備
1 基礎知識:磨刀不誤砍柴工 2
1.1 Go語言的歷史與設計理念 2
1.1.1 Go語言的“祖先” 3
1.1.2 Go的特性 4
1.2 開發環境 5
1.3 基礎語法 6
1.4 語法特性 12
1.5 並發編程 18
1.6 項目組織與依賴管理 20
1.7 工具與庫 22
1.8 總結 27
2 大型項目的開發模式與流程 28
2.1 開發模式 28
2.1.1 瀑布模式 28
2.1.2 敏捷開發 29
2.1.3 其他開發模式 31
2.2 開發流程 31
2.2.1 需求階段 32
2.2.2 設計階段 33
2.2.3 研發實現階段 34
2.2.4 聯調測試階段 38
2.2.5 上線部署階段 38
2.2.6 運維階段 39
2.2.7 運營階段 40
2.3 總結 40
第2篇 項目設計
3 冰川之下:深入Go高並發網絡模型 42
3.1 網絡的基本概念 42
3.1.1 阻塞與非阻塞 42
3.1.2 文件描述符與Socket 43
3.1.3 I/O模型 44
3.2 Go語言網絡模型 46
3.2.1 協程調度 46
3.2.2 同步編程模式 48
3.2.3 非阻塞I/O 48
3.2.4 I/O多路復用 49
3.3 總結 50
4 高性能設計:自頂向下的高性能Go語言程序設計與優化 51
4.1 系統級別 52
4.2 程序設計和組織級別 52
4.3 代碼實施級別 53
4.3.1 合理的代碼 53
4.3.2 刻意的優化 53
4.3.3 冒險的嘗試 54
4.4 操作系統級別 54
4.5 硬件級別 56
4.6 總結 56
5 微服務探索:深度解析架構演進與治理實踐 57
5.1 微服務架構演進 57
5.1.1 單體服務與微服務 57
5.1.2 微服務的優點 61
5.1.3 微服務的缺點 62
5.1.4 微服務的邊界 63
5.1.5 微服務的通信 63
5.1.6 服務發現與負載均衡 65
5.2 微服務治理體系與實踐 66
5.2.1 分佈式日誌與監控 67
5.2.2 分佈式Metric與監控 68
5.2.3 分佈式追蹤 68
5.2.4 微服務測試 69
5.2.5 微服務降級 71
5.2.6 微服務總體架構 71
5.3 總結 72
6 協調之謎:深入剖析分佈式一致性與共識算法 74
6.1 數據一致性 74
6.1.1 誕生背景 74
6.1.2 CAP定理 76
6.1.3 共識算法 77
6.2 分佈式協調服務 77
6.2.1 分佈式鎖 78
6.2.2 配置管理 78
6.2.3 服務發現 78
6.3 無信網絡中的共識問題 79
6.4 共識算法 80
6.4.1 Paxos算法 80
6.4.2 Raft算法 81
6.5 總結 85
7 謀定而動:爬蟲項目分析與設計 86
7.1 網絡爬蟲概述 86
7.1.1 網絡爬蟲合法嗎 86
7.1.2 網絡爬蟲的商業價值 87
7.1.3 網絡爬蟲的流程與技術棧 88
7.1.4 常見的反爬蟲措施 90
7.2 爬蟲項目需求分析與架構設計 91
7.2.1 需求調研與分析 91
7.2.2 功能性模塊的設計 92
7.2.3 非功能性模塊的設計 93
7.2.4 架構設計 94
7.3 總結 96
8 眾人拾柴:高效團隊的Go編碼規範 97
8.1 編碼規範的重要性 97
8.2 Go語言編碼規範 97
8.2.1 整潔一致 98
8.2.2 高效 103
8.2.3 健壯性 104
8.2.4 擴展性 105
8.2.5 工具 106
8.3 總結 106
第3篇 Worker開發
9 從正則表達式到CSS選擇器:4種網頁文本處理手段 108
9.1 項目啟動 108
9.1.1 初始化Git倉庫 108
9.1.2 抓取一個簡單的網頁 109
9.2 標準庫 110
9.3 正則表達式 112
9.4 XPath 115
9.5 CSS選擇器 116
9.6 總結 116
10 網絡爬蟲:HTTP請求的魔幻旅途 117
10.1 最簡單的HTTP服務器與請求 117
10.2 分層網絡模型 118
10.2.1 應用層 119
10.2.2 傳輸層 120
10.2.3 TLS協議 120
10.2.4 網絡層 121
10.2.5 網絡接入層 123
10.3 數據傳輸與路由協議 124
10.4 操作系統處理數據包流程 125
10.5 HTTP協議詳解 127
10.6 HTTP的困境 129
10.7 HTTP標準庫底層原理 129
10.8 總結 133
11 採集引擎:接口抽象與模擬瀏覽器訪問實戰 134
11.1 接口實戰 134
11.2 模擬瀏覽器訪問 135
11.3 遠程訪問瀏覽器 138
11.3.1 瀏覽器驅動協議 138
11.3.2 谷歌開發者工具協議 139
11.4 總結 142
12 面向組合:接口的使用場景與底層原理 143
12.1 Go接口及其優勢 143
12.2 Go接口的設計理念 143
12.3 接口的最佳實踐 144
12.3.1 模塊解耦 144
12.3.2 依賴註入 146
12.4 接口原理 147
12.5 總結 147
13 依賴管理:Go Modules用法與原理 149
13.1 GOPATH 149
13.1.1 什麽是GOPATH 149
13.1.2 GOPATH的落幕與依賴管理的歷史 151
13.2 Go Modules 151
13.2.1 Go Modules概述 151
13.2.2 Go Modules實踐 153
13.2.3 Go Modules最小版本選擇原理 157
13.2.4 驗證最小版本選擇原理 159
13.3 語義版本 161
13.3.1 v2版本 161
13.3.2 偽版本 162
13.4 總結 163
14 優雅離場:Context超時控制與原理 164
14.1 為什麽需要Context 164
14.2 context.Value 166
14.3 Context實踐 169
14.4 Context底層原理 172
14.5 總結 173
15 移花接木:為爬蟲安上代理的翅膀 174
15.1 代理的分類和實現機制 174
15.1.1 正向代理 174
15.1.2 HTTP隧道代理 175
15.1.3 MITM代理 177
15.1.4 透明代理 177
15.1.5 反向代理 178
15.2 如何在實際項目中實現代理 179
15.2.1 如何訪問代理服務器 180
15.2.2 如何選擇代理地址 180
15.3 總結 182
16 日誌處理:日誌規範與最佳實踐 183
16.1 標準庫的log包 183
16.2 Zap 185
16.3 日誌切割 186
16.4 日誌分級 187
16.5 日誌格式規範 187
16.6 構建項目日誌組件 188
16.7 總結 189
17 運籌帷幄:協程的運行機制與並發模型 190
17.1 進程與線程 190
17.2 線程與協程 190
17.2.1 調度方式 191
17.2.2 上下文切換速度 191
17.2.3 調度策略 191
17.2.4 棧的大小 192
17.3 從GM到GMP 192
17.4 協程的數據爭用 193
17.4.1 原子鎖 193
17.4.2 互斥鎖 195
17.4.3 讀寫鎖 195
17.5 Go並發控制庫 196
17.5.1 sync.WaitGroup 196
17.5.2 sync.Once 197
17.5.3 sync.Map 197
17.5.4 sync.Cond 198
17.6 Go並發模式 200
17.6.1 ping-pong模式 201
17.6.2 fan-in模式 202
17.6.3 fan-out模式 203
17.6.4 pipeline模式 205
17.7 總結 208
18 掘地三尺:實戰深度與廣度優先搜索算法 209
18.1 深度優先搜索算法與實戰 209
18.2 廣度優先搜索算法與實戰 211
18.3 用Cookie突破反爬封鎖 214
18.4 總結 215
19 調度引擎:負載均衡與調度器實戰 216
19.1 調度引擎實戰 216
19.2 函數式選項模式 219
19.3 總結 222
20 細節決定成敗:切片與哈希表的陷阱與原理 223
20.1 切片的底層原理 223
20.1.1 切片的截取 224
20.1.2 切片的擴容 225
20.2 哈希表原理 226
20.3 總結 228
21 輔助任務管理:任務優先級、去重與失敗處理 229
21.1 設置爬蟲最大深度 229
21.2 避免請求重復 230
21.3 設置優先隊列 233
21.4 設置隨機User-Agent 234
21.5 進行失敗處理 235
21.6 總結 235
22 規則引擎:自定義爬蟲處理規則 236
22.1 靜態規則引擎 237
22.2 動態規則引擎 240
22.3 總結 245
23 存儲引擎:數據清洗與存儲 246
23.1 爬取結構化數據 246
23.2 數據存儲 250
23.2.1 數據抽象 250
23.2.2 數據底層存儲 251
23.2.3 存儲引擎實現 254
23.3 存儲引擎驗證 256
23.4 總結 258
24 固若金湯:限速器與錯誤處理 259
24.1 限速器 259
24.2 隨機休眠 262
24.3 錯誤處理 263
24.3.1 基本的錯誤處理方式 264
24.3.2 錯誤鏈處理方式 266
24.3.3 減少錯誤處理的實踐 267
24.4 panic 268
24.5 總結 270
25 服務註冊與監聽:Worker節點與etcd交互 271
25.1 GRPC與Protocol Buffers 271
25.2 go-micro與grpc-gateway 273
25.3 註冊中心與etcd 276
25.4 micro中間件 279
25.5 總結 280
第4篇 測試與分析
26 未雨綢繆:通過靜態掃描與動態掃描保證代碼質量 282
26.1 靜態掃描 282
26.2 動態掃描 284
26.3 配置文件 285
26.4 Makefile 287
26.5 總結 288
27 測試的藝術:從單元測試到集成測試 289
27.1 單元測試 289
27.1.1 表格驅動測試 291
27.1.2 子測試 293
27.1.3 依賴註入 296
27.1.4 猴子補丁 298
27.2 壓力測試 299
27.3 基準測試 299
27.4 代碼覆蓋率測試 300
27.4.1 cover的基本用法 301
27.4.2 測試環境下的代碼覆蓋率 302
27.4.3 cover工具的工作原理 302
27.5 模糊測試 303
27.6 集成測試 306
27.7 總結 307
28 調試程序:從日誌打印到Delve調試器 308
28.1 常見的調試方法和技術 308
28.2 Delve的內部架構 309
28.3 Delve實戰 309
28.4 使用Goland+Delve進行本地調試 316
28.5 使用Goland+Delve進行遠程調試 317
28.6 總結 318
29 性能分析利器:深入pprof與trace工具 319
29.1 pprof及其使用方法 319
29.1.1 pprof堆內存分析 321
29.1.2 pprof協程棧分析 325
29.1.3 pprof CPU占用分析 326
29.2 trace及其使用方法 327
29.3 總結 330
30 綜合案例:節約千台容器的線上性能分析實戰 331
30.1 程序問題描述與排查過程 331
30.2 進一步分析與修復問題 336
30.3 總結 338
第5篇 分佈式Master開發
31 他山之石:etcd架構 340
31.1 etcd全局架構與原理 340
31.2 etcd架構的優點 342
31.3 總結 344
32 搭建Master框架與命令行程序 345
32.1 Cobra實現命令行工具 345
32.1.1 Cobra示例代碼 345
32.1.2 Worker子命令 348
32.1.3 Master子命令 349
32.1.4 Version子命令 349
32.2 flags控製程序行為 350
32.3 總結 351
33 Master高可用:借助etcd實現服務選主 352
33.1 etcd選主API 352
33.2 實現Master選主與故障容錯 353
33.3 etcd選主原理 357
33.4 總結 359
34 Master任務調度:服務發現與資源管理 360
34.1 Master服務發現 360
34.1.1 深入go-micro registry接口 361
34.1.2 維護Worker節點信息 363
34.2 Master資源管理 365
34.3 驗證Master資源分配結果 367
34.4 總結 367
35 故障容錯:在Worker崩潰時重新調度 368
35.1 Master資源調度的時機 368
35.1.1 Master成為Leader時的資源調度 368
35.1.2 Worker節點發生變化時的資源更新 369
35.2 負載均衡的資源分配算法 370
35.3 Master資源處理API實戰 372
35.4 總結 374
36 完善核心能力:Master請求轉發與Worker資源管理 375
36.1 將Master請求轉發到Leader 375
36.2 資源保護 377
36.3 Worker單機模式 378
36.4 Worker集群模式 379
36.4.1 資源加載 379
36.4.2 資源監聽 380
36.4.3 資源刪除 381
36.5 總結 383
37 服務治理:限流、熔斷器、認證與鑒權 384
37.1 限流 384
37.1.1 固定窗口算法 384
37.1.2 滑動日誌算法 385
37.1.3 滑動窗口算法 385
37.1.4 漏桶算法 385
37.1.5 用go-micro實現限流 385
37.2 熔斷器 386
37.3 認證與鑒權 388
37.4 總結 390
第6篇 部署運維
38 不可阻擋的容器化:Docker核心技術與原理 392
38.1 不可阻擋的容器化 392
38.2 Docker架構 393
38.3 Docker鏡像 394
38.4 多階段構建鏡像 396
38.5 Docker網絡原理 396
38.6 使用GitHub Actions自動化Docker工作流程 399
38.7 總結 400
39 多容器部署:利用Docker Compose快速搭建本地爬蟲環境 401
39.1 什麽是Docker Compose 401
39.2 Compose的安裝 401
39.3 Compose配置文件的編寫 402
39.4 Compose生命周期管理 404
39.5 總結 405
40 容器海洋中的舵手:Kubernetes工作機制 406
40.1 什麽是Kubernetes 406
40.2 Kubernetes網絡原理 408
40.3 總結 409
41 容器化實戰:搭建K8s爬蟲集群 410
41.1 安裝Kubernetes集群 410
41.2 安裝K3d 411
41.3 部署Worker Deployment 412
41.4 部署Worker Service 415
41.5 部署Master Deployment 416
41.6 部署Master Service 417
41.7 創建Ingress 417
41.8 創建ConfigMap 419
41.9 總結 420
第7篇 意猶未盡
42 回頭看:如何更好地組織代碼 422
42.1 按照功能劃分組織代碼 422
42.2 按照單體劃分組織代碼 423
42.3 按照層級劃分組織代碼 424
42.4 按照領域驅動設計組織代碼 425
42.4.1 六邊形架構 425
42.4.2 領域與子域 427
42.4.3 限界上下文 427
42.4.4 實體 428
42.4.5 值對象 429
42.4.6 聚合 429
42.4.7 服務 430
42.4.8 倉儲 431
42.4.9 服務串聯業務邏輯 432
42.5 總結 435