TOC

《企业级Go项目开发实战》目录

主要是参考一下这个目录,对照着查漏补缺。

这是一本手把手教读者如何零基础快速掌握企业级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 本章总结