描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787111716341
(1)作者背景资深:作者是腾讯云技术专家,有超过7年的大型Go项目开发经验。
(2)内容得到验证:初稿源于极客时间专栏,超过25000人付费学习并好评,内容全面升级和补充。
(3)大厂经验总结:手把手教你互联网大厂Go项目开发经验和方法。
(4)内容抽丝剥茧:抽丝剥茧讲解Go项目开发全流程和涉及知识点,涵盖项目的设计、管理、开发、测试、部署全部环节。
(5)蕞佳实践设计:书中涉及大部分Go知识点,知识点都朝着蕞佳实践方向是设计,遵循Go 设计模式、Go 开发规范、Go 蕞佳实践、Go简洁架构,使用业界采纳度蕞高的Go包。
(6)提供项目源码:一个案例贯穿全书,提供可部署、可运行案例源码,可二次开发,可在生产中复用。
(7)知名专家推荐:极客邦科技创始人、腾讯云云原生产品总经理等专家联袂推荐。
这是一本手把手教读者如何零基础快速掌握企业级Go项目全流程开发的实战性著作。
内容初稿源于极客时间上的专栏(有超过25000人付费学习),图书内容在专栏的基础上做了全面的更新和大量的补充。
作者是腾讯云的技术专家,有多年的企业级Go项目开发经验。全书围绕一个可部署、可运行的企业级Go应用(附源码,可二次开发)展开,覆盖项目全生命周期的所有环节,不仅将每个环节涉及的原理、步骤讲解得非常详细,而且把项目涉及的Go语言知识点全部娓娓道来。每个知识点都朝着*佳实践方向去设计,采用了业界共识程度*高的Go包、Go设计模式、Go开发规范、Go简洁架构等,不仅能让读者事半功倍地掌握企业级Go项目的开发方法,而且能学到一线大厂的实践经验。
本书内容翔实,篇幅较大,一共31章,分为六个部分:第一部分是项目开始前的准备工作,包括贯穿全书的实战项目IAM的介绍与部署,以及Go开发环境的搭建;第二至六部分详细讲解了项目的设计、管理、开发、测试、部署等。包含了规范设计、文档编写、开发流程管理、功能设计与实现、项目测试、性能优化、高可用、高安全、水平扩展等方方面面。旨在帮助读者彻底学会如何构建企业级 Go 项目,并解决 Go 项目开发所面临的各类问题。
第一部分 项目准备
第1章 Go开发环境准备2
1.1 机器选择2
1.1.1 开发机选择3
1.1.2 办公机选择3
1.2 Windows终端模拟器安装和配置3
1.3 Linux服务器申请和配置4
1.3.1 Linux服务器申请4
1.3.2 登录Linux服务器5
1.3.3 Linux服务器配置6
1.3.4 依赖安装和配置8
1.4 Go编译环境安装和配置9
1.4.1 Go编译工具安装和配置10
1.4.2 Protobuf编译环境安装11
1.5 Go IDE安装和配置12
1.6 本章总结14
第2章 快速部署IAM系统15
2.1 为什么选择IAM系统作为实战项目15
2.2 IAM系统概述16
2.2.1 IAM资源授权流程16
2.2.2 IAM系统架构介绍17
2.2.3 通过使用流程理解架构18
2.3 下载IAM项目代码20
2.4 安装和配置数据库21
2.4.1 配置scripts/install/environment.sh21
2.4.2 安装和配置MariaDB21
2.4.3 安装和配置Redis22
2.4.4 安装和配置MongoDB22
2.5 安装和配置IAM系统24
2.5.1 准备工作25
2.5.2 安装和配置iam-apiserver28
2.5.3 安装iamctl32
2.5.4 安装和配置iam-authz-server34
2.5.5 安装和配置iam-pump36
2.5.6 安装和配置 iam-watcher38
2.5.7 安装 man 文件39
2.5.8 测试IAM系统是否安装成功40
2.6 彩蛋:一键安装40
2.7 本章总结41
第二部分 项目设计
第3章 规范设计44
3.1 有哪些地方需要制定规范44
3.2 开源规范45
3.2.1 开源协议概述45
3.2.2 开源协议选择46
3.2.3 开源规范有什么47
3.2.4 开源规范详细内容47
3.2.5 运营开源项目48
3.3 文档规范49
3.3.1 README 文档规范49
3.3.2 项目文档规范50
3.3.3 API文档规范51
3.4 Commit Message规范53
3.4.1 Commit Message规范有哪些53
3.4.2 与Commit Message相关的3个
重要内容59
3.4.3 Commit Message规范自动化66
3.5 版本规范67
3.5.1 什么是语义化版本规范67
3.5.2 语义化版本规范示例69
3.5.3 如何确定版本号69
3.6 本章总结69
第4章 目录结构设计71
4.1 如何规范目录71
4.2 平铺式目录结构72
4.3 结构化目录结构73
4.3.1 Go应用:主要存放前后端代码75
4.3.2 Go应用:主要存放测试相关的
文件和代码78
4.3.3 Go应用:存放与应用部署相关
的文件78
4.3.4 项目管理:存放管理Go项目的
各类文件79
4.3.5 文档:主要存放项目的各类文档80
4.3.6 不建议的目录82
4.4 一些建议82
4.5 本章总结83
第5章 工作流设计84
5.1 集中式工作流84
5.2 功能分支工作流85
5.3 Git Flow工作流88
5.3.1 Git Flow的5种分支88
5.3.2 Git Flow开发流程88
5.4 Forking工作流91
5.5 本章总结93
第6章 研发流程设计95
6.1 如何设计Go项目的研发流程95
6.2 在设计研发流程时,需要关注
哪些点96
6.3 业界相对标准的研发流程96
6.3.1 需求阶段96
6.3.2 设计阶段98
6.3.3 开发阶段98
6.3.4 测试阶段100
6.3.5 发布阶段100
6.3.6 运营阶段102
6.4 角色与分工102
6.5 如何管理应用的生命周期104
6.6 应用生命周期管理技术有哪些104
6.7 研发模式105
6.8 CI/CD:自动化构建和部署应用106
6.8.1 持续集成107
6.8.2 持续交付107
6.8.3 持续部署107
6.9 DevOps:研发运维一体化108
6.9.1 AIOps:智能运维108
6.9.2 ChatOps:聊着天就把事情
给办了109
6.9.3 GitOps:一种实现云原生的
持续交付模型109
6.9.4 NoOps:无运维110
6.10 如何选择合适的应用生命周期
管理技术111
6.11 本章总结111
第7章 如何写出优雅的Go项目112
7.1 优雅Go项目实现思路112
7.2 编写高质量的Go应用113
7.2.1 代码结构114
7.2.2 代码规范115
7.2.3 代码质量116
7.2.4 编程哲学119
7.2.5 软件设计方法124
7.3 高效管理项目125
7.3.1 高效的开发流程125
7.3.2 使用Makefile管理项目126
7.3.3 自动生成代码126
7.3.4 善于借助工具127
7.3.5 对接CI/CD127
7.4 编写高质量的项目文档128
7.5 本章总结128
第8章 Go语言设计模式?130
8.1 创建型模式131
8.1.1 单例模式131
8.1.2 工厂模式133
8.2 行为型模式136
8.2.1 策略模式136
8.2.2 模板模式138
8.3 结构型模式139
8.3.1 代理模式139
8.3.2 选项模式140
8.4 本章总结144
第三部分 项目管理
第9章 如何编写Makefile148
9.1 规划Makefile要实现的功能149
9.2 设计合理的Makefile结构151
9.3 掌握Makefile编写技巧153
9.3.1 善用通配符和自动变量153
9.3.2 善用函数153
9.3.3 依赖需要用到的工具154
9.3.4 把常用功能放在/Makefile中,
不常用的放在分类Makefile中154
9.3.5 编写可扩展的Makefile155
9.3.6 将所有输出存放在一个目录下,
方便清理和查找156
9.3.7 使用带层级的命名方式156
9.3.8 做好目标拆分157
9.3.9 设置OPTIONS157
9.3.10 定义环境变量158
9.3.11 自己调用自己159
9.4 本章总结159
第10章 IAM项目研发流程实战160
10.1 开发阶段160
10.1.1 代码开发160
10.1.2 代码提交165
10.2 测试阶段167
10.3 IAM项目的Makefile项目管理
技巧168
10.3.1 Makefile help命令自动解析169
10.3.2 在options中指定变量值169
10.3.3 自动生成CHANGELOG169
10.3.4 自动生成版本号169
10.3.5 保持行为一致170
10.4 本章总结171
第11章 静态代码检查172
11.1 为什么选择golangci-lint做静态
代码检查172
11.2 golangci-lint命令173
11.3 golangci-lint配置175
11.4 如何使用golangci-lint进行静态
代码检查178
11.5 golangci-lint使用技巧180
11.6 本章总结182
第12章 生成Swagger API文档183
12.1 Swagger介绍183
12.2 Swagger和OpenAPI的区别184
12.3 用go-swagger来生成Swagger API
文档184
12.3.1 安装swagger工具185
12.3.2 swagger命令行工具介绍185
12.4 如何使用swagger命令生成
Swagger文档186
12.4.1 解析注释生成Swagger文档186
12.4.2 go-swagger其他常用功能介绍192
12.5 IAM Swagger文档194
12.6 本章总结195
第四部分 项目开发
第13章 错误处理198
13.1 错误码设计198
13.1.1 期望错误码实现的功能199
13.1.2 常见的错误码实现方式199
13.1.3 错误码设计建议201
13.1.4 业务Code码设计201
13.1.5 如何设置HTTP状态码202
13.2 IAM项目错误码设计规范203
13.2.1 错误码设计规范203
13.2.2 错误信息规范说明204
13.2.3 IAM API返回值说明204
13.3 错误包204
13.3.1 错误包需要具有哪些功能204
13.3.2 错误包的实现208
13.3.3 如何记录错误212
13.4 一个错误码的具体实现215
13.5 错误码实际使用示例218
13.6 本章总结219
第14章 日志处理220
14.1 如何设计日志包220
14.1.1 基础功能220
14.1.2 高级功能222
14.1.3 可选功能224
14.1.4 设计时需要关注的点226
14.2 如何记录日志226
14.2.1 在何处打印日志227
14.2.2 在哪个日志级别打印日志228
14.2.3 如何记录日志内容229
14.2.4 记录日志的佳实践总结230
14.3 拓展内容:分布式日志解决方案
(EFK/ELK)230
14.4 有哪些优秀的开源日志包231
14.4.1 标准库log包232
14.4.2 glog232
14.4.3 logrus232
14.4.4 zap233
14.4.5 开源日志包选择233
14.5 从零开始编写一个日志包234
14.5.1 定义日志级别和日志选项234
14.5.2 创建Logger及各级别日志
打印方法236
14.5.3 将日志记录到支持的输出中237
14.5.4 自定义日志输出格式239
14.5.5 测试日志包239
14.6 IAM项目日志包设计实战240
14.7 本章总结244
第15章 GORM ORM应用245
15.1 GORM基础知识245
15.2 通过示例学习GORM246
15.2.1 自动迁移表结构248
15.2.2 插入表记录248
15.2.3 获取符合条件的记录248
15.2.4 更新表记录248
15.2.5 删除表记录249
15.2.6 获取表记录列表249
15.3 GORM常用操作讲解249
15.3.1 模型定义250
15.3.2 连接数据库251
15.3.3 创建记录251
15.3.4 删除记录252
15.3.5 更新记录253
15.3.6 查询数据253
15.3.7 高级查询254
15.3.8 原生SQL255
15.3.9 GORM钩子255
15.4 iam-apiserver中的CURD操作256
15.5 本章总结260
第16章 Web服务功能实现261
16.1 Web服务的核心功能261
16.1.1 基础功能262
16.1.2 高级功能262
16.2 Web框架为什么选择Gin263
16.3 Gin是如何支持Web服务的基础
功能的264
16.3.1 HTTP/HTTPS支持268
16.3.2 JSON数据格式支持269
16.3.3 路由匹配270
16.3.4 路由分组270
16.3.5 一进程多服务271
16.3.6 参数解析、参数校验、逻辑
处理、返回结果272
16.4 Gin是如何支持Web服务的高级
功能的274
16.4.1 中间件274
16.4.2 认证、RequestID、跨域277
16.4.3 优雅关停277
16.5 本章总结279
第17章 IAM应用构建280
17.1 如何构建应用框架280
17.2 应用构建三剑客281
17.2.1 命令行参数解析工具:Pflag281
17.2.2 配置解析神器:Viper285
17.2.3 现代化的命令行框架:Cobra291
17.3 构建应用的基础:应用的三大
基本功能297
17.4 iam-apiserver是如何构建应用
框架的298
17.5 App包的设计和实现300
17.5.1 构建应用301
17.5.2 命令行程序构建301
17.5.3 命令行参数解析302
17.5.4 配置文件解析305
17.6 IAM应用构建的优秀特性306
17.7 构建应用的注意事项307
17.8 本章总结307
第18章 IAM认证功能实现309
18.1 认证与授权的区别309
18.2 4种基本的认证方式310
18.2.1 基础认证310
18.2.2 摘要认证311
18.2.3 开放授权认证312
18.2.4 令牌认证314
18.3 基于JWT的Token认证机制实现314
18.3.1 JWT简介314
18.3.2 JWT认证流程315
18.3.3 JWT格式315
18.4 如何设计IAM项目的认证功能318
18.5 IAM项目是如何实现Basic
认证的320
18.6 IAM项目是如何实现Bearer
认证的326
18.6.1 iam-authz-server Bearer认证
“云”是大势所趋,而Go是云时代的语言
最近几年,我发现腾讯很多团队都开始将Go语言作为开发语言,并且在2022年,Go首次超越C 成为腾讯最热门语言。其实,不只腾讯,像阿里、华为和百度这类国内一线大厂也都在积极使用Go。甚至,不少团队的所有项目都是用Go构建的。随之而来的是,各公司对Go开发工程师的需求越来越旺盛。那么,Go为什么会变得这么火热呢?我认为,原因主要体现在两个方面。
一方面,Go是一门非常优秀的语言,它具有很多核心优势,例如:语言简单,从语言层面支持并发编程,可跨平台编译,自带垃圾回收机制,等等。这也是这些团队选择Go的最根本原因。
另一方面,Go是云时代的语言。为什么这么说呢?下面,我来详细说明。
随着云计算平台的逐渐成熟,应用上云已经成为一个不可逆转的趋势,很多公司都选择将基础架构、业务架构云化,例如阿里、腾讯都在将公司内部业务全面云化。可以说,全面云化已经是公司层面的核心KPI,我们甚至可以认为以后所有的技术都会围绕着云来构建。
云目前是朝着云原生架构的方向演进,而云原生架构中具有统治力(影响力)的项目绝大部分又是用Go构建的。我们从下面这幅云原生技术栈语言组成图中可以看到,有63%的云原生项目都是基于Go语言构建的。
完整的云原生技术栈可参考云原生技术图谱,因此,实现基础架构、业务架构云化,离不开对这些云原生开源项目的学习、改造。而一个团队为了节省成本,技术栈最好是统一的。既然一定要会Go语言,而且它这么优秀,那最好的方式就是将整个团队的技术栈都基于Go语言构建,这也是Go之所以重要的另一个原因。
至于未来云的演进方向,我认为仍然会基于云原生架构来演进。所以,即使在未来,Go的地位仍然举足轻重,学习Go势在必行。
但很多开发者在用Go语言进行项目开发时会面临一系列问题。
学习Go项目开发面临的问题
我辅导过不少刚接触Go语言的开发者,他们为了学习Go项目开发,会上网搜很多与Go相关的技术文章,也花了很多时间去学习。但是,我在代码审核时发现他们写的代码存在很多问题。
比如,有个开发者写的代码依赖数据库连接,不编写单元测试。细问之后,我发现他参考的文章没有提示通过接口将数据库层与业务层解耦。
再比如,一些开发者开发的项目很难维护,在项目中出现了大量的Go包,如common、util、const。只看包名,我完全不知道包所实现的功能是什么,询问之后才发现开发者是参考了一个带有dao、model目录的Java项目。
这些问题其实只是冰山一角。总的来说,我们在学习Go项目开发时会面临以下4类问题。
知识盲区:Go项目开发会涉及很多知识点,但是自己对这些知识点却一无所知;想要学习,却发现网上很多文章结构混乱、讲解不透彻,想要搜索、找出优秀的文章,要花费很多时间,劳神劳力。
学不到最佳实践,能力提升有限:网上有很多文章介绍Go项目的构建方法,但大部分文章介绍的方法并不是最佳实践,学完之后不能在能力和认知上带来有效提升,还需要自己花时间整理,事倍功半。
不知道如何完整地开发一个Go项目:学了很多Go开发相关的知识点、构建方法,但都不成体系,既不全面也不深入。学完后,自己并不能把它们有机地结合成一个Go项目开发体系,真正实践时还是一团乱,效率也很低。
缺乏一线项目练手,很难检验学习成果:为了避免闭门造车,我们肯定想学习一线大厂的大型项目构建和开发经验,在学习过程中逐步检验自己的学习成果,但自己平时很难接触到这样的项目,没有这样的学习途径。
为了解决这些问题,我写了这本书,希望可以帮助读者成为一名优秀的Go开发者,并在职场中建立自己的核心竞争力。
本书是如何设计的
针对上述问题,本书会围绕一个可部署、可运行的企业应用源码案例,详细讲解实际开发过程中涉及的知识点和技能点,帮助读者学会构建企业级Go项目,并解决Go项目开发所面临的各类问题。通过阅读本书,你会有以下收获。
一方面,你能够俯瞰整个Go企业应用的开发流程,不仅能知道一个优秀的企业应用涉及的技能点和开发工作,还能知道如何高效地完成每个阶段的开发工作。
另一方面,你能够深入每个技能点,掌握它们的具体构建方法、业界的最佳实践和一线开发经验。
除了介绍基础的项目开发知识和宝贵的项目开发经验之外,本书最终会交付一套优秀、可运行的企业应用代码。这套代码能够适用于绝大多数的企业应用开发场景,让你可以基于它进行二次开发,快速构建自己的企业应用。
为了从整体上分析技能点,我按照开发顺序把Go项目开发中的绝大部分技能点总结在这张技术鸟瞰图中。
除此之外,针对本书中的每个技能点,我都会尽可能朝着最佳实践的方向去设计。例如,书中使用的是业界采纳度最高的Go包,设计时尽可能遵循了Go设计模式、Go开发规范、Go最佳实践、Go简洁架构等优秀的编程方法。同时,我也会尽量把自己做一线Go项目开发的经验融合到讲解的过
Go是一门优秀的后端编程语言,学好Go,可以极大地提高开发人员在职场的竞争力。学习Go的最好方法是编码实战,孔令飞是我们极客时间 App 的专栏作者,很受用户欢迎,他的这本书通过一个既有广度又有深度的实战项目,介绍了开发一个企业级Go项目的完整流程,非常值得阅读。
——霍太稳 极客邦科技创始人兼CEO
云原生中绝大部分技术栈和开源项目都是用Go构建的,要享受云原生带来的红利,就需要学习Go。学习Go有很多难点和痛点:学完基础语法后,仍然不知道如何开发企业级项目;在使用Go开发项目时,不知道需要实现哪些功能以及如何科学地构建它们;缺乏一线企业的优秀项目来提升自己的Go开发能力,等等。这本书源自一线企业明星项目的研发经验,向读者全方位地介绍了如何开发一个优秀的企业级项目,可以帮助读者掌握Go项目开发的绝大部分技能点,以及最佳的项目实践方式。
——邹辉 腾讯云原生产品中心总经理
令飞老师是Go语言开发领域的佼佼者,他对待工作极度认真,在其他方面也是如此。感谢他利用业余时间梳理并分享企业级Go项目的开发和运维经验。本书由浅入深地介绍了Go语言的一切,可以带你快速入门并成为大型项目的开发专家。无论你是尚未接触过Go语言的初学者,还是有一些Go语言基础的从业者,本书都能让你全方面提升,就像我一样。
——孟凡杰 腾讯云容器技术专家
作为Go程序员,不仅要善于编写、设计Go程序,还要熟练地构建与维护基于Go语言的软件项目。孔令飞的这本书源自他在极客时间发布的技术专栏,专注于Go项目实践。此专栏经受住了众多读者的评议和验证,并获得了很不错的订阅量。因此,这本书的质量也就不必多说了。推荐所有想把Go语言用在实处的程序员、工程师和技术管理者阅读这本书。
——郝林 GoHackers技术社群发起人/《Go语言核心36讲》《Go 并发编程实战》作者
很多刚接触Go语言的读者都会犹豫和彷徨,不知道如何真正地实现一个产品级的项目。令飞的这本书细致入微,手把手教读者如何从零开发一个企业级Go项目,系统而有条理地把项目开发的过程和注意点娓娓道来,是一本不可多得的实战型著作。
——晁岳攀(鸟窝) 微服务框架 rpcx 创建者/《Go并发编程实战课》专栏作者
评论
还没有评论。