登入帳戶  | 訂單查詢  | 購物車/收銀台( 0 ) | 在線留言板  | 付款方式  | 運費計算  | 聯絡我們  | 幫助中心 |  加入書簽
會員登入 新用戶登記
HOME新書上架暢銷書架好書推介特價區會員書架精選月讀2023年度TOP分類瀏覽雜誌 臺灣用戶
品種:超過100萬種各類書籍/音像和精品,正品正價,放心網購,悭钱省心 服務:香港台灣澳門海外 送貨:速遞郵局服務站

新書上架簡體書 繁體書
暢銷書架簡體書 繁體書
好書推介簡體書 繁體書

四月出版:大陸書 台灣書
三月出版:大陸書 台灣書
二月出版:大陸書 台灣書
一月出版:大陸書 台灣書
12月出版:大陸書 台灣書
11月出版:大陸書 台灣書
十月出版:大陸書 台灣書
九月出版:大陸書 台灣書
八月出版:大陸書 台灣書
七月出版:大陸書 台灣書
六月出版:大陸書 台灣書
五月出版:大陸書 台灣書
四月出版:大陸書 台灣書
三月出版:大陸書 台灣書
二月出版:大陸書 台灣書

『簡體書』聚沙成塔:Go语言构建高性能、分布式爬虫项目

書城自編碼: 3902978
分類:簡體書→大陸圖書→計算機/網絡计算机理论
作者: 郑建勋
國際書號(ISBN): 9787121460401
出版社: 电子工业出版社
出版日期: 2023-08-01

頁數/字數: /
書度/開本: 16开 釘裝: 平装

售價:HK$ 192.4

我要買

 

** 我創建的書架 **
未登入.


新書推薦:
为你沦陷
《 为你沦陷 》

售價:HK$ 56.2
校园欺凌
《 校园欺凌 》

售價:HK$ 59.8
培训需求分析与年度计划制订——基于组织战略,做”对的”培训!
《 培训需求分析与年度计划制订——基于组织战略,做”对的”培训! 》

售價:HK$ 82.8
这就是心理咨询:全球心理咨询师都在用的45项技术(第3版)
《 这就是心理咨询:全球心理咨询师都在用的45项技术(第3版) 》

售價:HK$ 153.6
正说清朝十二帝(修订珍藏版)
《 正说清朝十二帝(修订珍藏版) 》

售價:HK$ 105.6
黑海史:从历史涟漪到时代巨浪
《 黑海史:从历史涟漪到时代巨浪 》

售價:HK$ 115.2
楼边人似玉
《 楼边人似玉 》

售價:HK$ 56.2
我,毕加索
《 我,毕加索 》

售價:HK$ 60.0

 

編輯推薦:
高效的编码规范与研发工具
深入 Go 语法背后的底层机制
高性能与可扩展的程序设计方法
复杂线上案例的全方位分析
大规模分布式系统的架构之道
內容簡介:
本书是颇具创新性的 Go 语言实战指南,巧妙地将理论知识与实践案例串联起来,为读者搭建了一套完整的知识体系和方法论。本书以爬虫项目为基础,全面阐述了 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
內容試閱
或许你并未察觉,身边的奇迹往往由简单的元素组成。金字塔和狮身人面像由沙石堆砌而成,作为生物体遗传密码的DNA,也不过是由几种基础的核苷酸组合而成的。当图灵在1936年提出图灵机的概念时,谁又能够想到,仅仅让机器遵循一些简单的规则就足以构建出今天丰富多彩的数字世界。
同样地,今天软件工程中许多令人眼花缭乱的框架与概念,都不过是基础元素的整合。但是简单元素的灵活组合,逐渐带来了让人无法轻易掌控的复杂度。在实践中,我发现很多开发者有下面的困惑。
疲于应付需求,程序缺乏设计,代码不规范,最终导致程序越来越难以扩展和维护。不懂语法背后的运行机制,不知道如何掌握Go底层原理,无法解决包括性能在内的复杂系统问题。不能跳出开发视角,从顶层思考整个系统的技术选型与架构设计。困在自己的“一亩三分地”里,没有大规模云原生、分布式系统和微服务集群的实战经验。
本书正是尝试对一个大规模的后端系统进行拆解,用Go语言构建出可扩展、高并发、分布式、微服务的爬虫项目,从0到1为你呈现这个大型积木的设计和建造过程。你收获的将不只是开箱即用的爬虫框架,构建复杂项目的顶级技艺和进阶路线,更有关于如何学习的深刻洞见。
拨云见雾,走出进阶焦虑
没有人能一看到谜题就瞬间想出答案,摆脱思维定势、找到正确的进阶路线是每个求知者都会遇到的挑战。
回顾我的职业生涯,也遇到过许多困扰,几度面临焦虑,体验过一次次知识的升华。所以我想在开始正式学习之前,可以先交流一下经验,或许会有事半功倍的效果。我的职业生涯大体上可以分为四个阶段。
第一阶段:照猫画虎。
初入职场的时候,我会为独立完成一个小项目感到兴奋。那时候我能够实现基本的功能,喜欢研究Go语言的技巧,但不求甚解。后来,我逐渐意识到只琢磨一门语言的语法和技巧对成长的贡献较小。在实践中我仍然难以解释程序表现出的奇怪现象,难以解决困难的问题,也很难独当一面,这使我陷入迷茫。
第二阶段:深入原理。
于是,我转而系统学习知识背后的底层原理,其中就包括Go语言语法背后的底层原理,从基本类型的结构到Go运行时和Go编译时原理。我阅读了大量与Go语言相关的书籍、文章和源码。

对Go语言的深入理解帮助我看到了Go语言程序的“毛细血管”,我开始能够排查、定位、解决程序中遇到的复杂问题。更重要的是,凭借对Go语言设计理念的了解,我能够更顺畅地设计开发出高性能、可扩展的程序了。
第三阶段:总揽全局。
如果说前两个阶段还只是我困在单一程序中的自娱自乐,那么设计复杂系统的实战经验让我有幸站在更高的位置驾驭大规模系统。
这一时期,我开始跳出开发单一程序的狭隘视角,站在巨人的肩膀上,借助业内的一些知名开源组件完成复杂系统的架构设计。技术选型涉及对不同组件之间的优劣判断,而前一个阶段的积累让我能够比较容易触达这些知名开源技术的原理,从而看出不同组件之间微妙的差异,让优秀的组件为我所用。
这个阶段,我在一家人工智能公司的中台部门工作。我们的系统需要应对海量的数据,也需要面临分布式系统具有的固有挑战:扩展性、一致性与可用性。对这些复杂问题的体系化思考和丰富的实战经验让我拥有了驾驭复杂分布式系统的能力。
第四阶段:赋能业务。
如果说前三个阶段还只是不食人间烟火似的技术修炼,那么真正让我将技术转化为生产力的是技术与业务的深度融合。
这一时期,我在一家大型互联网公司的中台部门工作,需要对接全公司所有的产品线。一开始我常常疲于应付需求,需要面对难以扩展的代码,保证系统的极高稳定性。这让我不得不进一步思考复杂业务需求之下的技术解决之道。也正因如此,我在微服务治理和稳定性建设方面积累了丰富的经验。
回顾我的职业生涯,每次进阶都离不开前一个阶段的铺垫、有意识的自我突破,也离不开理论与实践的相辅相成。在本书中,我希望从最简单的问题入手,层层深入、理论结合实践,带你一起实现一个具备扩展性、高并发、分布式、微服务的复杂系统。
我也给你绘制了一张本书的思维导图,方便你根据自己的实际情况按图索骥,欢迎你在配套资源中下载查看。我会用一种创造性的方式把知识点串联起来,形成Go语言和系统设计的完整知识体系与方法论。本书主要有以下几个特点。
特色一:在“玩”中学,以爬虫为基座
爬虫涵盖的知识点非常广泛,例如网页前端、数据解析、数据存储、可视化分析,等等。另外,爬虫对高并发的网络处理有极高的要求,而Go语言在开发网络服务方面正好有天然的优势。
此外,爬虫具有很高的商业价值,互联网就像一座免费的数字金矿,借助爬虫可以创造种类繁多的商业模式。依靠一些创意和想象力,爬虫甚至能够成为一家百亿市值公司的核心引擎。
当然,针对学习,爬虫还有一个重要的特点,那就是它生动有趣。比起一些传统的电商学习项目,爬虫项目更具有趣味性,你可以收集、过滤、组合并提炼互联网中任何你感兴趣的信息。
所以,本书以爬虫项目贯穿始终,从需求拆解和架构设计开始,帮助你独立完成能够支撑海量爬虫任务的高并发系统、具有故障容错能力的分布式系统、具备可扩展性和领域驱动的微服务系统。在这个过程中,你会将学到的知识融会贯通。
特色二:谋定而后动,写出“好”代码
本书不只讲解如何写代码,还教你如何写出好代码。因此,我在书中不仅会给出一流团队的编码规范与扫描工具,还会讲解Go语言中的设计哲学。例如,Go中为什么没有继承?如何用面向组合的设计理念使代码具备扩展性?其他系统的设计对我们的系统有哪些启发?Linux的 VFS 层与Go接口的设计有什么异曲同工之处?只有遵循Go语言的编码规范与设计哲学,才能让我们摆脱思维定势,摆脱疲于应付需求的现状,写出简捷、高效、健壮和可扩展的代码。
特色三:“深”入原理,理论结合实践
要系统掌握Go语言,可不是单纯的语法堆砌这么简单。了解语法背后的故事,才能够让我们“知其然,亦知其所以然”。我将在本书的项目开发中融入底层原理知识,通过理论结合实践的方式告诉你为什么代码要这样写,它背后的机制是怎样的。
举个例子,在Go语言中,一行简单的代码就能实现HTTP请求,但我会从TCP/IP网络模型讲起,带着你看一看一个网络包是如何层层封装、路由流转的,又是如何被硬件接收、被操作系统处理的。
更进一步地,我还会讲解Go语言为什么天然适合开发网络服务,为什么它借助“I/O多路复用 非阻塞I/O 协程调度 同步编程”的模式,能够简单高效地处理高并发网络服务。
特色四:硬核实战,“调”试复杂问题
代码是调试出来的,我会在本书中为你总结系统的性能分析方法论,并给出丰富的实战案例,“手把手”教你调试代码,定位线上复杂问题。
特色五:不畏浮云遮望眼,掌“控”更大规模系统
此外,我还会跳出开发单一程序的狭隘视角,为你系统介绍大型互联网产品的整个生命周期。同时,我还会为你介绍大规模微服务集群的典型架构,深入探讨微服务协议、架构、治理等问题。最后,我们还将看到在更大规模数据量、更复杂的业务和更多的服务时下面临的固有挑战,并深入浅出地讲解分布式系统在可用性与一致性之间的权衡。
当我们掌握了构建复杂系统的一整套方法论,就不会拘泥于特定的系统与细节了。当我们有能力掌控全局、创造真正的价值时,又怎会困在“内卷”的恶性循环中患得患失呢?

本书附带一个配套的爬虫项目,它可以帮助你更好地理解和实践书中的内容。
本书在各个章节使用了特定的标签,如“vx.x.x”,这些标签对应项目的不同阶段。要查看特定阶段的代码,你可以在GitHub项目页单击“Tags”选项,然后选择对应的标签。
对于熟悉命令行的读者,你可以先克隆这个项目(通过git clone [URL]命令,其中[URL]是项目的链接),然后使用git checkout [tagname]命令在本地查看和使用对应标签的代码。

 

 

書城介紹  | 合作申請 | 索要書目  | 新手入門 | 聯絡方式  | 幫助中心 | 找書說明  | 送貨方式 | 付款方式 香港用户  | 台灣用户 | 大陸用户 | 海外用户
megBook.com.hk
Copyright © 2013 - 2024 (香港)大書城有限公司  All Rights Reserved.