主要是参考一下这个目录,对照着查漏补缺。
这是一本手把手教读者如何零基础快速掌握企业级 Go 项目全流程开发的实战性著作。
内容初稿源于极客时间上的专栏(有超过 25000 人付费学习),图书内容在专栏的基础上做了全面的更新和大量的补充。
作者是腾讯云的技术专家,有多年的企业级 Go 项目开发经验。
全书围绕一个可部署、可运行的企业级 Go 应用(附源码,可二次开发)展开,覆盖项目全生命周期的所有环节,
不仅将每个环节涉及的原理、步骤讲解得非常详细,而且把项目涉及的 Go 语言知识点全部娓娓道来。
每个知识点都朝着最佳实践方向去设计,采用了业界共识程度最高的 Go 包、Go 设计模式、Go 开发规范、Go 简洁架构等,
不仅能让读者事半功倍地掌握企业级 Go 项目的开发方法,而且能学到一线大厂的最佳实践。
本书内容翔实,篇幅较大,一共 31 章,分为六个部分:
第一部分是项目开始前的准备工作,包括贯穿全书的实战项目 IAM 的介绍与部署,以及 Go 开发环境的搭建;
第二至六部分详细讲解了项目的设计、管理、开发、测试、部署等。
包含了规范设计、文档编写、开发流程管理、功能设计与实现、项目测试、性能优化、高可用、高安全、水平扩展等方方面面。
旨在帮助读者彻底学会如何构建企业级 Go 项目,并解决 Go 项目开发所面临的各类问题。
腾讯云容器技术专家,曾就职于联想和 Red Hat,拥有多年 Go 项目开发和管理经验。
云计算技术专家,在云计算领域有非常丰富的实践经验。
Kubernetes 社区贡献者,对 Kubernetes、Docker、Serverless、微服务等技术有深入的理解。
腾讯学院特约讲师,极客时间《Go 语言项目开发实战》专栏作者,掘金《基于 Go 语言构建企业级的 RESTful API 服务》专栏作者。
第一部分 项目准备
第 1 章 Go 开发环境准备
- 1.1 机器选择
- 1.1.1 开发机选择
- 1.1.2 办公机选择
- 1.2 Windows 终端模拟器安装和配置
- 1.3 Linux 服务器申请和配置
- 1.3.1 Linux 服务器申请
- 1.3.2 登录 Linux 服务器
- 1.3.3 Linux 服务器配置
- 1.3.4 依赖安装和配置
- 1.4 Go 编译环境安装和配置
- 1.4.1 Go 编译工具安装和配置
- 1.4.2 Protobuf 编译环境安装
- 1.5 Go IDE 安装和配置
- 1.6 本章总结
第 2 章 快速部署 IAM 系统
- 2.1 为什么选择 IAM 系统作为实战项目
- 2.2 IAM 系统概述
- 2.2.1 IAM 资源授权流程
- 2.2.2 IAM 系统架构介绍
- 2.2.3 通过使用流程理解架构
- 2.3 下载 IAM 项目代码
- 2.4 安装和配置数据库
- 2.4.1 配置 scripts/install/environment.sh
- 2.4.2 安装和配置 MariaDB
- 2.4.3 安装和配置 Redis
- 2.4.4 安装和配置 MongoDB
- 2.5 安装和配置 IAM 系统
- 2.5.1 准备工作
- 2.5.2 安装和配置 iam-apiserver
- 2.5.3 安装 iamctl
- 2.5.4 安装和配置 iam-authz-server
- 2.5.5 安装和配置 iam-pump
- 2.5.6 安装和配置 iam-watcher
- 2.5.7 安装 man 文件
- 2.5.8 测试 IAM 系统是否安装成功
- 2.6 彩蛋:一键安装
- 2.7 本章总结
第二部分 项目设计
第 3 章 规范设计
- 3.1 有哪些地方需要制定规范
- 3.2 开源规范
- 3.2.1 开源协议概述
- 3.2.2 开源协议选择
- 3.2.3 开源规范有什么
- 3.2.4 开源规范详细内容
- 3.2.5 运营开源项目
- 3.3 文档规范
- 3.3.1 README 文档规范
- 3.3.2 项目文档规范
- 3.3.3 API 文档规范
- 3.4 Commit Message 规范
- 3.4.1 Commit Message 规范有哪些
- 3.4.2 与 Commit Message 相关的 3 个重要内容
- 3.4.3 Commit Message 规范自动化
- 3.5 版本规范
- 3.5.1 什么是语义化版本规范
- 3.5.2 语义化版本规范示例
- 3.5.3 如何确定版本号
- 3.6 本章总结
第 4 章 目录结构设计
- 4.1 如何规范目录
- 4.2 平铺式目录结构
- 4.3 结构化目录结构
- 4.3.1 Go 应用:主要存放前后端代码
- 4.3.2 Go 应用:主要存放测试相关的文件和代码
- 4.3.3 Go 应用:存放与应用部署相关的文件
- 4.3.4 项目管理:存放管理 Go 项目的各类文件
- 4.3.5 文档:主要存放项目的各类文档
- 4.3.6 不建议的目录
- 4.4 一些建议
- 4.5 本章总结
第 5 章 工作流设计
- 5.1 集中式工作流
- 5.2 功能分支工作流
- 5.3 Git Flow 工作流
- 5.3.1 Git Flow 的 5 种分支
- 5.3.2 Git Flow 开发流程
- 5.4 Forking 工作流
- 5.5 本章总结
第 6 章 研发流程设计
- 6.1 如何设计 Go 项目的研发流程
- 6.2 在设计研发流程时,需要关注哪些点
- 6.3 业界相对标准的研发流程
- 6.3.1 需求阶段
- 6.3.2 设计阶段
- 6.3.3 开发阶段
- 6.3.4 测试阶段
- 6.3.5 发布阶段
- 6.3.6 运营阶段
- 6.4 角色与分工
- 6.5 如何管理应用的生命周期
- 6.6 应用生命周期管理技术有哪些
- 6.7 研发模式
- 6.8 CI/CD:自动化构建和部署应用
- 6.8.1 持续集成
- 6.8.2 持续交付
- 6.8.3 持续部署
- 6.9 DevOps:研发运维一体化
- 6.9.1 AIOps:智能运维
- 6.9.2 ChatOps:聊着天就把事情给办了
- 6.9.3 GitOps:一种实现云原生的持续交付模型
- 6.9.4 NoOps:无运维
- 6.10 如何选择合适的应用生命周期管理技术
- 6.11 本章总结
第 7 章 如何写出优雅的 Go 项目
- 7.1 优雅 Go 项目实现思路
- 7.2 编写高质量的 Go 应用
- 7.2.1 代码结构
- 7.2.2 代码规范
- 7.2.3 代码质量
- 7.2.4 编程哲学
- 7.2.5 软件设计方法
- 7.3 高效管理项目
- 7.3.1 高效的开发流程
- 7.3.2 使用 Makefile 管理项目
- 7.3.3 自动生成代码
- 7.3.4 善于借助工具
- 7.3.5 对接 CI/CD
- 7.4 编写高质量的项目文档
- 7.5 本章总结
第 8 章 Go 语言设计模式?
- 8.1 创建型模式
- 8.1.1 单例模式
- 8.1.2 工厂模式
- 8.2 行为型模式
- 8.2.1 策略模式
- 8.2.2 模板模式
- 8.3 结构型模式
- 8.3.1 代理模式
- 8.3.2 选项模式
- 8.4 本章总结
第三部分 项目管理
第 9 章 如何编写 Makefile
- 9.1 规划 Makefile 要实现的功能
- 9.2 设计合理的 Makefile 结构
- 9.3 掌握 Makefile 编写技巧
- 9.3.1 善用通配符和自动变量
- 9.3.2 善用函数
- 9.3.3 依赖需要用到的工具
- 9.3.4 把常用功能放在/Makefile 中,不常用的放在分类 Makefile 中
- 9.3.5 编写可扩展的 Makefile
- 9.3.6 将所有输出存放在一个目录下,方便清理和查找
- 9.3.7 使用带层级的命名方式
- 9.3.8 做好目标拆分
- 9.3.9 设置 OPTIONS
- 9.3.10 定义环境变量
- 9.3.11 自己调用自己
- 9.4 本章总结
第 10 章 IAM 项目研发流程实战
- 10.1 开发阶段
- 10.1.1 代码开发
- 10.1.2 代码提交
- 10.2 测试阶段
- 10.3 IAM 项目的 Makefile 项目管理技巧
- 10.3.1 Makefile help 命令自动解析
- 10.3.2 在 options 中指定变量值
- 10.3.3 自动生成 CHANGELOG
- 10.3.4 自动生成版本号
- 10.3.5 保持行为一致
- 10.4 本章总结
第 11 章 静态代码检查
- 11.1 为什么选择 golangci-lint 做静态代码检查
- 11.2 golangci-lint 命令
- 11.3 golangci-lint 配置
- 11.4 如何使用 golangci-lint 进行静态代码检查
- 11.5 golangci-lint 使用技巧
- 11.6 本章总结
第 12 章 生成 Swagger API 文档
- 12.1 Swagger 介绍
- 12.2 Swagger 和 OpenAPI 的区别
- 12.3 用 go-swagger 来生成 Swagger API 文档
- 12.3.1 安装 swagger 工具
- 12.3.2 swagger 命令行工具介绍
- 12.4 如何使用 swagger 命令生成 Swagger 文档
- 12.4.1 解析注释生成 Swagger 文档
- 12.4.2 go-swagger 其他常用功能介绍
- 12.5 IAM Swagger 文档
- 12.6 本章总结
第四部分 项目开发
第 13 章 错误处理
- 13.1 错误码设计
- 13.1.1 期望错误码实现的功能
- 13.1.2 常见的错误码实现方式
- 13.1.3 错误码设计建议
- 13.1.4 业务 Code 码设计
- 13.1.5 如何设置 HTTP 状态码
- 13.2 IAM 项目错误码设计规范
- 13.2.1 错误码设计规范
- 13.2.2 错误信息规范说明
- 13.2.3 IAM API 返回值说明
- 13.3 错误包
- 13.3.1 错误包需要具有哪些功能
- 13.3.2 错误包的实现
- 13.3.3 如何记录错误
- 13.4 一个错误码的具体实现
- 13.5 错误码实际使用示例
- 13.6 本章总结
第 14 章 日志处理
- 14.1 如何设计日志包
- 14.1.1 基础功能
- 14.1.2 高级功能
- 14.1.3 可选功能
- 14.1.4 设计时需要关注的点
- 14.2 如何记录日志
- 14.2.1 在何处打印日志
- 14.2.2 在哪个日志级别打印日志
- 14.2.3 如何记录日志内容
- 14.2.4 记录日志的佳实践总结
- 14.3 拓展内容:分布式日志解决方案(EFK/ELK)
- 14.4 有哪些优秀的开源日志包
- 14.4.1 标准库 log 包
- 14.4.2 glog
- 14.4.3 logrus
- 14.4.4 zap
- 14.4.5 开源日志包选择
- 14.5 从零开始编写一个日志包
- 14.5.1 定义日志级别和日志选项
- 14.5.2 创建 Logger 及各级别日志打印方法
- 14.5.3 将日志记录到支持的输出中
- 14.5.4 自定义日志输出格式
- 14.5.5 测试日志包
- 14.6 IAM 项目日志包设计实战
- 14.7 本章总结
第 15 章 GORM ORM 应用
- 15.1 GORM 基础知识
- 15.2 通过示例学习 GORM
- 15.2.1 自动迁移表结构
- 15.2.2 插入表记录
- 15.2.3 获取符合条件的记录
- 15.2.4 更新表记录
- 15.2.5 删除表记录
- 15.2.6 获取表记录列表
- 15.3 GORM 常用操作讲解
- 15.3.1 模型定义
- 15.3.2 连接数据库
- 15.3.3 创建记录
- 15.3.4 删除记录
- 15.3.5 更新记录
- 15.3.6 查询数据
- 15.3.7 高级查询
- 15.3.8 原生 SQL
- 15.3.9 GORM 钩子
- 15.4 iam-apiserver 中的 CURD 操作
- 15.5 本章总结
第 16 章 Web 服务功能实现
- 16.1 Web 服务的核心功能
- 16.1.1 基础功能
- 16.1.2 高级功能
- 16.2 Web 框架为什么选择 Gin
- 16.3 Gin 是如何支持 Web 服务的基础功能的
- 16.3.1 HTTP/HTTPS 支持
- 16.3.2 JSON 数据格式支持
- 16.3.3 路由匹配
- 16.3.4 路由分组
- 16.3.5 一进程多服务
- 16.3.6 参数解析、参数校验、逻辑处理、返回结果
- 16.4 Gin 是如何支持 Web 服务的高级功能的
- 16.4.1 中间件
- 16.4.2 认证、RequestID、跨域
- 16.4.3 优雅关停
- 16.5 本章总结
第 17 章 IAM 应用构建
- 17.1 如何构建应用框架
- 17.2 应用构建三剑客
- 17.2.1 命令行参数解析工具:Pflag
- 17.2.2 配置解析神器:Viper
- 17.2.3 现代化的命令行框架:Cobra
- 17.3 构建应用的基础:应用的三大基本功能
- 17.4 iam-apiserver 是如何构建应用框架的
- 17.5 App 包的设计和实现
- 17.5.1 构建应用
- 17.5.2 命令行程序构建
- 17.5.3 命令行参数解析
- 17.5.4 配置文件解析
- 17.6 IAM 应用构建的优秀特性
- 17.7 构建应用的注意事项
- 17.8 本章总结
第 18 章 IAM 认证功能实现
- 18.1 认证与授权的区别
- 18.2 4 种基本的认证方式
- 18.2.1 基础认证
- 18.2.2 摘要认证
- 18.2.3 开放授权认证
- 18.2.4 令牌认证
- 18.3 基于 JWT 的 Token 认证机制实现
- 18.3.1 JWT 简介
- 18.3.2 JWT 认证流程
- 18.3.3 JWT 格式
- 18.4 如何设计 IAM 项目的认证功能
- 18.5 IAM 项目是如何实现 Basic 认证的
- 18.6 IAM 项目是如何实现 Bearer 认证的
- 18.6.1 iam-authz-server Bearer 认证实现
- 18.6.2 iam-apiserver Bearer 认证实现
- 18.7 IAM 项目认证功能设计技巧
- 18.8 本章总结
第 19 章 IAM API 服务构建
- 19.1 RESTful API 介绍
- 19.1.1 什么是 RESTful API
- 19.1.2 RESTful API 设计原则
- 19.1.3 RESTful API 示例
- 19.2 RPC API 介绍
- 19.2.1 什么是 RPC
- 19.2.2 gRPC 简介
- 19.2.3 Protocol Buffers 介绍
- 19.2.4 gRPC 示例
- 19.3 REST 与 gRPC
- 19.4 iam-apiserver 服务介绍
- 19.4.1 iam-apiserver 功能介绍
- 19.4.2 iam-apiserver 使用方法介绍
- 19.5 iam-apiserver 代码实现
- 19.5.1 iam-apiserver 配置处理
- 19.5.2 iam-apiserver 启动流程
- 19.5.3 iam-apiserver 的 RESTful API 请求处理流程
- 19.5.4 iam-apiserver 代码架构
- 19.6 iam-apiserver 服务核心功能实现讲解
- 19.6.1 与应用框架相关的特性
- 19.6.2 与编程规范相关的特性
- 19.6.3 其他特性
- 19.7 本章总结
第 20 章 IAM Authz 服务构建
- 20.1 权限基础知识介绍
- 20.1.1 权限相关术语介绍
- 20.1.2 权限模型介绍
- 20.1.3 相关开源项目
- 20.1.4 开源项目选择建议
- 20.2 iam-authz-server 的功能介绍
- 20.2.1 github.com/ory/ladon 包介绍
- 20.2.2 iam-authz-server 使用方法介绍
- 20.3 iam-authz-server 的代码实现
- 20.3.1 iam-authz-server 的配置处理
- 20.3.2 iam-authz-server 启动流程
- 20.3.3 iam-authz-server 的 RESTful API 请求处理流程
- 20.3.4 iam-authz-server 的代码架构
- 20.4 iam-authz-server 关键代码分析
- 20.4.1 资源授权
- 20.4.2 缓存设计
- 20.4.3 数据一致性
- 20.5 本章总结
第 21 章 IAM Pump 服务构建
- 21.1 数据采集方式的分类
- 21.2 数据采集系统设计
- 21.2.1 设计时需要解决的核心问题
- 21.2.2 数据上报功能设计
- 21.2.3 数据采集功能设计
- 21.2.4 数据采集应用模型
- 21.3 数据采集系统落地项目:iam-authz-server+iam-pump
- 21.3.1 iam-authz-server:数据上报设计
- 21.3.2 启动数据上报服务
- 21.3.3 异步上报授权日志
- 21.3.4 优雅关停数据上报
- 21.4 iam-pump:数据采集设计
- 21.4.1 数据采集插件定义
- 21.4.2 初始化数据采集插件
- 21.4.3 健康检查
- 21.4.4 定期消费 Redis 数据
- 21.4.5 优雅关停数据采集服务
- 21.4.6 使用分布式锁机制,避免重复消费
- 21.5 本章总结
第 22 章 分布式作业系统设计与实现
- 22.1 任务分类
- 22.2 作业系统的常见实现
- 22.3 IAM 作业系统设计与实现
- 22.3.1 IAM 作业系统实现所使用的 Go 包
- 22.3.2 IAM 作业系统特点
- 22.3.3 IAM 作业系统实现
- 22.3.4 IAM 作业系统实现解读
- 22.4 本章总结
第 23 章 IAM SDK 设计与实现
- 23.1 什么是 SDK
- 23.2 SDK 设计要点
- 23.2.1 如何给 SDK 命名
- 23.2.2 SDK 的目录结构
- 23.2.3 SDK 的设计方法
- 23.3 公有云厂商采用的 SDK 设计方式
- 23.3.1 API 层:创建客户端实例
- 23.3.2 基础层:构建并执行 HTTP 请求
- 23.4 marmotedu-sdk-go 客户端设计与创建
- 23.4.1 marmotedu-sdk-go 客户端设计
- 23.4.2 项目级别客户端创建
- 23.4.3 应用级别客户端创建
- 23.4.4 服务级别客户端创建
- 23.5 marmotedu-sdk-go 的实现
- 23.5.1 RESTClient 客户端实现
- 23.5.2 Request 模块实现
- 23.5.3 请求认证
- 23.6 本章总结
第 24 章 IAM 客户端工具构建
- 24.1 常见客户端介绍
- 24.2 大型系统客户端的特点
- 24.3 iamctl 的核心实现
- 24.3.1 iamctl 的功能
- 24.3.2 iamctl 代码结构
- 24.3.3 iamctl 命令行选项
- 24.3.4 iamctl 配置文件解析
- 24.4 iamctl 中子命令是如何构建的
- 24.4.1 如何优雅地构建一个命令
- 24.4.2 自动生成命令
- 24.4.3 命令自动补全
- 24.4.4 更友好的输出
- 24.5 iamctl 是如何调用 API 的
- 24.5.1 客户端配置文件
- 24.5.2 SDK 调用
- 24.5.3 RESTful API 调用
- 24.6 本章总结
第五部分 项目测试
第 25 章 代码测试
- 25.1 如何测试 Go 代码
- 25.2 测试命名规范
- 25.2.1 测试文件的命名规范
- 25.2.2 测试包的命名规范
- 25.2.3 测试函数的命名规范
- 25.2.4 测试变量的命名规范
- 25.3 4 种基本测试类型
- 25.3.1 单元测试
- 25.3.2 性能测试
- 25.3.3 模糊测试
- 25.3.4 示例测试
- 25.4 Go 语言其他测试类型
- 25.4.1 TestMain 函数
- 25.4.2 Mock 测试
- 25.4.3 Fake 测试
- 25.5 何时编写和执行单元测试用例
- 25.5.1 编码前:TDD 测试
- 25.5.2 编码中:增量测试
- 25.5.3 编码后:存量测试
- 25.6 测试覆盖率
- 25.7 IAM 项目测试实战
- 25.7.1 IAM 项目是如何执行测试用例的
- 25.7.2 IAM 项目测试案例分享
- 25.8 其他测试工具和包
- 25.9 本章总结
第 26 章 性能分析
- 26.1 生成性能数据文件
- 26.1.1 通过命令行生成性能数据文件
- 26.1.2 通过代码生成性能数据文件
- 26.1.3 通过 net/http/pprof 生成性能数据文件
- 26.2 生成 IAM 测试用例的性能数据
- 26.3 CPU 性能分析
- 26.4 内存性能分析
- 26.5 本章总结
第 27 章 API Server 性能测试和调优
- 27.1 API 性能测试指标
- 27.2 API 性能测试方法
- 27.2.1 Wrk 的安装方法
- 27.2.2 Wrk 的使用方法
- 27.3 API Server 性能测试实践
- 27.3.1 性能测试脚本介绍
- 27.3.2 关闭 Debug 配置选项
- 27.3.3 使用 wrktest.sh 测试 IAM API 性能
- 27.4 API Server 性能分析
- 27.5 API Server 性能测试注意事项
- 27.6 本章总结
第六部分 项目部署
第 28 章 基于虚拟机部署 IAM 系统
- 28.1 部署方案
- 28.2 Nginx 安装和配置
- 28.2.1 Nginx 功能简介
- 28.2.2 Nginx 安装和配置步骤
- 28.2.3 Nginx 常用命令
- 28.3 Keepalived 安装和配置
- 28.3.1 Keepalived 介绍
- 28.3.2 Keepalived 安装步骤
- 28.3.3 Keepalived 配置文件解析
- 28.4 部署 IAM 系统
- 28.4.1 部署 IAM 系统中的服务
- 28.4.2 配置 Nginx 作为反向代理
- 28.4.3 配置 Nginx 处理负载均衡
- 28.4.4 配置 Keepalived
- 28.5 IAM 系统安全性加固
- 28.5.1 iptables 简介
- 28.5.2 网络数据包处理流程
- 28.5.3 iptables 工具的使用
- 28.5.4 IAM 安全加固(内网不安全)
- 28.5.5 IAM 安全加固(内网安全)
- 28.6 弹性伸缩
- 28.6.1 系统扩容
- 28.6.2 系统缩容
- 28.7 本章总结
第 29 章 IAM 容器化部署
- 29.1 Docker 镜像的构建原理和方式
- 29.1.1 通过 docker commit 命令构建镜像
- 29.1.2 通过 Dockerfile 来构建镜像
- 29.1.3 其他镜像构建方式
- 29.2 编写 Dockerfile 文件
- 29.2.1 Dockerfile 指令介绍
- 29.2.2 Dockerfile 佳实践
- 29.3 编写 Kubernetes 资源定义文件
- 29.3.1 为什么选择 YAML 格式来定义 Kubernetes 资源
- 29.3.2 Kubernetes 资源定义概述
- 29.3.3 常用的 Kubernetes 资源定义
- 29.3.4 YAML 文件编写技巧
- 29.3.5 使用 Kubernetes YAML 时的一些推荐工具
- 29.4 Kubernetes 部署实战:部署准备工作
- 29.4.1 开通腾讯云容器服务镜像仓库
- 29.4.2 安装 Docker
- 29.4.3 准备一个 Kubernetes 集群
- 29.5 Kubernetes 部署实战:安装 IAM 系统
- 29.6 Kubernetes 部署实战:测试 IAM 系统
- 29.7 Kubernetes 部署实战:销毁 Serverless 集群及其资源
- 29.8 本章总结
第 30 章 Helm 应用部署
- 30.1 Helm 基础知识介绍
- 30.1.1 Helm 是什么
- 30.1.2 Helm 中的三大基本概念
- 30.1.3 我们为什么要使用 Helm
- 30.2 Helm 基本操作实战
- 30.2.1 安装 Helm
- 30.2.2 Helm 快速入门
- 30.2.3 Helm 命令
- 30.3 使用 Helm 部署 IAM 系统
- 30.3.1 制作 IAM Chart 包
- 30.3.2 IAM Chart 包部署
- 30.3.3 多环境部署 IAM 系统
- 30.4 本章总结
第 31 章 基于 GitHub Actions 的 CI 实战
- 31.1 GitHub Actions 的基础知识
- 31.1.1 GitHub Actions 的基本概念
- 31.1.2 工作流程文件介绍
- 31.2 GitHub Actions 的进阶用法
- 31.2.1 为工作流加一个 Badge 标记
- 31.2.2 构建矩阵
- 31.2.3 使用密钥
- 31.2.4 使用 Artifact 保存构建产物
- 31.3 GitHub Actions 实战
- 31.4 IAM GitHub Actions 实战
- 31.5 本章总结