语雀:https://www.yuque.com/konglingfei-vzag4/onex/inzksgzsnoxevy4o
上面,我介绍了 Go 项目开发中的各种规范设计,编程范式选择、代码结构设计等,这些点都很偏设计。接下来,我来再来详细给大家介绍下 Go 项目开发中如何合理的实现各个功能点。
Go 项目开发中功能概览
本小节,我们来从上层视角看下 Go 项目开发中,都有哪些核心功能需要我们去实现。下图是 Go 项目开发中需要我们去实现的功能大类:
Go 项目开发中主要包括以下 6 大类功能项:
- 应用管理:
- 基础功能:
- 应用功能:
- Web 服务:
- 应用测试;
- 应用部署。
接下来,我就来详细给你介绍这些功能点的实现。
功能构 建:应用管理
在上一节课中,我从上层视角介绍了 Go 项目管理的方式。本小节,介绍的其实是应用管理。也就是如何管理你的 Go 应用。你可以根据需要在 Makefile 中集成任何你需要的应用功能点,通常 Go 项目开发中包含了以下应用管理点:
为了便于管理应用,最佳方式是将上述管理功能都统一集成在 Makefile 中。
功能构建:基础功能
在真正开发 Go 业务代码前,我们还需要将基础功能开发好。因为 Go 的功能都是以包的形式对外提供,所以这些基础功能我们通常可以直接复用优秀的开源 Go 包,或者基于优秀的开源 Go 包进行一些封装。通常情况下,一个 Go 项目需要以下基础功能:
- 日志包:我们可以使用优秀的开源日志包。Go 项目开发中用的比较多的日志包是:sirupsen/logrus、uber-go/zap。当然最新版本的 Go,也提供了 log/slog可用,但 log/slog功能比较简单,我还是喜欢用 zap包。很多时候,开源的日志包不能直接满足需求,因此 Go 项目开发中,大部分情况下会基于 zap包封装成项目需要的日志包;
- 错误包:Go 项目开发中有些项目会封装一个错误包供项目使用。错误包可以集成业务指定的错误码;
- 应用框架:一个 Go 项目中包含了 Go 应用,所以我们还需要开发一个可构建出二进制文件的 main 函数。我们可以自己手撸代码实现。也可以借助于优秀的 Go 包,当前用的比较多的 Go 包如下:
- viper:应用配置加载和读取;
- pflag:应用命令行选项解析和读取;
- cobra:快速构建一个优雅的命令行工具。
- 数据库:Go 项目开发中,还需要持久化存储数据。当前用的比较多的数据库有:mongo、redis、mysql、kafka、etcd 等。所以,我们还需要使用这些数据库的 Go SDK。例如:MySQL 我们可以使用 gorm 包。
功能构建:应用功能
在 Go 项目开发中,我们需要构建各种各样的功能。当前实现的最多的应用功能如下:
功能构建:Web 服务
Go 项目开发中,绝大部分情况下是开发一个 Web 服务,例如:HTTP 服务/RPC 服务,所以这里我们来看下 Web 服务通常具有哪些功能。功能列表如下:
功能构建:应用测试
代码开发完成后,还需要测试我们的项目。项目测试通常会涉及:
- 单元测试;
- 性能测试;
- 性能分析;
- 覆盖率测试;
另外,还会借助一些测试包或者测试工具,来提高编写单元测试的效率。当前用的比较多的测试包有:Testify、GoConvey。Mock 包有:sqlmock、httpmock、bouk/monkey、golang/mock。
功能构建:应用部署
应用完成开发测试之后,就需要部署到测试环境或者生产环境。我们可以采用多种不同的部署方式,例如:裸金属、虚拟机或容器化。当前应用基本都是部署在 Docker+Kubernetes 平台上。
此外,在容器化部署应用时,目前越来越多的使用 Helm 来部署应用。并使用 CICD 将整个部署流程自动化。
在部署应用时,我们需要关注应用的高可用、负载均衡(也即水平扩缩容能力)、弹性伸缩、安全等能力。
功能构建:常用的 Go 包
在 Go 项目开发中,经常会用到一些优秀的 Go 包。常用的 Go 包列表如下: