曾经我在写第一个 Go demo的时候,数据库账号密码直接写死在 main.go
里------看起来直接又高效。可当我把代码推上 GitHub,才意识到"直觉开发"是一种危险的自信。
这篇文章,是我踩坑数次后整理的一点配置管理经验。你将看到一个配置系统从无到有、从简单到可维护的演进路径。如果你正在写 Go 项目或者搭建服务,这可能正是你需要避免未来痛点的一点经验之谈。
🥲 阶段一:写死在代码里,好用但不能说
在最初的项目中,我把所有配置变量直接写进代码:
go
func main() {
dbUser := "root"
dbPass := "123456"
dbHost := "localhost"
dbPort := 3306
dbName := "demo"
// 连接数据库...
}
优点:
- 直接、无脑、复制粘贴就能跑
缺点(踩坑警告⚠️):
- 本地能跑,线上改起来很麻烦(当然这个demo并不需要部署)
- 敏感信息暴露,一不小心推上 Git
- 不同环境要改代码,改完还得重新构建
🙄 阶段二:尝试用 .env
解耦变量(但还不够)
听了学长一句话:"配置别写死,用环境变量。"我开始尝试 .env
文件:
env
DB_USER=root
DB_PASS=123456
DB_HOST=127.0.0.1
DB_PORT=3306
DB_NAME=demo
在 Go 代码里用 godotenv
读取:
go
_ = godotenv.Load(".env")
user := os.Getenv("DB_USER")
这一步的提升:
- 敏感信息从代码中抽离出来了
.env
文件可以.gitignore
,避免意外泄漏- 多环境配置只需要准备不同的
.env
文件
但仍有不足:
- 所有配置都变成了扁平字符串,层级结构?别想了
- 多模块项目中,配置名容易冲突(前缀有时候很长)
- 缺乏校验,变量没写错也没人知道
.env
是个好工具,但一旦配置多了,它就显得力不从心。
😌 阶段三:拥抱结构化的 yaml
,配置也能有"模块化"
项目逐渐复杂,微服务出现了、Redis 用上了、Kafka 跳出来了,这时候我选择上了 config.yaml
。
yaml
database:
host: 127.0.0.1
port: 3306
user: root
password: 123456
name: demo
redis:
addr: localhost:6379
读取配置,用的是老牌选手 viper
:
go
viper.SetConfigFile("config.yaml")
_ = viper.ReadInConfig()
host := viper.GetString("database.host")
这一步的变化是质的:
- 支持嵌套结构;
- 配置可读性强,维护起来舒服
- 模块解耦好,不同组件互不干扰
当然也不是没坑:
- 密码等敏感信息写在 yaml 中,很容易跟代码一起提交(翻车警告)
- 上线部署前得小心处理
结构化配置是迈向工程化的必要一步,yaml 让你告别"配置地狱"。
🚀 最佳实践:三件套组合拳 ------ .env
+ yaml
+ CLI
经历过各种"配置灾难"之后,我终于总结出一套组合拳:
敏感信息用
.env
,结构化配置用yaml
,配置路径用 CLI 参数指定。
项目结构:
bash
demo/
├── config/
│ └── config.yaml
├── .env
├── main.go
main.go 启动逻辑:
go
_ = godotenv.Load(".env")
flag.String("conf", "config/config.yaml", "path to config")
flag.Parse()
viper.SetConfigFile(*conf)
_ = viper.ReadInConfig()
上线部署时:
bash
go run . -conf config/production.yaml
部署平台(如 Docker/K8s)则负责注入 .env
对应的环境变量(虽然笔者还没试过)。
🧠 工程化方法论:配置管理的三个层次
- 集中:配置文件不能散落在各处,要有统一加载逻辑
- 分离:业务逻辑和配置解耦,敏感信息和代码隔离
- 可替换:开发、测试、生产三套配置切换自如,不改代码
最理想的状态是:你写的服务在任何一台机器上,只要有对应的配置,就能跑起来。
🧾 总结一下
阶段 | 特点 | 适用场景 |
---|---|---|
硬编码 | 快,但不可维护 | Demo、小工具 |
.env |
适合存敏感信息 | 开发、CI、部署环境 |
yaml |
结构化清晰,适合复杂配置 | 模块化服务 |
配置是一种能力,糙快猛不是长久之计,早做规划才是正解。
如果你读到这里,还没有配置好项目的启动方式,不妨花 10 分钟搞一套三件套,未来你一定会感谢现在那个清醒的你。