商品详情
书名:聚沙成塔:Go语言构建高性能、分布式爬虫项目
定价:159.0
ISBN:9787121460401
作者:郑建勋
版次:*1版
出版时间:2023-08
内容提要:
本书是颇具创新性的 Go 语言实战指南,巧妙地将理论知识与实践案例串联起来,为读者搭建了一套完整的知识体系和方法论。本书以爬虫项目为基础,全面阐述了 Go 语言在网络服务开发中的*越性能,并深入探讨了如何利用 Go 语言打造高并发的爬虫系统、高性能的分布式系统,以及可扩展的领域驱动的微服务系统。本书有助于 Go 语言*发者根据编码规范,编写出简洁、高效、健壮且易于扩展的代码。同时,本书可以作为高等院校计算机和软件工程等相关专业师生的参考资料。
作者简介:
成都慧眸科技创始人《Go语言底层原理剖析》作者极客时间专栏作家
媒体评论:
1.以爬虫项目贯穿始终,从需求拆解和架构设计开始,带领读者独立完成能够支撑海量爬虫任务的高并发系统、具有故障容错能力的分布式系统、具备可扩展性和领域驱动的微服务系统。2.给出*流团队的编码规范与扫描工具,帮助摆脱过去的思维定势,摆脱疲于应付需求的现状,写出简洁、高效、健壮和可扩展的代码。3.融入底层原理知识,结合实践告诉读者为什么要这样写代码,它背后的机制是怎样的。让读者“知其然,知其所以然”。4.总结出系统的性能分析方法论,并结合实战案例,手把手教读者调试代码,定位线上复杂问题。并有节约了线上千台容器的性能分析实战案例。5.跳出开发单一程序的狭隘视角,为读者系统介绍大型互联网产品的整个生命周期。介绍大规模微服务集群的典型架构,深入探讨微服务协议、架构、治理等问题。
目录:
*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
定价:159.0
ISBN:9787121460401
作者:郑建勋
版次:*1版
出版时间:2023-08
内容提要:
本书是颇具创新性的 Go 语言实战指南,巧妙地将理论知识与实践案例串联起来,为读者搭建了一套完整的知识体系和方法论。本书以爬虫项目为基础,全面阐述了 Go 语言在网络服务开发中的*越性能,并深入探讨了如何利用 Go 语言打造高并发的爬虫系统、高性能的分布式系统,以及可扩展的领域驱动的微服务系统。本书有助于 Go 语言*发者根据编码规范,编写出简洁、高效、健壮且易于扩展的代码。同时,本书可以作为高等院校计算机和软件工程等相关专业师生的参考资料。
作者简介:
成都慧眸科技创始人《Go语言底层原理剖析》作者极客时间专栏作家
媒体评论:
1.以爬虫项目贯穿始终,从需求拆解和架构设计开始,带领读者独立完成能够支撑海量爬虫任务的高并发系统、具有故障容错能力的分布式系统、具备可扩展性和领域驱动的微服务系统。2.给出*流团队的编码规范与扫描工具,帮助摆脱过去的思维定势,摆脱疲于应付需求的现状,写出简洁、高效、健壮和可扩展的代码。3.融入底层原理知识,结合实践告诉读者为什么要这样写代码,它背后的机制是怎样的。让读者“知其然,知其所以然”。4.总结出系统的性能分析方法论,并结合实战案例,手把手教读者调试代码,定位线上复杂问题。并有节约了线上千台容器的性能分析实战案例。5.跳出开发单一程序的狭隘视角,为读者系统介绍大型互联网产品的整个生命周期。介绍大规模微服务集群的典型架构,深入探讨微服务协议、架构、治理等问题。
目录:
*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
- 电子工业出版社有限公司
- 电子工业出版社有限公司有赞官方供货商,为客户提供一流的知识产品及服务。
- 扫描二维码,访问我们的微信店铺