主要是参考一下这个目录,对照着查漏补缺。
这是一本手把手教读者如何零基础快速掌握企业级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 本章总结