refactor(config): enable environment variable binding for database replica settings
Viper's AutomaticEnv does not bind nested keys when sections are commented out in YAML. Add explicit BindEnv calls for APP_DATABASE_REPLICA_* variables so they work when the replica section is not defined in config.yaml. Also bind optional connection pool parameters (MAX_IDLE_CONNS, MAX_OPEN_CONNS).
This commit is contained in:
@@ -22,9 +22,11 @@ database:
|
|||||||
dbname: with_you
|
dbname: with_you
|
||||||
sslmode: disable
|
sslmode: disable
|
||||||
# 读写分离配置(仅 postgres 模式生效,不配置则所有请求走主库)
|
# 读写分离配置(仅 postgres 模式生效,不配置则所有请求走主库)
|
||||||
# 单副本配置(支持环境变量):
|
# 注意:replica 字段已在 config.go 中显式 BindEnv,环境变量优先于 YAML。
|
||||||
|
# 单副本配置(推荐用环境变量覆盖,无需取消下方注释):
|
||||||
# APP_DATABASE_REPLICA_HOST, APP_DATABASE_REPLICA_PORT, APP_DATABASE_REPLICA_USER,
|
# APP_DATABASE_REPLICA_HOST, APP_DATABASE_REPLICA_PORT, APP_DATABASE_REPLICA_USER,
|
||||||
# APP_DATABASE_REPLICA_PASSWORD, APP_DATABASE_REPLICA_DBNAME, APP_DATABASE_REPLICA_SSLMODE
|
# APP_DATABASE_REPLICA_PASSWORD, APP_DATABASE_REPLICA_DBNAME, APP_DATABASE_REPLICA_SSLMODE
|
||||||
|
# APP_DATABASE_REPLICA_MAX_IDLE_CONNS, APP_DATABASE_REPLICA_MAX_OPEN_CONNS(可选,缺省回退主库连接池)
|
||||||
# replica:
|
# replica:
|
||||||
# host: replica1.internal
|
# host: replica1.internal
|
||||||
# port: 5432
|
# port: 5432
|
||||||
|
|||||||
@@ -64,6 +64,20 @@ func Load(configPath string) (*Config, error) {
|
|||||||
viper.SetDefault("database.ignore_record_not_found", true)
|
viper.SetDefault("database.ignore_record_not_found", true)
|
||||||
viper.SetDefault("database.parameterized_queries", true)
|
viper.SetDefault("database.parameterized_queries", true)
|
||||||
viper.SetDefault("database.replica_policy", "random")
|
viper.SetDefault("database.replica_policy", "random")
|
||||||
|
|
||||||
|
// 读写分离:单副本字段显式 BindEnv。
|
||||||
|
// AutomaticEnv 对 YAML 中未出现的嵌套 key(replica 段在 config.yaml 中默认被注释)
|
||||||
|
// 不会反向推导,必须逐字段 BindEnv 才能让 APP_DATABASE_REPLICA_HOST 等环境变量生效。
|
||||||
|
// 与 jpush.channel.* 处理方式一致(见下方 BindEnv 块)。
|
||||||
|
viper.BindEnv("database.replica.host", "APP_DATABASE_REPLICA_HOST")
|
||||||
|
viper.BindEnv("database.replica.port", "APP_DATABASE_REPLICA_PORT")
|
||||||
|
viper.BindEnv("database.replica.user", "APP_DATABASE_REPLICA_USER")
|
||||||
|
viper.BindEnv("database.replica.password", "APP_DATABASE_REPLICA_PASSWORD")
|
||||||
|
viper.BindEnv("database.replica.dbname", "APP_DATABASE_REPLICA_DBNAME")
|
||||||
|
viper.BindEnv("database.replica.sslmode", "APP_DATABASE_REPLICA_SSLMODE")
|
||||||
|
// 副本连接池参数(可选,留空回退到主库连接池配置,见 database.go)
|
||||||
|
viper.BindEnv("database.replica_max_idle_conns", "APP_DATABASE_REPLICA_MAX_IDLE_CONNS")
|
||||||
|
viper.BindEnv("database.replica_max_open_conns", "APP_DATABASE_REPLICA_MAX_OPEN_CONNS")
|
||||||
viper.SetDefault("redis.type", "miniredis")
|
viper.SetDefault("redis.type", "miniredis")
|
||||||
viper.SetDefault("redis.redis.host", "localhost")
|
viper.SetDefault("redis.redis.host", "localhost")
|
||||||
viper.SetDefault("redis.redis.port", 6379)
|
viper.SetDefault("redis.redis.port", 6379)
|
||||||
|
|||||||
Reference in New Issue
Block a user