预购商品
书目分类
特别推荐
本書是頗具創新性的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
鄭建勳 成都慧眸科技創始人 《Go語言底層原理剖析》作者 極客時間專欄作家
客服公告
热门活动
订阅电子报