Docs Vault

语雀:https://www.yuque.com/konglingfei-vzag4/onex/inzksgzsnoxevy4o


上面,我介绍了 Go 项目开发中的各种规范设计,编程范式选择、代码结构设计等,这些点都很偏设计。接下来,我来再来详细给大家介绍下 Go 项目开发中如何合理的实现各个功能点。


Go 项目开发中功能概览


本小节,我们来从上层视角看下 Go 项目开发中,都有哪些核心功能需要我们去实现。下图是 Go 项目开发中需要我们去实现的功能大类:


Go 项目开发中主要包括以下 6 大类功能项:

  1. 应用管理:
  2. 基础功能:
  3. 应用功能:
  4. Web 服务:
  5. 应用测试;
  6. 应用部署。


接下来,我就来详细给你介绍这些功能点的实现。


功能构 建:应用管理


在上一节课中,我从上层视角介绍了 Go 项目管理的方式。本小节,介绍的其实是应用管理。也就是如何管理你的 Go 应用。你可以根据需要在 Makefile 中集成任何你需要的应用功能点,通常 Go 项目开发中包含了以下应用管理点:

为了便于管理应用,最佳方式是将上述管理功能都统一集成在 Makefile 中。


功能构建:基础功能


在真正开发 Go 业务代码前,我们还需要将基础功能开发好。因为 Go 的功能都是以包的形式对外提供,所以这些基础功能我们通常可以直接复用优秀的开源 Go 包,或者基于优秀的开源 Go 包进行一些封装。通常情况下,一个 Go 项目需要以下基础功能:

  1. 日志包:我们可以使用优秀的开源日志包。Go 项目开发中用的比较多的日志包是:sirupsen/logrusuber-go/zap。当然最新版本的 Go,也提供了 log/slog可用,但 log/slog功能比较简单,我还是喜欢用 zap包。很多时候,开源的日志包不能直接满足需求,因此 Go 项目开发中,大部分情况下会基于 zap包封装成项目需要的日志包;
  2. 错误包:Go 项目开发中有些项目会封装一个错误包供项目使用。错误包可以集成业务指定的错误码;
  3. 应用框架:一个 Go 项目中包含了 Go 应用,所以我们还需要开发一个可构建出二进制文件的 main 函数。我们可以自己手撸代码实现。也可以借助于优秀的 Go 包,当前用的比较多的 Go 包如下:
  4. viper:应用配置加载和读取;
  5. pflag:应用命令行选项解析和读取;
  6. cobra:快速构建一个优雅的命令行工具。
  7. 数据库:Go 项目开发中,还需要持久化存储数据。当前用的比较多的数据库有:mongo、redis、mysql、kafka、etcd 等。所以,我们还需要使用这些数据库的 Go SDK。例如:MySQL 我们可以使用 gorm 包。


功能构建:应用功能


在 Go 项目开发中,我们需要构建各种各样的功能。当前实现的最多的应用功能如下:



功能构建:Web 服务


Go 项目开发中,绝大部分情况下是开发一个 Web 服务,例如:HTTP 服务/RPC 服务,所以这里我们来看下 Web 服务通常具有哪些功能。功能列表如下:


功能构建:应用测试


代码开发完成后,还需要测试我们的项目。项目测试通常会涉及:

  1. 单元测试;
  2. 性能测试;
  3. 性能分析;
  4. 覆盖率测试;


另外,还会借助一些测试包或者测试工具,来提高编写单元测试的效率。当前用的比较多的测试包有:Testify、GoConvey。Mock 包有:sqlmock、httpmock、bouk/monkey、golang/mock。


功能构建:应用部署


应用完成开发测试之后,就需要部署到测试环境或者生产环境。我们可以采用多种不同的部署方式,例如:裸金属、虚拟机或容器化。当前应用基本都是部署在 Docker+Kubernetes 平台上。


此外,在容器化部署应用时,目前越来越多的使用 Helm 来部署应用。并使用 CICD 将整个部署流程自动化。


在部署应用时,我们需要关注应用的高可用、负载均衡(也即水平扩缩容能力)、弹性伸缩、安全等能力。


功能构建:常用的 Go 包


在 Go 项目开发中,经常会用到一些优秀的 Go 包。常用的 Go 包列表如下: