Go-Zero项目需分离开发与生产配置:基础配置放greet-api.yaml,环境差异项分别写入.dev.yaml和.prod.yaml,启动时显式指定配置文件路径,并通过环境变量注入敏感字段,结构体字段需严格对齐且加校验标签。

在Go-Zero项目中,开发环境调试需启用日志、本地数据库和热重载,而生产环境必须关闭调试开关、使用加密连接串、禁用敏感信息输出——两套配置若混写在同一文件里,轻则服务启动失败,重则导致密钥泄露。
配置文件结构设计
创建统一的etc/目录,按go-zero推荐方式组织配置文件:
第一步:在项目根目录下新建etc文件夹。
第二步:创建基础配置greet-api.yaml,只放所有环境共用字段,例如Name、Port、Mode(设为dev或prod)、Log基础级别。
第三步:分别创建greet-api.dev.yaml和greet-api.prod.yaml,仅定义差异项——开发环境加Verbose: true和Database.DataSource: "root:@tcp(127.0.0.1:3306)/test",生产环境加Timeout: 5000和Redis.Password: ""(空密码表示从环境变量读取)。
【基础配置文件不能包含任何环境专属字段】,否则在生产环境加载.prod.yaml时,该字段会被覆盖为零值,且无报错提示。
启动时指定环境配置
go-zero不自动识别APP_ENV变量,必须显式传入配置路径:
方法一:命令行直接指定
开发环境运行:go run greet.go -f etc/greet-api.dev.yaml
生产环境构建后运行:./greet -f etc/greet-api.prod.yaml
方法二:通过Makefile封装(避免手误)
在Makefile中写:
run-dev: env APP_ENV=dev go run greet.go -f etc/greet-api.dev.yaml
run-prod: env APP_ENV=prod ./greet -f etc/greet-api.prod.yaml
注意:Makefile中APP_ENV=dev必须用env命令包裹,否则变量不会透传进Go进程。
敏感字段安全注入
数据库密码、JWT密钥等绝不可写入YAML文件,哪怕加了.gitignore也不保险——CI流程会拉取全部文件,Docker build上下文也可能意外包含。
方法一:启动时通过环境变量注入
在greet-api.prod.yaml中写:Database.Password: "${DB_PASSWORD}",然后启动前执行:DB_PASSWORD=xxx ./greet -f etc/greet-api.prod.yaml。
方法二:K8s中用Secret挂载
在Deployment的env字段中引用:- name: DB_PASSWORD → valueFrom: { secretKeyRef: { name: db-secret, key: password } },代码中仍用viper.GetString("database.password")读取。
【YAML中所有${xxx}占位符必须有对应环境变量,否则conf.MustLoad会直接panic退出】。
配置结构体字段校验
确保internal/config/config.go中结构体字段与YAML严格对齐:
检查Database嵌套结构体是否含DataSource、Password字段,且tag为json:"dataSource,optional"和json:"password,optional";optional表示该字段可为空,不加则YAML中缺失即报错。
给数值型字段加范围约束,例如超时时间:Timeout int64 `json:",default=2000,range=[100:30000]"`,这样若.prod.yaml里误写timeout: 0,服务启动时立即崩溃并打印错误位置。
这一步操作起来很简单,直接把字段tag补全再跑一次go run就能验证。


















