构建 Go 项目最佳实践

Table of Contents

1. 语言

2. 工程实践

2.1. 项目结构

Go 目前没有一个权威性质的 Web framework(类似 Python 的 Django/Flask,Java 的 SprintBoot 等),大部分 Web 框架所做的事情 是 router + middleware 的方式。并没有提供了一个如何组织项目代码,划分模块的规范。这可能与 Go 生态圈的文化和语言的应用场景有关。

尽管如此,还是需要一个规范性的东西来约束,方便协作。评价比较高的有 project-layout,它参考了主流的 Go 开源代码的组织方式, 2019 年开始我也进行了断断续续的翻译 Go 项目布局标准。现在官方也支持 中文版 了。

实际体验下来,大体思路是没错的,但对于构建一个 Web 服务来说,还是太过宽泛了。所以我根据自己的经验,在 Go project layout 的基础上整理了一套属于自己的规范。Go 项目目录结构.

2.2. 技术选型

  • Web 框架 用 gin
  • Redis
  • logger packages,日志 level 规范(个人经验和习惯):
    • trace 仅仅用于调试日志,删掉无伤大雅
    • debug 业务预期内未导致数据变更,但希望记录下来,如 List/Get 操作
    • info 业务预期内导致了数据变更的操作,如 Create/Update/Delete 等
    • warn 非业务预期行为,但对业务本身无任何影响,如客户端参数格式、枚举值错误等
    • error 非业务预期行为,对业务造成影响,如写入数据库、cache、MQ 等失败
    • fatal 非业务预期行为,影响整体业务运行,如 DB 初始化失败
  • MongoDB 用官方的
  • MySQL,ORM 还是使用 ent 吧
  • ORM
    • entgo Facebook 开源的,好多年了,还没有到 1.0 版本,体验很好
    • GORM 国人开源的,现在是字节内部的推荐方案。跟 ent 手感区别很大,刚开始不太习惯,习惯了觉得还好。
  • http client:resty
  • 序列化:msgpack 说是比 JSON 的效率高五六倍,文档 https://msgpack.uptrace.dev/
  • 模板渲染:

2.3. 编码规范

基本上 Go programming language 已经说的挺清楚了,Effective Go 里又有补充,加之 Go 的社区命名都比较统一,日常命名应该没啥疑惑。

如果你还想单独把编码规范抽出来,可以看下 uber 的:uber go guide

2.4. 代码质量

2.5. 服务质量

3. 上线

First created: 2021-04-27 15:33:45
Last updated: 2024-06-24 Mon 14:21
Power by Emacs 29.3 (Org mode 9.6.15)