package config import ( "fmt" "github.com/knadh/koanf" "github.com/knadh/koanf/parsers/yaml" "github.com/knadh/koanf/providers/file" "github.com/zeromicro/go-zero/core/logx" "github.com/zeromicro/go-zero/zrpc" ) type ( KafkaConf struct { Addr []string // 连接地址 Topic string } KafkaProducer struct { UserCoinNotify KafkaConf // 用户金币变动通知 RankUpdate KafkaConf // 排行榜更新通知队列 RewardPool KafkaConf // 奖池通知 } // Config 配置 Config struct { zrpc.RpcServerConf Log logx.LogConf DB struct { DataSource string } // Kafka 消息队列配置 Kafka KafkaProducer } ) var k = koanf.New(".") func MustLoad(filepath string, v interface{}) { f := file.Provider(filepath) err := f.Watch(func(event interface{}, err error) { if err != nil { fmt.Printf("配置文件热重载失败: %v\n", err) return } k = koanf.New(".") err = loadAndUnmarshal(f, v) if err != nil { fmt.Printf("配置文件热重载失败: %v\n", err) return } fmt.Printf("重载配置文件: %+v\n", v) }) if err != nil { panic(err) } mustLoadAndUnmarshal(f, v) } func loadAndUnmarshal(f *file.File, v interface{}) (err error) { err = k.Load(f, yaml.Parser()) if err != nil { return } err = k.UnmarshalWithConf("", v, koanf.UnmarshalConf{Tag: "cfg"}) if err != nil { return } return } func mustLoadAndUnmarshal(f *file.File, v interface{}) { if err := loadAndUnmarshal(f, v); err != nil { panic(err) } }