介绍 mamori:为 Go 语言提供的可类型化、可观测的配置与密钥管理方案
我交付过的每一个 Go 服务最终都会长出同一个器官。它起初很小:只是几个 os.Getenv 调用。接着需要从 AWS Secrets Manager 获取密钥,于是你添加了 SDK。随后有人希望在不部署的情况下轮换该密钥,于是你添加了 time.Ticker。接着该 ticker 需要加锁,因为两个 goroutine 在替换配置的同时正在读取配置。然后一个错误值溜了进来导致生产环境宕机,于是你添加了验证。接着在一次事件中,密钥出现在日志行中,现在你又得添加一个脱敏包装器。到了最后,每个仓库里都出现了一个量身定制的 ConfigManager:一个加载器、一个获取器、一个刷新循环、一个互斥锁,还有一份祈祷。它从未两次完全相同,很少得到良好的测试,也恰恰是没人愿意接手的那类代码。