GitHub.com/fly left/Высокий PR…
Простая библиотека файлов конфигурации языка go, которая автоматически сопоставляет конфигурацию YAML с объектами, аналогично файлам конфигурации spring-boot.
Он будет проходить по свойствам сущности из корневой стойки сущности, если тип — bool, string, integer, float, map[string]interface{}, []interface{},
будет основываться на теге вprofile
Значение (если оно не установлено, первая буква имени текущего свойства будет строчной) анализирует YAML, флаг или переменную среды и присваивает ее;
Если ни YAML, ни флаг, ни переменная окружения не существуют, используйте тег вprofileDefault
установить значение по умолчанию;
Если значение по умолчанию также не установлено, возвращается ошибка. Приоритет переменной по умолчанию: переменные среды > параметр флага > YAML > значение по умолчанию profileDefault,
Вы можете сделать флаг приоритетом > переменные среды, установив для envHigher значение false.
Уведомление:И тип получателя, и тип возвращаемого значения должны быть типами указателей..
Использовать под одним профилем:
eureka:
instance:
preferIpAddress: true
leaseRenewalIntervalInSeconds: 10
leaseExpirationDurationInSeconds: 30
client:
serviceUrl:
defaultZone: http://localhost:8000/eureka/
registryFetchIntervalSeconds: 10
logging:
level:
github.com/flyleft/consul-iris/pkg/config: info
github.com/flyleft/consul-iris/pkg/route: debug
type SingleEnv struct {
Eureka SingleEureka
Logging map[string]interface{} `profile:"logging.level" profileDefault:"{\"github.com/flyleft/consul-iris\":\"debug\"}"`
}
type SingleEureka struct {
PreferIpAddress bool `profile:"instance.preferIpAddress"`
LeaseRenewalIntervalInSeconds int32 `profile:"instance.leaseRenewalIntervalInSeconds"`
LeaseExpirationDurationInSeconds uint `profile:"instance.leaseExpirationDurationInSeconds"`
ServerDefaultZone string `profile:"client.serviceUrl.defaultZone" profileDefault:"http://localhost:8000/eureka/"`
RegistryFetchIntervalSeconds byte `profile:"client.registryFetchIntervalSeconds"`
}
//使用
func main() {
env, err := Profile(&SingleEnv{}, "test-single-profile.yml", true)
if err != nil {
t.Error("Profile execute error", err)
}
trueEnv := env.(*SingleEnv)
}
//通过环境变量覆盖配置,比如设置EUREKA_INSTANCE_LEASERENEWALINTERVALINSECONDS环境变量值覆盖eureka.instance.leaseRenewalIntervalInSeconds
Использовать в нескольких профилях:
profiles:
active: dev # 设置生效的profile
dev:
database:
username: root
password: root
eureka:
zone: http://localhost:8000/eureka/
fetchInterval: 10
logging:
level:
github.com/flyleft/consul-iris/pkg/config: info
github.com/flyleft/consul-iris/pkg/route: debug
production:
database:
username: production
password: production
eureka:
zone: http://localhost:8000/eureka/
fetchInterval: 10
logging:
level:
github.com/flyleft/consul-iris/pkg/config: info
github.com/flyleft/consul-iris/pkg/route: debug
type Eureka struct {
Zone string `profile:"zone"`
FetchInterval int `profile:"fetchInterval"`
}
type DataSource struct {
Host string `profile:"host" profileDefault:"localhost"`
Username string `profile:"username"`
Password string `profile:"password"`
}
type MultiEnv struct {
DataSource DataSource `profile:"database"`
Eureka Eureka
Logging map[string]interface{} `profile:"logging.level" profileDefault:"{\"github.com/flyleft/consul-iris\":\"debug\"}"`
Users []interface{} `profile:"users" profileDefault:"[\"admin\",\"test\",\"root\"]"`
}
func main() {
env, err := Profile(&MultiEnv{}, "test-multi-profile.yml", true)
if err != nil {
t.Error("Profile execute error", err)
}
trueEnv := env.(*MultiEnv)
}
//可通过环境变量DEV_EUREKA_ZONE覆盖eureka.zone的值